4.10 Python3 进阶 - 迭代器 & 生成器
>>返回主目录
源码
from typing import Iterable, Iterator
# 可迭代对象:字符串、列表、元组、字典、集合、range()、enumerate()等
print('判断字符串是否是可迭代对象:', isinstance('Python', Iterable)) # True
print('判断range函数生成的对象是否是可迭代对象:', isinstance(range(1), Iterable)) # True
print('判断字符串是否是迭代器:', isinstance('Python', Iterator)) # False
源码
# 创建迭代器:可通过__iter__()或内置函数iter()将可迭代对象创建为迭代器对象,例如:
# 将列表创建为迭代器
list_a = ['I', 'Love', 'Python']
# iter_list_a = list_a.__iter__()
iter_list_a = iter(list_a) # 同__iter__()
print('iter_list_a是可迭代对象:', isinstance(iter_list_a, Iterable))
print('iter_list_a是迭代器对象:', isinstance(iter_list_a, Iterator))
print('iter_list_a是迭代器对象:', iter_list_a)
# 访问迭代器:可通过__next__()或内置函数next()访问迭代器对象中的下一个元素或通过循环语句访问,例如:
# 打印1~5,使用for循环方式
for i in range(1, 6):
print('for循环打印1~5:', i)
print('-' * 50)
# 使用迭代器方式,理解for循环底层运行机制
iter_range = iter(range(1, 6))
while True:
try:
print('迭代器打印1~5:', next(iter_range))
except StopIteration:
break
源码
# 定义一个生成器函数
def generator(num):
print('生成器函数开始!')
n = 0
while n < num:
print('生成器返回前!', n)
yield n
n += 1
print('生成器返回后!', n)
print('生成器函数调用结束')
# return 5 # 告诉程序结束,不会返回5
gt = generator(3)
print('调用生成器返回:', gt) # 返回生成器对象,内存地址
print('第一次调用生成器next函数后:', next(gt)) # 0
print('第二次调用生成器next函数后:', next(gt)) # 1
print('第三次调用生成器next函数后:', next(gt)) # 2
# print('第四次调用生成器next函数后:', next(gt)) # 后续没有碰到yield,抛StopIteration异常
源码
# 仍然使用上例generator()函数,使用for循环遍历
gt_for = generator(3)
for g in gt_for:
print('循环调用生成器:', g)
源码
# 生成器表达式
# 求0~5的倍数
gen_double = (x * 2 for x in range(6))
print('生成器表达式返回:', gen_double) # 返回生成器对象
print('第一次调用生成器next函数后返回:', next(gen_double)) # 0
print('第二次调用生成器next函数后返回:', next(gen_double)) # 2
print('第三次调用生成器next函数后返回:', next(gen_double)) # 4
源码
# 例如,如下狗狗干饭的生成器函数:
def dog_generator(dog_name):
print('狗狗准备开吃!')
food_list = []
while True:
print('生成器返回:前!')
food = yield food_list # food = yield = 'xxx'
print(f'狗狗:{dog_name},吃了:{food}')
food_list.append(food)
print('生成器返回:后!')
dg = dog_generator('金毛')
# 强调:对于表达式形式的yield的生成器,在使用前必须先用next(g)或者g.send(None)初始化一次
print('初始化生成器:', next(dg)) # next(dg)==dg.send(None),开始运行函数体代码,next(res)==res.__next__()
print('-' * 50)
food_list_add1 = dg.send('大骨头1')
print('狗狗已经吃了:', food_list_add1)
print('-' * 50)
food_list_add2 = dg.send('小骨头1')
print('狗狗已经吃了:', food_list_add2)
print('-' * 50)
dg.close() # 关闭生成器
# food_list_add3 = dg.send('小骨头2')
# print('狗狗已经吃了:', food_list_add3)
>>返回主目录
4.10 Python3 进阶 - 迭代器 & 生成器的更多相关文章
- python3之迭代器&生成器
1.迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不 ...
- 5 Python3 函数进阶&迭代器与生成器
1.函数进阶 1.1.名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的 ...
- python基础(9)-迭代器&生成器函数&生成器进阶&推导式
迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...
- day4之装饰器进阶、生成器迭代器
装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...
- python3.7 迭代器和生成器
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议: ''' 1.迭代器协议是指:对象 ...
- python3.5-day5_迭代器_生成器_装饰器_模块
笔者QQ 360212316 迭代器&生成器 生成器: 一个函数调用返回一个迭代器,那这个函数叫做生成器,如果函数中包含yield语法,那么这个函数就会变成生成器 生成器的特点: 1.生成器必 ...
- 10、Python迭代器与生成器(iterator、for循环、generator、yield)
一.迭代器(foreach) 1.可迭代的对象 内置有__iter__方法的都叫可迭代的对象. Python内置str.list.tuple.dict.set.file都是可迭代对象. x = 1._ ...
- 列表生成式,迭代器&生成器
python3中range(10)就 是迭代器 列表生成式 #列表生成式 a=[0,1,2,3,4,5] b=[] for index,i in enumerate(a): a[index]+1 pr ...
- day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数
回顾下上次的内容 转码过程: 先decode 为 Unicode(万国码 ) 然后encode 成需要的格式 3.0 默认是Unicode 不是UTF-8 所以不需要指定 如果非要转为U ...
随机推荐
- vsftpd.conf配置文件详解
1.默认配置: 1>允许匿名用户和本地用户登陆. anonymous_enable=YES local_enable=YES 2>匿名用户使用的登陆名为ftp或anonymous,口令为空 ...
- Linux从头学02:x86中内存【段寻址】方式的来龙去脉
作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...
- 1.3.1、datetime时间-Before、After、Between
server: port: 8080 spring: application: name: gateway cloud: gateway: routes: - id: guo-system1 uri: ...
- Mysql索引降维 优化查询 提高效率
在前一篇文章中,我们已经介绍了索引.索引的优化规则等等 原文链接:Siam博客 mysql索引优化 在其中我们有引申出组合索引,多个单字段索引冲突两个知识点. 本文章主要是与后者有关联. 在原文中,我 ...
- redis学习笔记(三)——redis的命令大全总结
总结了一些redis五种存储类型的常用命令以及一些通用操作命令,不是很全,是在学习的时候将学到的做了个汇总,使用的时候可以查一下. 笔记写在表格里面了,不好粘贴.......后面的直接截图了..... ...
- ESP32构建系统 (传统 GNU Make)
概述: 一个 ESP-IDF 项目可以看作是多个不同组件的集合,ESP-IDF 可以显式地指定和配置每个组件.在构建项目的时候,构建系统会前往 ESP-IDF 目录.项目目录和用户自定义目录(可选)中 ...
- java 语言知识
1.javase 标准版主要用于桌面应用.控制台:javaee 企业版主要用于web应用:javame微缩版主要用于嵌入式. 2.jre是java程序的运行环境,包含jvm(java虚拟机).jdk是 ...
- Django基础-003 配置Django自带的后台管理,操作数据库
插入测试数据,可以自己写页面来插入数据 也可以使用Django自带的后台管理,来操作数据表 1.创建用户 python manage.py createsuperuser 2.在浏览器输入地址,进入D ...
- 结对开发_石家庄地铁查询web系统
结对开发:队友田昕可 大二上学期做过只有两号线的地铁查询系统,但是只能在控制台操作.这一次将线路加到了六条,并且要求web实现,下面简述一下设计思路和具体代码实现: 1.数据库建表 于我们自己习惯而言 ...
- 求数组的子数组之和的最大值III(循环数组)
新的要求:一维数组改成循环数组,只是涉及简单算法,只是拿了小数做测试 想法:从文件读取数组,然后新建数组,将文件读取的数组在新数组中做一下连接,成为二倍长度的数组,然后再遍历,将每次遍历的子数组的和存 ...