首页 > 编程语言 >极客编程python入门-生成器

极客编程python入门-生成器

时间:2022-11-30 20:03:31浏览次数:45  
标签:语句 10 极客 函数 generator python 生成器 yield print


generator

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。


在Python中,这种一边循环一边计算的机制,称为生成器:generator。


只要把一个列表生成式的[]改成(),就创建了一个generator:


>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>


创建​​L​​和​​g​​的区别仅在于最外层的​​[]​​和​​()​​,​​L​​是一个list,而​​g​​是一个generator


generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。


generator可以用函数来实现。

斐波拉契数列


def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a = b
b = a + b
n = n + 1
return 'done'


极客编程python入门-生成器_列表生成式


注意,赋值语句:

a, b = b, a + b

相当于:

t = (b, a + b) # t是一个tuple
a = t[0]
b = t[1]


def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'


这就是定义generator的另一种方法。如果一个函数定义中包含​​yield​​关键字,那么这个函数就不再是一个普通函数,而是一个generator函数,调用一个generator函数将返回一个generator:


最难理解的就是generator函数和普通函数的执行流程不一样。普通函数是顺序执行,遇到​​return​​语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用​​next()​​的时候执行,遇到​​yield​​语句返回,再次执行时从上次返回的​​yield​​语句处继续执行。


小结


generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。


要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。


generator函数的调用实际返回一个generator对象:


f = fib(100)    

print(f)


极客编程python入门-生成器_列表生成式_02



(练习)杨辉三角


def triangles():
L = [1]
while True:
yield L
L = [1] + [L[i] + L[i + 1] for i in range(len(L) - 1)] + [1]


# 期待输出:
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break

for t in results:
print(t)

if results == [
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1],
[1, 8, 28, 56, 70, 56, 28, 8, 1],
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
print('测试通过!')
else:
print('测试失败!')


极客编程python入门-生成器_列表生成式_03


学习别人代码。

标签:语句,10,极客,函数,generator,python,生成器,yield,print
From: https://blog.51cto.com/apple0/5900447

相关文章

  • python之路39 前端开始 各种标签
    前端前夕前端三剑客HTML网页的骨架CSS网页的样式JavaScript网页的动态1.编写服务端2.浏览器充当客户端访问服务端3.浏览器无法......
  • 力扣287(java&python)-寻找重复数(中等)
    题目:给定一个包含 n+1个整数的数组 nums,其数字都在 [1,n] 范围内(包括1和n),可知至少存在一个重复的整数。假设nums只有一个重复的整数,返回 这个重复的数......
  • Python: 括号匹配
     s1='[{(b)}][[]]'s2='[{(b}][[]]'defbrackets_match(s:str)->bool:opening_brackets='([{'closing_brackets=')]}'nexus={')':'(',......
  • Python: stack
     Astackisalineardatastructurethatstoresitemsinalast-in-first-outLIFOorfirst-in-last-outFILOmanner,Instack,anewelementisaddedatonee......
  • 10 个杀手级的 Python 自动化脚本
    重复性任务总是耗时且无聊,想一想你想要一张一张地裁剪100张照片或FetchAPI、纠正拼写和语法等工作,所有这些任务都很耗时,为什么不自动化它们呢?在今天的文章中,我将与你......
  • PYTHON 数据结构 - 列表
    1.1列表列表类似元组:可以存放多个元素(可不同类型)有顺序可重复列表是可变的,可添加,删除,排序元素1.2列表的创建#列表=[元素1,元素2,...]a=[1,2,3,4]a=[]......
  • Python高级-正则表达式-笔记
    1.re模块操作在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re1.re模块的使用过程#coding=utf-8#导入re模块importre#使用mat......
  • python中如何自己实现一个带颜色的打印
    importtimedefget_time_stamp():ct=time.time()local_time=time.localtime(ct)data_head=time.strftime("%Y-%m-%d%H:%M:%S",local_time)......
  • windows python虚拟环境创建Django项目
    为虚拟环境新建一个目录。创建一个目录将其命名为virtualenv,再在终端中切换到这个目录,先安装virtualenv如有则跳过​​​pipinstall--uservirtualenv​​可以使用如下指......
  • 如何发现Python依赖库漏洞
    因为python编程的流行,python的各种库也越来越多,但许多小伙伴可能只注意到了自己编程所要依赖的环境,但是却忽略了库的版本也有可能存在漏洞的风险,如果不及时检查和更新python......