Python 生成器和推导式

1. Python生成器

在 Python 中,生成器是一种特殊的函数,它可以用来创建迭代器,一次只产生一个值。生成器函数不同于普通函数,可以挂起其执行过程,并在需要的时候继续执行,从而实现迭代器的功能。

1.1 生成器的创建

生成器的创建很简单,只需要在函数中使用 yield 语句代替 return 语句即可。例如:

def create_generator():

yield 1

yield 2

yield 3

gen = create_generator()

print(next(gen))

print(next(gen))

print(next(gen))

上述代码定义了一个生成器函数 create_generator,用于产生 1,2,3 三个数值,然后我们用 next() 函数取得生成器函数的下一个值,最终输出 1,2,3。

生成器函数常用于迭代海量数据,如大文件处理等场景中。使用生成器,可以逐行读取文件内容,无需将整个文件全部读入内存,从而降低内存压力。

1.2 生成器的应用

除了在文件处理中常用外,生成器还可以用于实现协程,异步编程等中。例如,我们可以使用生成器实现 Fibonacci 数列的生成:

def fibonacci(limit):

a, b = 0, 1

while a < limit:

yield a

a, b = b, a + b

for i in fibonacci(100):

print(i)

上述代码定义了一个 Fibonacci 数列生成器函数 fibonacci,用于产生不超过 100 的 Fibonacci 数列。然后我们使用 for 循环逐个取得其中的值,并进行输出。在这个例子中,生成器函数用于产生无限的 Fibonacci 数列,然后 for 循环在取得前 100 个值后结束迭代。

2. 推导式

Python 列表、字典、集合都提供了推导式的写法,支持快速地生成新的序列,也可以用于过滤一个序列。

2.1 列表推导式

Python 的列表推导式可以用来方便地生成列表的语法表达式,它的基本语法是:

[expression for variable in iterable if condition]

上述表达式中:

expression:需要计算的表达式。

variable:可迭代对象中每个元素被赋值给的变量。

iterable:可迭代对象。

condition:可选,用于筛选元素的表达式。

例如,我们可以使用列表推导式快速生成一个由 1-10 的奇数构成的列表:

odd_list = [i for i in range(1, 11) if i % 2 == 1]

print(odd_list) # [1, 3, 5, 7, 9]

2.2 字典推导式

与列表推导式类似,Python 中还支持字典推导式,用来创建新字典的语法表达式。它的基本语法为:

{key_expression: value_expression for expression in iterable if condition}

上述表达式中:

key_expression:用于生成字典键的表达式。

value_expression:用于生成字典值的表达式。

expression:迭代的元素。

iterable:迭代的对象。

condition:可选,用于筛选元素的表达式。

例如,我们可以使用字典推导式快速生成一个由数字和对应的平方构成的字典:

squares = {i: i ** 2 for i in range(1, 6)}

print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

2.3 集合推导式

Python 中还支持集合推导式,用来创建新集合的语法表达式。它的基本语法为:

{expression for expression in iterable if condition}

上述表达式中:

expression:表达式。

iterable:迭代的对象。

condition:可选,用于筛选元素的表达式。

例如,我们可以使用集合推导式快速生成一个由 1-10 的偶数构成的集合:

even_set = {i for i in range(1, 11) if i % 2 == 0}

print(even_set) # {2, 4, 6, 8, 10}

综上,Python 中的生成器和推导式均是方便的语法,常用于快速生成序列和筛选元素,提高了代码的效率。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签