# -*- coding: utf-8 -*-

from datetime import datetime

from time import sleep

from urllib.parse import parse_qs

import json

def example_1():

"""

确认自己所用的Python版本

* Python3 和 Python2 不兼容

:return:

"""

pass

def example_2():

"""

遵循PEP8风格指南

* 不要通过检测长度的方法, 如 if len(somelist) == 0, 而是 if not somelist

* 引入模块时, 应使用绝对名称, 而不是相对名称,如 from bar import foo 而不是

import foo.

* 如果一定要用相对名称, 就采用明确写法 from . import foo

:return:

"""

pass

def example_3():

"""

了解bytes,str和unicode的区别

* Python3, bytes 包含原始8位值, str的实例包含Unicode字符

* Python2, str 包含原始8位值, 而Unicode的实例包含Unicode字符

* Python3的str实例 和Python的Unicode实例都没有和特定的二进制编码形式相关联

:return:

"""

pass

def example_4():

"""

用辅助函数来取代复杂的表达式

:return:

"""

my_values = parse_qs("red=5&blue=0&green=", keep_blank_values=True)

print(my_values)

# 如果键的值是空就返回0

green = my_values.get("green", [''])[0] or 0

print(green) # 输出 0

pass

def example_5():

"""

了解切割序列的方法

:return:

"""

a = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

print(a[2:]) # 输出 ['c', 'd', 'e', 'f', 'g']

def example_6():

"""

在单次切片操作内, 不要同时指定start、end 和 stride(步进值)

* 如果非要用stride, 尽量采用负值(或考虑itertools的islide方法)

:return:

"""

a = ['rad', 'orange', 'yellow', 'green', 'blue', 'purple']

odds = a[::2] # 表示从头部开始, 每两个元素选取一个, 如果是负号则是从尾部开始

events = a[1::2]

print(odds) # 偶数索引

print(events) # 奇数索引

x = b'mongoose'

y = x[::-1] # 字符反转技巧, 注意仅对ASCII字有用, UTF-8等无法奏效

print(y)

def example_7():

"""

用列表推导来取代map和filter

:return:

"""

a = [1, 2, 3, 4, 5]

print([x ** 2 for x in a]) # 列表推导表达更清晰

print(list(map(lambda x: x ** 2, a)))

even_squares = [x ** 2 for x in a if x % 2 == 0]

print(even_squares)

alt = map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, a))

print(list(alt))

def example_8():

"""

不要使用含有两个以上表达式的列表推导

* 因为难以理解

:return:

"""

pass

def example_9():

"""

用生成器表达式来改写数据量较大的列表推导

:return:

"""

value = [len(x) for x in open('leecode.py')] # 问题数据量大,内存激增

print(value)

it = (len(x) for x in open('leecode.py')) # 改用生产器, 返回可迭代对象, 但注意迭代器有状态,仅能迭代一轮

while True:

try:

x = next(it)

print(x)

except StopIteration:

break

def example_10():

"""

尽量用enumerate来取代range

* 下标和序列元素都能一次获取

:return:

"""

flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']

for i, flavor in enumerate(flavor_list, 1):

print("%d: %s" % (i + 1, flavor))

def example_11():

"""

用zip函数同时遍历两个迭代器

* 比如两个list中的元素是一对一的关系

:return:

"""

names = ['Cecilia', 'Lise', 'Marie']

letters = [len(n) for n in names]

longest_name = None

max_letters = 0

for name, count in zip(names, letters):

if count > max_letters:

longest_name = name

max_letters = count

print(longest_name)

def example_12():

"""

不要在for和while循环后面写else块

* Python可以这样做, 但是你不要这样做

:return:

"""

pass

def example_13():

"""

合理利用try/except/else/finally结构中的每个代码块

:return:

"""

UNDEFINED = object()

def divide_json(path):

handle = open(path, 'r+')

try:

data = handle.read()

op = json.load(data)

value = (op['numerator'], op['denominator'])

except ZeroDivisionError as e:

return UNDEFINED

else:

op['result'] = value

result = json.dumps(op)

handle.seek(0)

handle.write(result)

return value

finally:

handle.close()

def example_14():

"""

尽量用异常来表示特殊情况, 而不用返回None

* 容易让调用者写出错误的代码,到底是程序异常的None? 还是自己数据的不合理?

一个例子就是除法, 除数为0

* 解决办法之一: 使用元祖,一个放数据,一个放成功状态(但是调用者可以用_忽略不去检测,也是比较尴尬)

* 最好的解决就是抛异常给上一级

:return:

"""

def example_15():

"""

了解如何在闭包中使用外围作用域中的变量

* 获取闭包内的数据, 使用nonlocal关键字(Python2不支持,但是有解决)

:return:

"""

pass

def example_16():

"""

考虑用生成器来改写直接返回列表的函数

* yield 关键字

:return:

"""

def index_words_iter(text):

if text:

yield 0

for index, letter in enumerate(text):

if letter == ' ':

yield index + 1

text = 'apple pink origin'

result = list(index_words_iter(text))

print(result)

def example_17():

"""

在参数上面迭代时,要多加小心

* 问题时迭代器迭代一次

* 列表推导数据量大时, 内存激增

* 解决一: 使用lambda, 每次都能产生新的迭代器

* 最佳解决: 建立对象, 使用__iter__ 内置函数

:return:

"""

pass

def example_18():

"""

用数量可变的位置参数减少视觉杂讯

:return:

"""

def log(message, *values):

if not values:

print(message)

else:

values_str = ', '.join(str(x) for x in values)

print("%s: %s" % (message, values_str))

favorites = [7, 17, 99]

log("Favorite colors", *favorites) # 列表加上*号, Python 会把列表里的元素视为位置参数

def example_19():

"""

用关键字参数来表达可选行为

* 一个除法函数, 谁是除数? 谁是被除数?

:return:

"""

pass

def example_20():

"""

用None和文档字符串来描述具有动态默认值的参数

:return:

"""

def log(message, when=None):

"""

:param message:

:param when: datetime of when the message occurred.

Default to the present time.

:return:

"""

when = datetime.now() if when is None else when

print('%s: %s' % (when, message))

log('Hi there!')

sleep(0.1)

log('Hi again!')

def example_21():

"""

只能用以关键字形式指定的参数来确保代码清晰

:return:

"""

def safe_division(number, divisor, ignore_overflow=False, ignore_zero_division=False):

try:

return number / divisor

except OverflowError:

if ignore_overflow:

return 0

else:

raise

except ZeroDivisionError:

if ignore_zero_division:

return float("inf")

else:

raise

# 调用者可以根据自己的具体需要, 用关键字来覆盖Boolean标志的默认值, 以便跳过相关的错误

safe_division(1, 10 ** 500, ignore_overflow=True)

safe_division(1, 0, ignore_zero_division=True)

if __name__ == '__main__':

example_18()

# example_5()

# example_20()

# example_21()

effective python怎么样_【Python】《Effective Python》 读书笔记 (一)相关推荐

  1. python基础学习[python编程从入门到实践读书笔记(连载一)]

    写在前面:本文来自笔者关于<python编程从入门到实践>的读书笔记与动手实践记录. 程序员之禅 文章目录 02变量和简单数据类型 03 列表简介 04 操作列表 05 if语句 06 字 ...

  2. 《Python从入门到实践》读书笔记——第五章 if语句

    <Python从入门到实践>读书笔记--第五章 if语句 1. 一个简单示例 cars = ['audi', 'bwm', 'subaru', 'toyota']for car in ca ...

  3. 《Python从入门到实践》读书笔记——第六章 字典

    <Python从入门到实践>读书笔记--第六章 字典 1. 一个简单的字典 alien_0 = {'color': 'green', 'points': 5}print(alien_0[' ...

  4. python基础读后感_《python基础教程 》第一章 读书笔记

    python是一个简单强大的直译语言,它同样提供交互式编译环境,学起来还算有趣,在学习的过程中,同样体会了动态语言的直接与强大. 第一章 基础知识 一 运行python 在ubuntu终端输入 pyt ...

  5. python 切片_全面解读Python高级特性切片

    大家好,欢迎来到Crossin的编程教室! 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slic ...

  6. 学习python课程_想学习Python吗? 这是我们的免费4小时互动课程

    学习python课程 Python is a popular, versatile and easy-to-learn language. It's the go-to language for AI ...

  7. 2018年python薪资_最好的Python:2017和2018年至今我最喜欢的文章集

    2018年python薪资 我打算发布此收藏集 (My intention with publishing this collection) Last year I only used Medium ...

  8. python股市_如何使用python和破折号创建仪表板来主导股市

    python股市 始终关注大局 (Keep Your Eyes on the Big Picture) I've been fascinated with the stock market since ...

  9. 有趣的超短python代码_有趣的python精短程序

    python可以简单优美,也很有趣,下面是收集的例子: 1.一句话开始一个http的文件服务器: $ python -m SimpleHTTPServer Serving HTTP on 0.0.0. ...

  10. 少儿编程python教材_少儿编程|Python环境安装

    一.为什么要学Python? 小学 山东,浙江,北京地区小学已将Python内容纳入教材 高中 浙江省已将信息技术教材编程语言替换为Python 大学 计算机二级考试加入"Python 语言 ...

最新文章

  1. 【白话机器学习】算法理论+实战之EM聚类
  2. PAT_1007(中文)_素数对猜想
  3. qt pcl设置镜头初始位置_Qt中国象棋二——棋盘与棋子的绘制
  4. udhcp源码详解(二)--转
  5. 关于appium下载安装及环境配置
  6. python爬取别人qq空间相册_Python_小林的爬取QQ空间相册图片链接程序
  7. 失传万年的PS致富经典(六)
  8. Node版本管理控制器n
  9. python调整dicom窗宽窗位_【基础篇】kaggle || RSNA脑溢血金牌案例技术分享!如何使用dicom格式的数据的?...
  10. ubuntu上安装微信教程
  11. 微信小游戏马甲包过审(马甲包过包)
  12. Java查看内存使用情况
  13. 踩坑系列之 memcache的有效期
  14. 人工智能中神经网络与自然语言处理共生关系_CodingPark编程公园
  15. 闲聊javaweb之servlet
  16. python数据分析-面试题
  17. 计算机配置主要看哪些东西,买电脑主要看哪些配置
  18. 用docker搭建discuz论坛
  19. css3 只给左上,右上,左下,右下设置圆角属性
  20. 图像分形的matlab算法,基于MATLAB的图像分割算法研究

热门文章

  1. Python编写程序,生成包含20个随机数列表,然后将前十个元素升序排列,后十个元素降序排列,并输出结果。
  2. 4G LTE网络空口时延
  3. 微信小程序毕业设计开题报告_springboot音乐网站
  4. 秦皇岛达内传授零基础怎样学平面设计
  5. Spring Data JPA REST Query QueryDSL
  6. ubuntu11.10 华为无线上网卡e303s
  7. gtsam 学习十(ISAM2 理论)
  8. SuperMap Objects组件式开发
  9. python 将目下的excel全部转xml文件到指定的目录
  10. 《剑指offer》专题—算法训练 day02