Python 生成器

如何获取一个列表中元素的平方,并创建新列表

  1. for...in生成列表
L1=[1,2,3,4]
L2=[]
for i in L1:
    L2.append(i**2) 
print(L2)

  1. 列表解析生产列表
L1=[1,2,3,4]
L2=[i**2 for i in L1]
print(L2)

列表解析是Python迭代机制的一种应用,常用于实现创建新的列表。由上列可看出列表解析能够高效生产新列表。此方法要比for循环快一倍生成新列表。

列表解析的两种表达式

[expression for  iter_var in iterable]
[expression for  iter_var in iterable if cond_expr]
  1. 列表解析生产列表(满足条件)
L1=[1,2,3,4]
L2=[i**2 for i in L1 if i > 2]
print(L2)

for循环中嵌套if语句,意思是在循环中只有满足条件的元素才用于新列表的生成, 列表解析最终生成的是一个新的列表;

  1. 列表解析生产列表(两个for循环+满足条件)
L1=[1,2,3]
L2=['x','y','z']
L3=[(i,j) for i in L1 for j in L2 if j !='x']
print(L3)
  1. 列表解析生产列表(两个for循环)
L1=[1,2,3]
L2=['x','y','z']
L3=[(i,j) for i in L1 for j in L2 if j ]
print(L3)

生成器

列表解析返回对象是列表,如果列表元素很大,会占用大部分内存,效率不高,由于列表生成后,每次使用时都只用一个元素,可以将列表解析进行扩展,将列表解析表达式中的 [] 改为 () 则会生成一个生成器;

列表解析生成器

列表解析生成器两种表示

(expression for  iter_var in iterable)
(expression for  iter_var in iterable if cond_expr)
  1. 列表解析生成器

g=(i**2 for i in range(10))
print(g)

生成器表达式并不创建一个列表,只是返回一个生成器对象,调用此对象,每调用一次计算出一个元素,这种机制叫“惰性计算”或“延迟求值”

当序列过长,或每次只需要获取一个元素时,考虑使用生成器而不是列表解析;

生成器不能重新引用,要想重新引用,需要重新生成;生成器可以用于for循环中;

  1. for循环中使用生成器

for i in (i**2 for i in range(10)):print(i)

我们创建了一个generator后,基本上不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误。

生成器函数

生成器不仅可以由列表生成去扩展得到,也可以由函数生成;

  1. 使用生成器返回自然数的平方:
def gensquares(N):
    for i in range(N):
        yield i**2
for item in gensquares(5):
    print(item)

9.使用普通函数:

def gensquares(N):
    res=[]
    for i in range(N):
        res.append(i**2)
    return res
    
for item in gensquares(5):
    print(item)

由以上列子可以看出使用生成器的有点:

1.代码量少; 2.不使用生成器时,对于每次结果,都要执行res.append(i**2);

原文地址:https://www.cnblogs.com/gzyxy/p/11814339.html