Effective Python:编写高质量Python代码的59个有效方法的学习笔记



开发者很容易过度运用Python 的语法特性,从而写出那种特别复杂并且难以理解的单行表达式。
请把复杂的表达式移入辅助函数之中,如果要反复使用相同的逻辑,那就更应该这么做。
使用if/else 表达式,要比用or 或and 这样的Boolean 操作符写成的表达式更加清晰。




既有start 和end,又有stride 的切割操作,可能会令人费解。
尽量使用stride 为正数,且不带start 或end 索引的切割操作。尽量避免用负数做stride。
在同一个切片操作内,不要同时使用start、end 和stride。如果确实需要执行这种操作,那就考虑将其拆解为两条赋值语句,其中一条做范围切割,另一条做步进切割,或考虑使用内置itertools 模块中的islice。





列表推导要比内置的map 和f ilter 函数清晰,因为它无需额外编写lambda 表 达式。
列表推导可以跳过输入列表中的某些元素,如果改用map 来做,那就必须辅以f ilter 方能实现。
字典与集也支持推导表达式。




在列表推导中,最好不要使用两个以上的表达式。可以使用两个条件、两个循环或一个条件搭配一个循环。如果要写的代码比这还复杂,那就应该使用普通的if 和for 语句,并编写辅助函数(参见本书第16 条)。
要点
列表推导支持多级循环,每一级循环也支持多项条件。
超过两个表达式的列表推导是很难理解的,应该尽量避免。





当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题。
由生成器表达式所返回的迭代器,可以逐次产生输出值,从而避免了内存用量问题。
把某个生成器表达式所返回的迭代器,放在另一个生成器表达式的for 子表达式中,即可将二者组合起来。
串在一起的生成器表达式执行速度很快。




enumerate函数提供了一种精简的写法,可以在遍历迭代器时获知每个元素的索引。
尽量用enumerate 来改写那种将range 与下标访问相结合的序列遍历代码。
可以给enumerate 提供第二个参数,以指定开始计数时所用的值(默认为0)。
例如:
list1 = ["这", "是", "一个", "测试"]
 for index, item in enumerate(list1, 1):
     print index, item






Python 有种特殊语法,可在for 及while 循环的内部语句块之后紧跟一个 else 块。
只有当整个循环主体都没遇到break 语句时,循环后面的else 块才会执行。
不要在循环后面使用else 块,因为这种写法既不直观,又容易引人误解。






无论try 块是否发生异常,都可利用try/f inally 复合语句中的f inally 块来执行清理工作。
else 块可以用来缩减try 块中的代码量,并把没有发生异常时所要执行的语句与try/except 代码块隔开。
顺利运行try 块后,若想使某些操作能在f inally 块的清理代码之前执行,则可将这些操作写到else 块中







用None 这个返回值来表示特殊意义的函数,很容易使调用者犯错,因为None 和0 及空字符串之类的值,在条件表达式里都会评估为False。
函数在遇到特殊情况时,应该抛出异常,而不要返回None。调用者看到该函数的文档中所描述的异常之后,应该就会编写相应的代码来处理它们了。






nonlocal 语句清楚地表明:如果在闭包内给该变量赋值,那么修改的其实是闭包外那个作用域中的变量。这与global 语句互为补充,global 用来表示对该变量的赋值操作, 将会直接修改模块作用域里的那个变量。


然而,nonlocal 也会像全局变量那样,遭到滥用,所以,建议大家只在极其简单的函数里使用这种机制。nonlocal 的副作用很难追踪,尤其是在比较长的函数中,修饰某变量的nonlocal 语句可能和修改该变量的赋值操作离得比较远,从而导致代码更加难以理解。





对于定义在某作用域内的闭包来说,它可以引用这些作用域中的变量。
使用默认方式对闭包内的变量赋值,不会影响外围作用域中的同名变量。
在Python 3 中,程序可以在闭包内用nonlocal 语句来修饰某个名称,使该闭包能够修改外围作用域中的同名变量。




在Python 2 中,程序可以使用可变值(例如,包含单个元素的列表)来实现与nonlocal 语句相仿的机制。
除了那种比较简单的函数,尽量不要用nonlocal 语句
发布了99 篇原创文章 · 获赞 60 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/lengyuewusheng99/article/details/77362616