---恢复内容开始---

列表生成式:

 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循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是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对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

from collections import Iterator

print(isinstance(iter([]),Iterator))  #  判断一个可迭代对象是不是一个迭代器
print(isinstance(iter("adfc"), Iterator))

你可能会问,为什么listdictstr等数据类型不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Day 3-6 生成器&迭代器的更多相关文章

  1. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  2. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  3. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

  4. python 生成器 迭代器

    阅读目录 一 递归和迭代 二 什么是迭代器协议 三 python中强大的for循环机制 四 为何要有for循环 五 生成器初探 六 生成器函数 七 生成器表达式和列表解析 八 生成器总结 一 递归和迭 ...

  5. day6学python 生成器迭代器+压缩文件

    生成器迭代器+压缩文件 readme的规范 1软件定位,软件的基本功能2运行代码的方法:安装环境,启动命令3简要的使用说明4代码目录结构说明,更详细点可以说明软件的基本原理5常见问题说明 ====== ...

  6. python 基础 4.4 生成式 生成器 迭代器

    一.生成式和生成器   列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理.   #/usr/bin/python #coding=u ...

  7. 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 ...

  8. python学习之- 生成器/迭代器

    列表生成式写法: [ i*2 for i in range(10) ]也可以带函数 [ fun(i) for i in range(10) ] 生成器:一边循环一边计算的机制称为生成器.在常用函数中, ...

  9. %----format 格式化字符串---- 生成器---- 迭代器

    %方式格式化字符串 顺序传参数 o转换8进制x转换十六进制 tp1 = "i am %s" % "alex"tp2 = "i am %s age %d ...

  10. python3 生成器&迭代器

    #Author by Andy#_*_ coding:utf-8 _*_import timefrom collections import Iterable#列表生成式def func(): lis ...

随机推荐

  1. P1140 相似基因 这个和之前有一个题目特别像 dp

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  2. MySQL JDBC驱动版本与MySQL数据库版本对应关系

    前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致.查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一 ...

  3. UVA12558-Efyptian Fractions(HARD version)(迭代加深搜索)

    Problem UVA12558-Efyptian Fractions(HARD version) Accept:187  Submit:3183 Time Limit: 3000 mSec  Pro ...

  4. UVA11212-Editing a Book(迭代加深搜索)

    Problem UVA11212-Editing a Book Accept:572  Submit:4428 Time Limit: 10000 mSec  Problem Description ...

  5. 新手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 ...

  6. hive 压缩 差不多出来数据 各种压缩 数据格式

    待学习 DeprecatedLzoTextInputFormat

  7. springcloud 服务注册、反注册 AOP 拦截,实现自定义功能

    @Aspect@Component@Order(1000)public class EurekaServerAspect {private Logger logger = Logger.getLogg ...

  8. i春秋-百度杯十月场-fuzzing

    1. 打开链接,提示 show me key,抓包,传值key=1,GET请求没有用,而POST请求有返回. 2.将md5值直接拿去解密,得到key=ichunqiu105    OK,进入下一步. ...

  9. odoo 11 配置nginx反向代理

    第一步 安装nginx 和 certbot    具体步骤可以参考这篇文章的第6,7步. 第二步 配置nginx映射到odoo网站的文件,主要有2个,文件中的cloudapp.top是我们自己的域名, ...

  10. 网盘直链工具 winform版 V1.0

    软件需要.net2.0支持 win7及以上版本用户无需安装 xp用户需要安装 支持网盘:好盘 坚果云 百度云 乐视云 华为网盘 微云 新浪网盘 126disk 速度盘 乐齐盘 天空网盘 千脑网盘 可乐 ...