~~函数基础(七):生成器&迭代器~~
进击のpython
*****
生成器
上来说个这,就有点抽象了!
我们先整点活儿
宁,准备好了吗?
直接相位猛冲!
列表生成器
需求来了,老弟!我有一个数组
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
我想把列表里每个元素加一,怎么办呢?
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = []
for i in a:
b.append(i+1) print() b
还有吗?
a = [1, 2, 3, 4, 5, 6, 7, 8, 9] for index, i in enumerate(a):
a[index] += 1
print(a)
还有吗?
a = [1, 2, 3, 4, 5, 6, 7, 8, 9] a = list(map(lambda x:x+1,a))
print(a)
还有吗?
a = [1, 2, 3, 4, 5, 6, 7, 8, 9] a = [i + 1 for i in a]
print(a)
最后一种的方式就是列表生成式(是不是很像三目运算??)
生成器
生成器,比如说我要是输出1~100
怎么输出呢?
for i in range(1,101):
print(i)
这大家都知道(不知道的滚回去看基础知识去,别在这捣乱)
那有没有想过,range(1,100) 是什么呢?
在py2.x系统下,我们可以看出来
range(1,101)实际上是生成了一个从1~100的数字的列表
那我要是有个这种句子呢?
for i in range(1, 101):
if i < 20:
print(i)
可以看出来我只需要20个数字,但是range给我生成了一个带有很多元素的列表
即使里面大部分我都用不上,但是还是生成了。(while也行,别在这艮)
那就会出现一个浪费空间的问题
那我就要想了,能不能先生成一个我先用着,然后用完了再传下一个
这个东西 就是 生成器
做呢?有两种方式!
将列表推导式的中括号变成小括号
f = (x + 1 for x in range(10)) print(f) # <generator object <genexpr> at 0x05681EF0>
只是生成了生成规则,还没有产生数值
那我要怎么产生数值呢?
利用函数next()
f = (x + 1 for x in range(10)) print(next(f)) # 1
print(next(f)) # 2
print(next(f)) # 3
print(next(f)) # 4
print(next(f)) # 5
print(next(f)) # 6
如果值取完了就会报错:

要是想再使用这个生成器,那你就需要重新调用
用循环来取
这样就不会报错,会把值全都取出来
f = (x + 1 for x in range(10)) for i in f:
print(i)
函数生成器
在做函数生成器之前,我们先试试输出100以内的斐波那契数列
# 1 1 2 3 5 8 13 ... ... li = [1, 1] for i in range(2, 101):
if li[i - 2] + li[i - 1] < 101:
li.append(li[i - 2] + li[i - 1])
else:
break
print(li)
或者也可以这么写:
# 0 1 1 2 3 5 8 13 ... ... a = 0
b = 1
count = 0
while count < 20:
tep = a
a = b
b = tep + b
print(a,end=" ")
count += 1
那要是把这个东西改成函数怎么写??
那很简单啊!
# 0 1 1 2 3 5 8 13 ... ... def fib(n):
a = 0
b = 1
count = 0
while count < n:
tep = a
a = b
b = tep + b
print(a, end=" ")
count += 1
那函数生成器呢???更简单了
看到print()没有?把 print()⇨ yield()
大功告成!
# 0 1 1 2 3 5 8 13 ... ... def fib(n):
a = 0
b = 1
count = 0
while count < n:
tep = a
a = b
b = tep + b
# print(a, end=" ")
yield a
count += 1 print(fib(20))
拿到了什么结果??(<generator object fib at 0x033A1EF0>)
这是不是个生成器?(当然是!那么大个generator看不到啊)
yield 暂停 你可以把它理解成 return 但是他后面的语句还是会执行的函数没有退出
生成器是不是有 next() 函数啊,试试用 next() 打印这个结果
有啥用???
可太有用了!
你没发现这个yield将函数进行中断操作了吗?
什么意思呢?就是你可以执行着函数,然后停住他,执行点别的,再执行函数
给你个例子,自己体会!
# 0 1 1 2 3 5 8 13 ... ... def fib(n):
a = 0
b = 1
count = 0
while count < n:
tep = a
a = b
b = tep + b
# print(a, end=" ")
yield a
count += 1 f = fib(20)
print(next(f))
print(next(f))
print('-----"下面是上两个的和"-----')
print(next(f))
print(next(f))
print(next(f))
print(next(f))

这个东西还是比较抽象的,但是很重要的熬,所以建议多练习
自己试试输出一下斐波那契数列
好好看看!很重要的!!!!!!!!!!!!!!
迭代器
回想一下啊,都有什么可以用for这个方法来循环呢?
list tuple dict set str
还有什么?
嗯!上面写的生成器 genterator
那就出来了┗|`O′|┛ 嗷~~
我们把这些可以用for方法循环的对象称为可迭代对象 iterable
这个词的意思就是可以遍历,可以循环的
# 西瓜:三天之后,大家就知道什么是迭代了
# 读者:A,他是别人的老师,现在又成了你的朋友。你给翻译翻译,什么叫迭代?翻译翻译,什么叫迭代?
# A:这还用翻译,都说了。
# 读者:我让你翻译给我听,什么叫迭代?
# A:不用翻译,这就是迭代啊。
# 西瓜:难道你听不懂什么叫迭代?
# 读者:我就想让你翻译翻译,什么叫迭代!
# A:迭代嘛
# 读者:翻译出来给我听,什么他妈的叫迭代!什么他妈的叫他妈的迭代!
# A:什么他妈的叫惊喜啊?
# 西瓜:迭代就是可以用for方法循环的对象!明白了吗?
# A:这就是迭代啊
# 读者:翻译翻译 翻译翻译!
# A:迭代就是可以用for方法循环的对象!
# 读者:哈,大哥这他妈的就是迭代啊!小弟懂了
# 西瓜:好
可以被next()函数调用并不断返回下一个值的对象成为迭代器 :iterator
而 生成器都可以迭代,而且还有next()方法
所以生成器就可以约等于迭代器
*真的重要*
*必须康康*
~~函数基础(七):生成器&迭代器~~的更多相关文章
- python基础(八)生成器,迭代器,装饰器,递归
生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...
- python基础之生成器迭代器
1 生成器: 为什么要有生成器? 就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止.如果我们要创建 ...
- python基础知识7——迭代器,生成器,装饰器
迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器 ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- Python开发【第一篇】Python基础之生成器和迭代器
生成器和迭代器 1.生成器 一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator):如果函数中包含yield语法,那这个函数就会变成生成器: def func(): yield 1 ...
- python基础篇_005_迭代器和生成器
Python迭代器和生成器 1.迭代器 迭代:可以将某个数据集内的数据“一个挨着一个的取出来” for i in range(1, 10, 2): # in 后面的对象必须是一个可迭代的 print( ...
- 【笔记】Python基础四:迭代器和生成器
一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...
- py3.0第四天 函数,生成器迭代器等
1.列表生成式,迭代器&生成器 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 > ...
- 11-Python3从入门到实战—基础之生成器和迭代器
Python从入门到实战系列--目录 切片 Python提供切片(Slice)操作符用来获取列表.元组等数据中的部分元素:如,读取列表 list[m:n]:表示获取m-n区间的元素 list[m:n: ...
随机推荐
- 图像滤镜艺术---Oilpaint油画滤镜
原文:图像滤镜艺术---Oilpaint油画滤镜 Oilpaint油画滤镜 图像油画效果实际上是将图像边缘产生一种朦胧,雾化的效果,同时,将一定的边缘模糊化,这样图像整体上看去像素与像素之间 ...
- 操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)
原文:操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP) 不管是用 PHP 还是 C#, 在操作 XML 的时候我们除了一个节点一个节点去取值之外, 还有一个非常方便的表达式, 就是 ...
- 微信小程序把玩(六)模块化
原文:微信小程序把玩(六)模块化 模块化也就是将一些通用的东西抽出来放到一个文件中,通过module.exports去暴露接口.我们在最初新建项目时就有个util.js文件就是被模块化处理时间的 /* ...
- 获取UWP配置文件中的版本信息
原文:获取UWP配置文件中的版本信息 在一般的软件中,我们都会显示当前软件的版本信息.以前作者都是在发版的时候修改一下UWP的配置文件中的版本信息和软件中的版本信息.但是每次这样很麻烦,有时间忘记修改 ...
- chrome 浏览器的常用命令收录
chrome://settings(设置) chrome://extensions(扩展程序) chrome://history(历史记录) chrome://settings/clearBrowse ...
- enum 枚举一般用法 dotnet
public enum Demo { [Description("Moning描述")] Moning = , [Description("Afternoon描述&quo ...
- Android零基础入门第66节:RecyclerView点击事件处理
前面两期学习了RecyclerView的简单使用,并为其item添加了分割线.在实际运用中,无论是List还是Grid效果,基本都会伴随着一些点击操作,那么本期就来一起学习RecyclerView的点 ...
- 使用mingw编译完整Qt5的过程(使用了niXman的msys套装)good
使用mingw编译完整Qt5的过程 坛子里似乎已经有人编译出Qt5了,不过大多有问题,不是缺少opengl就是缺少openssl,还有缺少webkit的,本文提供的仍然不能说是绝对完整的,不过相对以前 ...
- Qt信号量QSemaphore(在线程里使用,结合生产者消费者的问题)
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源.acquire()函数用于获取n个资源,当 ...
- 联想笔记本进入不了BIOS的解决方法
当计算机遇到问题时,很多情况下需要进入BIOS进行解决.但很多新出的联想笔记本电脑在开机时,无论怎么疯狂的按F2,Fn+F2,F12或者Del,都无法进入BIOS,十分气人. 这种现象出现的原因是联想 ...