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 ...
随机推荐
- Keepalive介绍及工作原理
注:keepalive和Nginx和高可用没有关联. 1.什么是高可用,为什么要设计高可用? 1.两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将国称之为高可用.2.系统可用率算法 ...
- IDEA打开文件时,关闭SonarLint自动扫描
操作步骤 1 打开 Preferences mac快捷键:command+, 2 搜索 SonarLint,取消勾选Automatically trigger analysis,保存设置
- Redis 底层数据结构之String
文章参考:<Redis设计与实现>黄建宏 Redis 的 string 类型底层使用的是 SDS(动态字符串) 实现的, 具体数据结构如下: struct sdshdr { int len ...
- mqtt 集成
-- 在pom.xml导入依赖 <!-- mqtt --> <dependency> <groupId>org.springframework.boot</g ...
- uni-app app端 人脸识别
在听到人脸识别,哇塞!感觉来个个高大上的,去阿里 腾讯 看他们的人脸识别方法,官方sdk什么的. 到后来,需求确定了,拍照(照片)上传,后台去识别是不是本人,这一瞬间从天堂到地狱,放着官方那么好的方法 ...
- MySQL | MySQL5.7.* 安装
清理系统环境 清理系统环境,保证安装时没有打扰. # 查看系统是否自带 mariadb-lib rpm -qa | grep mariadb # 如果有,输出:mariadb-libs-5.5.44- ...
- IBM刀箱服务器的SW
刀箱交换机说明: 1.刀箱交换机可以看到的24个口都是ext端口,其中因为授权原因,只激活了前10个端口. 2.交换机配置中的inta端口为服务器直接连接的端口,inta1-inta14,这些都是对应 ...
- CF277E Binary Tree on Plane
CF277E Binary Tree on Plane 题目大意 给定平面上的 \(n\) 个点,定义两个点之间的距离为两点欧几里得距离,求最小二叉生成树. 题解 妙啊. 难点在于二叉的限制. 注意到 ...
- TestNG基础001
一.什么是TestNG TestNG是一个强大的测试框架,NG是指Next Generation ,被视为是Junit的升级版本 二.TestNG适用范围 Java单元测试 接口测试 web自动化测试 ...
- SpringBoot获取前端传递JSON的几种方法
一.Json对象+@RequestBody接收 var val = {id: 1, name: "小明"}; $.ajax({ url: "/getJson", ...