>>返回主目录



源码

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. Mybatis学习(1)开发环境搭建

    什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML ...

  2. leetcode TOP100 比特位计数

    338. 比特位计数 题目描述: `给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: ...

  3. kong配置upstream实现简单的负载均衡

    目录 通过konga实现 1. 配置upstream 2. 配置Service发布 3. 配置Route,匹配规则 4. 验证结果 通过 Kong Admin API实现 1. 配置upstream ...

  4. pxe+kickstart部署多个版本的Linux操作系统(下)---实践篇

        我们在企业运维环境中,难免会遇到使用多个Linux操作系统的情况,如果每天都需要安装不同版本的Linux系统的话,那么使用Kickstart只能安装一种版本的Linux系统的方法则显得有些捉襟 ...

  5. DHCP原理于配置

    DHCP原理于配置                      一.DHCP服务                       1)使用DHCP的好处                       2)DH ...

  6. yoyogo v1.7.6 增强程序优雅退出和K8s Readiness检查

    YoyoGo (Go语言框架)一个简单.轻量.快速.基于依赖注入的微服务框架( web .grpc ),支持Nacos/Consoul/Etcd/Eureka/k8s /Apollo等 . 本次更新增 ...

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

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

  8. Java的锁升级策略

    什么是锁? java中,synchronized永远都是锁定的一个对象,那么jvm是怎么判断一个对象是被锁定的呢. java的对象内存分布 Java的对象由对象头,对象体和填充空间(Padding)组 ...

  9. python之数据驱动ddt操作(方法二)

    import unittestfrom ddt import ddt,unpack,datafrom selenium import webdriverfrom selenium.webdriver. ...

  10. 如何在VeryCD中下载资源

    这个方法也是百度来的,记在这里的目的不是为了显摆,主要是担心自己大脑记不住,用的时候又要重新找方法. 操作系统:Linux Mint 17 首先,在VeryCD中看好了某个资源,比如搜索的<哈利 ...