Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
Python有着丰富精巧的功能和技巧,会让你惊叹“哇!Python这么酷”。
我们选取了一些我们很喜欢的功能并在下文中依次展示。希望你能从中学习到一些东西,并感到吃惊“我学完才知道这样写代码更整洁”。
-
生成器
-
Collections模块
-
Itertools模块
-
Packing/Unpacking
-
装饰器
-
上下文管理器
源代码在GitHub(https://github.com/CodinGame/advanced-python-features-playground )上,欢迎提出想法来改进。
生成器
生成器是产生一个值的序列的对象。它可以用作迭代器,也就是说它可以用于for语句,或者用于next函数中来得到下一个值。但是你只能迭代一次值。
可以通过一个使用yield关键字来生成值的函数创建生成器。当调用生成器函数时,将创建一个生成器对象。
yield操作符
对于简单的情况,可以使用生成器表达式创建生成器。与列表相反,值将在运行中计算,而不是一次性全部计算并存储在内存中。
生成器表达式
Collections模块
collections是标准库中实现替代容器数据类型的一个模块。
例如,一个Counter是一个集合,其中元素被存储为字典的键,而它们的计数被存储为字典的值:
计数器
defaultdict是dict的
一个子类,它允许调用时传入一个工厂函数,这个函数在键值缺失时自动生成新的值。
defaultdict
defaultdict还可用于创建一个树型数据结构。
树
Itertools模块
itertools是标准库中的一个模块,可用于创建迭代器以实现有效的循环。
例如,permutations会生成一组序列的所有可能排列:
permutations
类似地,combinations会根据所选择的项目个数n,生成一组序列中
的所有可能的n项的组合方式,使得(不同于permutations)顺序无关紧要:
combinations
itertools还包含其他实用函数,例如chain,它采用迭代方式,创建一个新的迭代器,由给定的迭代顺序返回元素形成单个序列:
chain
Packing/Unpacking
*运算符,被称为拆包或splat运算符,允许非常方便的从列表或元组到独立的变量或参数的转换,反之亦可。
扩展可迭代序列的拆包
当你的函数的参数已经在列表或元组中,可对其拆包。如果是列表你可以用*args来拆包,如果是字典就用**kwargs。
Unpacking参数
反过来也是可以的,你可以定义一个函数,将单个tuple里的所有参数和单个dict里的所有的关键字参数组包。
关键字参数
装饰器
装饰器是一个接受函数作为参数并返回函数的函数。
例如,在下面的代码中,cache函数用作装饰器来记住已经计算出的斐波那契数:
装饰器