Python语言
列表与生成式
1.名单写死了,固定了。
a=[0,1,2,3,4,5,6,7,8,9]
印刷品
2.列表生成将使代码更加简洁。
a=[]
对于范围(10):内的I
a .追加(i*3)
印刷品
3.列表和列表生成的运行结果如下:
列出运行结果:[0,1,2,3,4,5,6,7,8,9]
生成的操作结果:[0,3,6,9,12,15,18,21,24,27]
00-1010我们可以通过列表生成直接创建列表。但是由于内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表不仅会占用大量的存储空间,而且如果我们只需要访问前几个元素,那么后面大部分元素所占用的空间就会被浪费掉。
因此,如果列表元素可以按照某种算法计算,我们是否可以在循环中连续计算后续元素?这样就不需要创建一个完整的列表,节省了很多空间。在Python中,这种边循环边计算的机制称为生成器。
00-1010在一般函数中使用yield关键字可以实现最简单的生成器,然后函数就变成了生成器函数。Yield和return返回相同的值,但不同的是,当return返回时,函数状态将终止,而yield将保存当前函数的执行状态,返回后,函数将返回到之前保存的状态并继续执行。
00-1010生成器函数包含一个或多个产量。当调用生成器函数时,函数将返回一个对象,但不会立即向下执行。像__iter__()和__next__()这样的方法是自动实现的,因此我们可以通过next()方法迭代对象。一旦函数被放弃,函数将被挂起。控制权返回给调用者的局部变量及其状态会被保存,直到下一个调用函数终止,StopIteraion会自动抛出
什么是生成器
,只记住当前位置,生成器只保留一个值,下一个之后最后一个值会丢失。下一个方法只有一个,
# b # __下一个_ _()
如何创建一个生成器
著名的斐波那契数列,除了第一个和第二个数字,任何数字都可以通过将前两个数字相加得到:
1,1,2,3,5,8,13,21,34,
斐波那契序列不能通过列表生成来编写,但可以通过函数轻松打印出来:
def fib(最大):
n,a,b=0,0,1
而nmax:
打印(b)
a,b=b,a b
n=n 1
返回“完成”
f=纤维(10)
运行结果:
一个
一个
2
三
五
八
13
21
34
55
要把它变成发电机,只需把打印(b)改为Yiled B即可。
def fib(最大):
n,a,b=0,0,1
而nmax:
#打印(b)
产量b
a,b=b,a b
#a=b a=1,b=2,a=b,a=2
#b=a b b=2 2=4
n=n 1
当返回“完成”#异常时打印的消息
操作结果:使用next取值。
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
打印(f.__next__()
不能打印使用强制循环返回的下行
对于f:中的I
打印(一)
生成器函数与一般函数的不同
追溯(最近一次通话最后一次):模块中的文件' D:pythonindex.py ',第85行
打印(f.__next__()
停止迭代:完成
生成器如何节省资源?
g=fib(6)#异常处理代码
而True:
尝试:
x=下一个(g)
打印(' g: ',x)
除了停止迭代为e:
打印('生成器返回值: ',即值)
最终操作结果:
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
发电机返回值:完成
===开始循环===
0.2s内完成]
00-1010更容易使用,代码更少,内存使用更高效。例如,当创建一个列表时,所有的内存空间都被分配,生成器只在需要的时候使用它,更像是一个代表无限流的记录。如果我们想要读取和使用的内容远远超过了内存,但是我们需要处理流中的所有内容,那么生成器就是一个很好的选择,比如它可以将当前的处理状态返回给生成器,因为它可以保存状态,那么下一次直接处理就足够了。管道发生器。假设我们有快餐记录。这个记录的第四行记录的是过去五年每小时卖出的食物数量,我们需要把所有的数量加在一起,才能算出过去五年卖出的总数量。假设所有数据都是字符串,不可用的数字标记为n/a,那么我们可以用以下方式处理:
著名的斐波那契数列
。感谢阅读。欢迎在评论区发表不同意见。如有其他问题,请在评论区留言。喜欢的话,请多关注转发和支持。作者:埃里克_吕
来源:CSDN
原文:https://blog.csdn.net/qq_35976351/article/details/79680121