Python基础篇之生成器

python中的生成器平时用的较少,这也跟我的工作性质不无关系,今天记录下生成器的几种用法,督促自己在技术上不至于落后太多。

生成器,是一个用来创建迭代器的工具,简答而又强大。下面看看生成器的几种用法。

生成器函数

主要使用yield语句,每个yield 会临时暂停处理,记住当前位置执行状态(包括局部变量和挂起的 try 语句)。当该生成器恢复时,它会从离开位置继续执行(这与每次调用都从新开始的普通函数差别很大)

例:

def genNum(n):
   print("生成数字:")
   for i in range(n):
       yield i
       print("继续执行")
nums = genNum(4)
print(next(nums))
for num in nums:
   print(num)
   
运行结果:
生成数字:
0
继续执行
1
继续执行
2
继续执行
3
继续执行

上述例子中,genNum本质生成了__next__函数,因此,在使用next()函数时会调用__next__,输出0,并停止在此处,下面调用for迭代,本质也是使用了__next__函数。

生成器表达式

在列表list中使用生成器表达式

nums = [i*i for i in range(4)]
print(nums)
运行结果:
[0,1,4,9]

在元组tuple中使用生成器表达式

nums = (i for i in range(4))
print(nums)
print(next(nums))
运行结果:
   <generator object <genexpr> at 0x000001CDD6860F90>
   0

在字典dict中使用生成器表达式

dict1 = {x: '%s'%x for x in range(4)}
print(dict1)
{0: '0', 1: '1', 2: '2', 3: '3'}

总结

python中创建生成器有以上两种方式,优点代码比较简洁,缺点只能遍历一次。