Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体,适用于生成列表、字典、集合和生成器
Python 支持各种数据结构的推导式
列表推导式格式为:
[表达式 for 变量 in 列表]
[out_exp_res for out_exp in input_list]或者
[表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]
names = ['Alice', 'Bob', 'Charlie']
upper_names = [name.upper() for name in names]
#从列表names中取出每个名字(name),将这个名字转换为大写形式name.upper()
#然后将转换后的名字放入upper_names
print(upper_names)
# Output: ['ALICE', 'BOB', 'CHARLIE']
upper_names=[name.upper() for name in names if len(name) > 3]
#从列表names中取出每个名字(name),将这个名字转换为大写形式name.upper()
#然后将转换后的名字放入upper_names,但只保留长度大于3的名字
print(upper_names)
# Output: ['ALICE', 'CHARLIE']
字典推导基本格式:
{ key_expr: value_expr for value in collection }
或
{ key_expr: value_expr for value in collection if condition }
names = ['Alice', 'Bob', 'Charlie']
len_names={name:len(name) for name in names}
#从列表names中取出每个名字(name),将这个名字作为键,名字的长度作为值,放入字典len_names
print(len_names)
# Output: {'Alice': 5, 'Bob': 3, 'Charlie': 7}
len_names={name:len(name) for name in names if len(name) > 3}
#从列表names中取出每个名字(name),将这个名字作为键,名字的长度作为值,放入字典len_names
#但只保留长度大于3的名字
print(len_names)
# Output: {'Alice': 5, 'Charlie': 7}
集合推导式基本格式:
{ expression for item in Sequence }
或
{ expression for item in Sequence if conditional }
setnews = {i**2 for i in range(2,7,2)} #range(2,7,2)生成的序列为[2,4,6]
#从范围2到6(步长为2)中取出偶数i,计算i的平方,并放入集合setnews
print(setnews)
# Output: {4, 16,36}
setnews = {i**2 for i in range(2,7,2) if i%3==0} #range(2,7,2)生成的序列为[2,4,6]
#从范围2到6(步长为2)中取出偶数i,计算i的平方,并放入集合setnews,但只保留i能被3整除的数
print(setnews)
# Output: {36}
元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。
元组推导式基本格式:
(expression for item in Sequence )
或
(expression for item in Sequence if conditional )
元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象。
tuple_news = (i**2 for i in range(2,7,2)) #range(2,7,2)生成的序列为[2,4,6]
#从范围2到6(步长为2)中取出偶数i,计算i的平方,并放入元组tuple_news
print(tuple_news)
# Output: at 0x0000019460720A50>
print(tuple(tuple_news))
# Output: (4, 16, 36)
tuple_news = (i**2 for i in range(2,7,2) if i%3==0) #range(2,7,2)生成的序列为[2,4,6]
#从范围2到6(步长为2)中取出偶数i,计算i的平方,并放入元组tuple_news,但只保留i能被3整除的数
print(tuple_news)
# Output: at 0x0000019460722490>
print(tuple(tuple_news))
# Output: (36,)
list1=[1,2,3,4,5]
iter1=iter(list1)
print(iter1) #输出
print(next(iter1)) #输出 1
print(next(iter1)) #输出 2
#迭代器可用for语句遍历
list2=[6,7,8,9,10]
iter2=iter(list2)
for i in iter2:
print(i,end=" ")
# Output: 6 7 8 9 10
创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
#创建迭代器
class MyIterator:
def __init__(self,n): #初始化迭代器,传入参数n
self.n=n #保存参数n
self.i=0 #初始化变量i为0
def __iter__(self):
return self #返回迭代器对象
def __next__(self): #定义迭代器的下一个元素
if self.i
在 Python 中,使用了 yield 的函数被称为生成器(generator)
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。
然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。
调用一个生成器函数,返回的是一个迭代器对象。
def mygenerator(n):
i=0
while i
print(next(mygen)) #输出 0
print(next(mygen)) #输出 1
print(next(mygen)) #输出 2
for i in mygen: #使用for语句遍历生成器
print(i,end=" ")
# Output: 3 4
它使用 yield 语句逐步产生从 n 到 1 的倒数数字。在每次调用 yield 语句时,函数会返回当前的倒数值,并在下一次调用时从上次暂停的地方继续执行。
生成器函数的优势是它们可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成器还可以与其他迭代工具(如for循环)无缝配合使用,提供简洁和高效的迭代方式。