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 ...
随机推荐
- 并发控制--Concurrency control--乐观、悲观及方法
In information technology and computer science, especially in the fields of computer programming, op ...
- java 关于打断点
比如:前台传过来参数中文乱码,需要decode才可以使用, 判断问题. debug 在 DispatcherServlet OncePerRequestFilter 打断点, 查看前台过来的中文在哪里 ...
- [Python] 个人TIPS
1.查询当前代码路径 import os os.getcwd() 2.尝试大文件读取时,可对pandas显示设置进行调整,使之得到更为全局或者局部的细节显示 pd.options.display.ma ...
- 深度学习之从RNN到LSTM
1.循环神经网络概述 循环神经网络(RNN)和DNN,CNN不同,它能处理序列问题.常见的序列有:一段段连续的语音,一段段连续的手写文字,一条句子等等.这些序列长短不一,又比较难拆分成一个个独立的样本 ...
- Python:Day25 成员修饰符、特殊成员、反射、单例
一.成员修饰符 共有成员 私有成员,__字段名,__方法 - 无法直接访问,只能间接访问 class Foo: def __init__(self,name,age): self.name = nam ...
- js动态改变css伪类样式
首先我们来看下页面上需要实现的基本效果,如下图所示: 因此我们可以使用如下js代码来试试看,是否能使用js改变伪类?如下代码所示: $(function() { $('.listnav li').cl ...
- 原生js学习 选择dom
连bootstrap5 都抛弃jquery了,重新使用原生js来写,所以最近在学习原生js. 一.选择dom元素: id let sure=document.getElementById('sure' ...
- Mybatis学习总结(七)——调用存储过程
一.返回select结果集 1.创建存储过程 DELIMITER // DROP PROCEDURE IF EXISTS proc_queryUser; CREATE PROCEDURE proc_q ...
- 【强化学习】用pandas 与 numpy 分别实现 q-learning, saras, saras(lambda)算法
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10159331.html 特别感谢:本文的三幅图皆来自莫凡的教程 https://morvan ...
- PowerMock单元测试踩坑与总结
1.Mock是什么? 通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 现了对静态方法.构造方法.私有方法以及 Final 方法的模拟支持,对静态初始化过程的移除等强大的功能. ...