>>返回主目录



源码

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 进阶 - 迭代器 & 生成器的更多相关文章

  1. python3之迭代器&生成器

    1.迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不 ...

  2. 5 Python3 函数进阶&迭代器与生成器

    1.函数进阶 1.1.名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的 ...

  3. python基础(9)-迭代器&生成器函数&生成器进阶&推导式

    迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...

  4. day4之装饰器进阶、生成器迭代器

    装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...

  5. python3.7 迭代器和生成器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议: ''' 1.迭代器协议是指:对象 ...

  6. python3.5-day5_迭代器_生成器_装饰器_模块

    笔者QQ 360212316 迭代器&生成器 生成器: 一个函数调用返回一个迭代器,那这个函数叫做生成器,如果函数中包含yield语法,那么这个函数就会变成生成器 生成器的特点: 1.生成器必 ...

  7. 10、Python迭代器与生成器(iterator、for循环、generator、yield)

    一.迭代器(foreach) 1.可迭代的对象 内置有__iter__方法的都叫可迭代的对象. Python内置str.list.tuple.dict.set.file都是可迭代对象. x = 1._ ...

  8. 列表生成式,迭代器&生成器

    python3中range(10)就 是迭代器 列表生成式 #列表生成式 a=[0,1,2,3,4,5] b=[] for index,i in enumerate(a): a[index]+1 pr ...

  9. day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数

    回顾下上次的内容 转码过程: 先decode  为 Unicode(万国码 ) 然后encode 成需要的格式     3.0 默认是Unicode  不是UTF-8 所以不需要指定  如果非要转为U ...

随机推荐

  1. ps2020 将图片中的字清除 并且不损坏背景图

    步骤:1:使用选框工具选中要删除的字:2:选择-->色彩范围,选中字体颜色  :3.选择-->修改-->扩展:4.图片区域,右键填充--内容识别--确定: 1.使用选框工具选中要删除 ...

  2. layui 点击按钮 界面会刷新问题

    将button 改为input: <input class="layui-btn" type="button" style="border:so ...

  3. sonarqube 8.9版本配置项目访问权限

    soanrqube设置项目权限 admin->项目->要设置的项目 进行项目权限配置 选择权限 权限配置(公开,私有)如果是公司项目建议选择私有 根据项目团队成员的角色需求,进行勾选配置 ...

  4. 其他:Windows10安装自带的Linux

    1.首先我们要打开Windows功能 2.在这里把勾打上 3.然后打开 设置 --- 更新和安全 --- 针对开发人员 --- (选择)开发人员模式 --- 确定启动 就行了 4.打开PowerShe ...

  5. Git远程操作详解(clone、remote、fetch、pull、push)

    https://blog.csdn.net/u013374164/article/details/79091677 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多 ...

  6. C语言:数据类型转换 自动转换 强制转换

    数据类型转换就是将数据(变量.数值.表达式的结果等)从一种类型转换为另一种类型. 自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生.1 ...

  7. File类与常用IO流第七章——Properties集合

    Properties概述 java.util.Properties extends Hashtable<k,v> implements Map<k,v> Properties类 ...

  8. 如何热更新长缓存的 HTTP 资源

    前言 HTTP 缓存时间一直让开发者头疼.时间太短,性能不够好:时间太长,更新不及时.当遇到严重问题需紧急修复时,尽管后端文件可快速替换,但前端文件仍从本地缓存加载,导致更新长时间无法生效. 对于这个 ...

  9. 单细胞分析实录(17): 非负矩阵分解(NMF)代码演示

    本次演示使用的数据来自2017年发表于Cell的头颈鳞癌单细胞文章:Single-Cell Transcriptomic Analysis of Primary and Metastatic Tumo ...

  10. 【LeetCode】59.螺旋矩阵II

    59.螺旋矩阵II 知识点:数组: 题目描述 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 输入:n = 3 ...