【python基础】迭代器和生成器函数
1、迭代器协议:
1、迭代器协议是指:对象必须提供一个 __next__() 方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退)
2、可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义了一个__iter__()方法)
3、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
注意:
iter.ls__next__() #__next__() ---->next() __next__() 是迭代器内置函数,而next() 是python内置函数,两者效果相同
字符串、列表、元组、字典、集合等 都不是可迭代对象,但是能够被for循环,
for循环其实就是先把它们转化为可迭代对象( li.__iter__()或者iter(li) ),然后进行__next__()方法一个个取出
>>> a = iter([1,2,3,4,5])
>>> a
<list_iterator object at 0x101402630>
>>> a.__next__()
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
4
>>> a.__next__()
5
>>> a.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration >>>for i in range(a):
print(i)
>>>1
>>>2
>>>3
>>>4
>>>5
#当遇到StopIteration时停止迭代
2、生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器;
li = ['鸡蛋%s'%i for i in range(10)] #生成器表达式
print(li)
在函数中只能有一个return 返回,但是却可以有多个yield 生成器返回
def func():
print('')
print('')
yield 1
print('aaa')
yield ('bbb')
yield "success"
print('ccc')
yield "enter" fx = func()
print(fx.__next__()) # 第一次使用__next__()打印到yield 1 的位置, 1111 2222 1
print(fx.__next__()) # 第二次使用__next__()打印到yield 'bbb' 的位置, aaa bbb
print(fx.__next__()) #success
print(fx.__next__()) #ccc enter
有效利用yield生成器这个工具可以有效地节约系统资源,避免不必要的内存占用。
yield生成器每次生出一个值占用较少的内存,就像餐馆里上餐是做好一个菜上一个菜而不是把全部菜都做好了之后再上菜
"""yield i+1 每次向内存中放入一个值,占用较少的内存"""
def func1():
for i in range(100):
yield i+1 f1 = func1()
print('来了第%s个人'%(f1.__next__())) #来了第1个人
print('来了第%s个人'%(f1.__next__())) #来了第2个人
print('来了第%s个人'%(f1.__next__())) #来了第3个人 """return ret 是将生成的[1,2,3,4...100]数组直接放在内存中,耗费较多内存"""
def func2():
ret = []
for i in range(100):
ret.append(i+1)
return ret
f2 = func2()
print("来了第%s个人"%(f2[1])) #来了第2个人
yield比return占用较少内存
补充知识点:
三元表达式:
"""三元表达式"""
name = 'jt'
res = 'xiong' if name == 'jt' else 'zhang'
print(res)
列表解析:
egg_list = []
for i in range(10):
egg_list.append('鸡蛋%s'%i)
print(egg_list)
"""列表解析"""
li = ['鸡蛋%s'%i for i in range(10)]
print(li) #打印出来的结果都是:
['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
"""列表解析与三元表达式结合"""
li = ['鸡蛋%s'%i for i in range(10) if i>5]
print(li)
#打印出来的结果都是:
['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] #注意:
#li = ['鸡蛋%s'%i for i in range(10) if i>5 else i<2] #没有4元表达式 这种写法错误
【python基础】迭代器和生成器函数的更多相关文章
- python基础—迭代器、生成器
python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- python基础--迭代器、生成器、内置函数、面向对象编程
迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...
- python基础-迭代器和生成器
一.递归和迭代 1.递归:(问路示例) 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 2.迭代:简单理 ...
- python基础--迭代器、生成器
(1)迭代器 可迭代对象和迭代器的解释如下: ''' 什么是对象?Python中一切皆对象,之前我们讲过的一个变量,一个列表,一个字符串,文件句柄,函数名等等都可称作一个对象,其实一个对象就是一个实例 ...
- Python基础—迭代器、生成器(Day13)
一.迭代器 1.可迭代对象:遵循可迭代协议,内部含有__iter__方法的对象就叫做可迭代对象.(str.list.tulpe.dict.set) 查询数据类型的方法 s = 'laonanhai' ...
- python基础一 day14 生成器函数进阶
def generator(): print(123) content = yield 1 print('=======',content) print(456) arg = yield 2 '''' ...
- python基础一 day14 生成器函数进阶(1)
- python基础——迭代器
python基础——迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器 ...
- python之迭代器与生成器
python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...
随机推荐
- 【webssh】网页上的SSH终端
[webssh] ——记两天来比较痛苦的历程 广义上来说,webssh泛指一种技术可以在网页上实现一个SSH终端.从而无需Xshell之类的模拟终端工具进行SSH连接,将SSH这一比较低层的操作也从C ...
- CentOS 7 设置静态IP
cd /etc/sysconfig/network-scripts/ sudo vi ifcfg-eno16777736 BOOTPROTO=static #dhcp改为static(修改) IPAD ...
- Guava学习笔记(一):Maven
<dependencies> <dependency> <groupId>com.google.guava</groupId> <artifact ...
- [Bayes] Latent Gaussian Process Models
比较难理解,通过做题来入门. 目的:简单的了解下相关概念. 基础 热身 目的:找x到y的映射关系. 假设:Q latent functions {fi} fj 作为先验,跟x没什么直接关系,x只是作为 ...
- Linux 更新vim
https://blog.csdn.net/linuxnews/article/details/52938583 https://blog.csdn.net/nzyalj/article/detail ...
- fclose函数无响应
现象:win32程序在退出时无响应,当一步步跟踪代码时走到fclose. 原因:打开文件在一个线程中,写文件时在另一个线程,在open和write文件时均正常,只有在fclose时出现无响应. 解决: ...
- 一、在windows环境下修改pip镜像源的方法(以python3为例)
在windows环境下修改pip镜像源的方法(以python3为例) 1.在windows文件管理器中,输入 %APPDATA% 2.会定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文 ...
- Ubuntu将网卡名称eno160改为eth0并且设置静态IP
修改配置文件/etc/default/grub GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0" 设置生效 update-grub ...
- synchronized 同步代码块,售票问题
package cn.ljs.FristSync; public class SalerDemo extends Thread { static int tickets = 1000; String ...
- AngularJs $watch监听模型变化
$watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEquality); 举个栗子 ...