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 ...
随机推荐
- java的回调
java的回调 1,明确什么是回调方法 2,采用接口来实现回调 java同步回调 一个类实现了接口,将他传递给另一个类,在另一个类调用接口中方法 public class Bar implements ...
- nginx作为负载均衡服务器,tomcat作为应用服务器
1 如果想用一台主机,能够部署多个站点,并且访问每个站点都要求是在80端口,可以采用nginx+tomcat的方式 需要注意的是,tomcat一定不要监听80端口. 可以将静态资源配置在nginx ...
- 100Mbps和100Mb/s有什么不同
100Mbps 和 100Mb/s 有什么不同 Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写 传输速率是指设备的的数据交换能力,也叫“带宽”,单位是Mbps ...
- pytorch visdom可视化工具学习—1—详细使用-2-plotting绘图
3)plotting绘图 我们已经包装了几种常见的plot类型,以便轻松创建基本的可视化.这些可视化是由Plotly驱动的. Visdom支持下列API.由 Plotly 提供可视化支持. vis.s ...
- Linux常用命令全称
Linux常用命令全称 pwd:print work directory 打印当前目录 显示出当前工作目录的绝对路径 ps: process status(进程状态,任务管理器) 常用参数: ...
- Java IO(五)——字符流进阶及BufferedWriter、BufferedReader
一.字符流和字节流的区别 拿一下上一篇文章的例子: package com.demo.io; import java.io.File; import java.io.FileReader; impor ...
- D. Artsem and Saunders
一个变换题 给定f(x),[1,n]->[1,n] 构造g(x),h(x)满足: g(h(x))=x [1,n]->[1,m] h(g(x))=f(x) [1,m]->[1,n] 根 ...
- BZOJ 5306 [HAOI2018] 染色
BZOJ 5306 [HAOI2018] 染色 首先,求出$N$个位置,出现次数恰好为$S$的颜色至少有$K$种. 方案数显然为$a_i=\frac{n!\times (m-i)^{m-i\times ...
- MySQL 数据库规范--调优篇(终结篇)
前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MyS ...
- 我的微信小程序第一篇(入门)
前言 微信小程序出来已经有一段时间了,已经有很多大牛都写过相关教程了,那么我为啥还要写这篇文章呢?其实仅仅是个人对微信开发的一个兴趣吧,觉得是个很有意思的事情,后面有时间可能会发更多关于小程序的文章, ...