Day 3-6 生成器&迭代器
---恢复内容开始---
列表生成式:
list = [i*i for i in range(20)] # 这就是一个列表生成式
print(list)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
list1 = [i if i < 8 else i*i for i in range(10,20)] # 可以进行三元运算.
print(list1)
# [110, 132, 156, 182, 210, 240, 272, 306, 342, 380]
生成器:在Python中,这种一边循环一边计算的机制,称为生成器:generator。
特性:
1.只能往后面生成,不能返回到原来的值
2.超过生成范围后,会停止生成,并报错。
生成器的创建方式:
1.通过列表生成式来创建 (i for i in range(100)
2.通过函数来创建.
a = [i for i in range(10000)] # 列表生成式
a2 = (i for i in range(10000)) # 这个就是一个生成器.但是怎么取数据呢?
print(a2) # 我们print(a2),发现返回的是一个内存地址.那我们可以用next(a2)的方法来取数据. # 以下代码是在交互模式下进行的 a2 = (i for i in range(1000))
next(a2)
0
next(a2)
1
next(a2)
2
next(a2)
3
a3 = (i for i in range(5)) next(a3)
4
next(a3)
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration #我们手动调用的时候,调到最后一个的时候,再往下调就会出错.可以用for循环调用.就不会报错了
for i in a3:
print(i)
python2中 range=list
xrange = 生成器
python3 range =生成器
没有xrange
yield:
yield 和 return区别:
yield 返回数据,并冻结当前的执行过程。
return 返回并终止函数。
当调用next的时候,唤醒冻结的函数执行过程。直到遇到下一次yield。
函数有了yield之后:
1.函数名加()就就得到了生成器。
2.return 在生成器里,代表生成器终止,直接报错。
def fblq(num):
n, a, b = 0, 0, 1
while n < num:
print('我在yield之前.')
yield b #把函数的执行过程冻结在这一步,并把b返回给外面的next().
print(b)
a, b = b, a+b
n +=1
else:
return 0 f = fblq(15)
next(f)
next(f)
next(f)
next(f)
# 有yield,函数调用时,不会执行。只是生成了一个生成器对象。 # 我在yield之前.
#
# 我在yield之前.
#
# 我在yield之前.
#
# 我在yield之前.
# 函数的方式创建生成器 def range1(n):
count = 0
while count <n:
print(count)
count +=1
yield count # 返回数据并冻结当前的执行状态. new = range1(10)
next(new)
next(new)
14 new.__next__() # 和next(new)一样
Send方法:
def range1(n):
count = 0
while count <n:
print(count)
count +=1
singe = yield count # 返回数据并冻结当前的执行状态.
if singe == "stop": # 当接收的信号是stop时,就退出循环.
break new = range1(100) next(new)
next(new)
new.__next__()
new.send("stop") #send 唤醒生成器继续执行并发送一个信号.next只唤醒生成器继续执行
迭代器:
可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
判断一个对象是否是一个可迭代对象:
from collections import Iterable
li = [1,2,3,4,5,6,7,8,9,0]
print(isinstance(li,Iterable)) # 判断一个对象是否是可迭代对象.是返回Trure,否返回False
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
生成器可以用for和next来取值.可迭代对象只能用for进行迭代取值.
判断一个对象是否是Iterator对象:
from collections import Iterator print(isinstance([],Iterator)) # 判断一个可迭代对象是不是一个迭代器
print(isinstance((i for i in range(100)), Iterator)) # 目前只有生成器是迭代器.迭代器的一个重要的标志就是可以next
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
from collections import Iterator print(isinstance(iter([]),Iterator)) # 判断一个可迭代对象是不是一个迭代器
print(isinstance(iter("adfc"), Iterator))
你可能会问,为什么list、dict、str等数据类型不是Iterator?
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
小结
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Day 3-6 生成器&迭代器的更多相关文章
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
- python 生成器 迭代器
阅读目录 一 递归和迭代 二 什么是迭代器协议 三 python中强大的for循环机制 四 为何要有for循环 五 生成器初探 六 生成器函数 七 生成器表达式和列表解析 八 生成器总结 一 递归和迭 ...
- day6学python 生成器迭代器+压缩文件
生成器迭代器+压缩文件 readme的规范 1软件定位,软件的基本功能2运行代码的方法:安装环境,启动命令3简要的使用说明4代码目录结构说明,更详细点可以说明软件的基本原理5常见问题说明 ====== ...
- python 基础 4.4 生成式 生成器 迭代器
一.生成式和生成器 列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理. #/usr/bin/python #coding=u ...
- PYDay10&11&12&13-常用模块:time|datetime|os|sys|pickle|json|xml|shutil|logging|paramiko、configparser、字符串格式化、py自动全局变量、生成器迭代器
1.py文件自动创建的全局变量 print(vars()) 返回值:{'__name__': '__main__', '__package__': None, '__loader__': <_f ...
- python学习之- 生成器/迭代器
列表生成式写法: [ i*2 for i in range(10) ]也可以带函数 [ fun(i) for i in range(10) ] 生成器:一边循环一边计算的机制称为生成器.在常用函数中, ...
- %----format 格式化字符串---- 生成器---- 迭代器
%方式格式化字符串 顺序传参数 o转换8进制x转换十六进制 tp1 = "i am %s" % "alex"tp2 = "i am %s age %d ...
- python3 生成器&迭代器
#Author by Andy#_*_ coding:utf-8 _*_import timefrom collections import Iterable#列表生成式def func(): lis ...
随机推荐
- P1140 相似基因 这个和之前有一个题目特别像 dp
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- MySQL JDBC驱动版本与MySQL数据库版本对应关系
前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致.查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一 ...
- UVA12558-Efyptian Fractions(HARD version)(迭代加深搜索)
Problem UVA12558-Efyptian Fractions(HARD version) Accept:187 Submit:3183 Time Limit: 3000 mSec Pro ...
- UVA11212-Editing a Book(迭代加深搜索)
Problem UVA11212-Editing a Book Accept:572 Submit:4428 Time Limit: 10000 mSec Problem Description ...
- 新手PHP连接MySQL数据库出问题(Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES))
我用的环境是wampServer集成的软件包 在php连接MySQL数据库的时候老是出现这个问题Warning: mysqli_connect(): (HY000/1045): Access deni ...
- hive 压缩 差不多出来数据 各种压缩 数据格式
待学习 DeprecatedLzoTextInputFormat
- springcloud 服务注册、反注册 AOP 拦截,实现自定义功能
@Aspect@Component@Order(1000)public class EurekaServerAspect {private Logger logger = Logger.getLogg ...
- i春秋-百度杯十月场-fuzzing
1. 打开链接,提示 show me key,抓包,传值key=1,GET请求没有用,而POST请求有返回. 2.将md5值直接拿去解密,得到key=ichunqiu105 OK,进入下一步. ...
- odoo 11 配置nginx反向代理
第一步 安装nginx 和 certbot 具体步骤可以参考这篇文章的第6,7步. 第二步 配置nginx映射到odoo网站的文件,主要有2个,文件中的cloudapp.top是我们自己的域名, ...
- 网盘直链工具 winform版 V1.0
软件需要.net2.0支持 win7及以上版本用户无需安装 xp用户需要安装 支持网盘:好盘 坚果云 百度云 乐视云 华为网盘 微云 新浪网盘 126disk 速度盘 乐齐盘 天空网盘 千脑网盘 可乐 ...