Py学习  »  Python

其他语言无法比拟的6个Python特性

Python程序员 • 6 年前 • 648 次点击  

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函数用作装饰器来记住已经计算出的斐波那契数:

装饰器

functools模块提供了几个装饰器,例如lru_cache,它可以实现我们刚刚做的:存储。当使用相同的参数调用给定的函数时,它可以保存最近的调用来节省时间:

Iru_cache

上下文管理器

上下文管理器主要用于正确管理资源。上下文管理器最常用的用途是通过语句with open("workfile", "r") as f:打开文件。然而,大多数开发人员不知道其内部是如何运作的,也不知道如何自己创建。

实际上,一个上下文管理器只是一个实现方法__enter__和__exit__的类。

上下文管理器

简单使用时,也可以使用带有yield关键字的生成器函数,也可使用@contextmanager装饰器。

使用@contextmanager的上下文管理器

希望您喜欢我们在Python 3中选择实现的这几个最佳功能,请在论坛或Github上踊跃分享您的反馈:)


英文原文:https://tech.io/playgrounds/500/advanced-python-features/content/advanced-python-features
译者:Chara



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/Eg7od6rHhW
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2660
 
648 次点击