【python之路29】python生成器generator与迭代器
补充:2020年3月1日
一、迭代器--补充
li = [11,22,33]
bol = "__iter__" in dir(li)
print(bol) #如果__iter__在list功能里面表示li是可迭代的 #li是可迭代的,但li不是迭代器
it = li.__iter__()
print(it) #<list_iterator object at 0x0000026F5CFFEA58>,则it是个迭代器
#print(it.__next__()) #迭代器可以用it.__next__()一个一个的按顺序取值 #迭代器的内部取值原理
while True:
try:
print(it.__next__())
except StopIteration:
break #总结:可迭代的对象不一定是迭代器,例如list,单迭代器一定是可迭代的
二、生成器---补充
生成器,可以取迭代循环,实质上生成器是迭代器
send(1) 的用法与__next__()用法基本一样,唯一的区别是,先发送一个值给上一个yield然后再向下执行:
def func():
print('11')
aa = yield 1
print(aa)
print('22')
bb = yield 2
print(bb)
print('33')
yield 3 gen = func() # 运行后gen是生成器
gen.__next__()
gen.send("aa")
gen.send("bb")
# 运行结果:
# 11
# aa
# 22
# bb
#
一、python生成器
python生成器原理:
只要函数中存在yield,则函数就变为生成器函数
#!usr/bin/env python
# -*- coding:utf-8 -*- def xrange():
print('')
yield 1
print('')
yield 2
print('')
yield 3 r = xrange() #不执行,产生一个生成器,注意xrange不是生成器,r才是生成器
print(r) #<generator object f1 at 0x0000017D4A1D1CA8> re = r.__next__()
print(re) #打印输出11 1,生成器执行完yield后暂停执行,当再次执行__next__()时,从上一个yield后面继续执行
re = r.__next__()
print(re) #打印输出11 1
re = r.__next__()
print(re) #打印输出11 1
python2.7中xrange的原理
#!usr/bin/env python
# -*- coding:utf-8 -*-
def xxrange(n):
num = 0
while True:
if num == 5:
return
yield num
num += 1 r = xxrange(5)
re1 = r.__next__()
re2 = r.__next__()
re3 = r.__next__()
re4 = r.__next__()
re5 = r.__next__()
print(re1,re2,re3,re4,re5) #打印0 1 2 3 4
2.7版本xrange完全实现:
#!/ufr/bin/env python
# -*- coding:utf-8 -*- def xxrange(n1,n2=None):
if n2 is None:
n = 0
while n < n1:
yield n
n = n + 1
else:
n = n1
while n1 <= n < n2:
yield n
n = n + 1 #bb = xxrange(5)
for i in xxrange(1,5):
print(i)
1、迭代器
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
>>> a = iter([1,2,3,4,5])>>> a<list_iterator object at 0x101402630>>>> a.__next__()1>>> a.__next__()2>>> a.__next__()3>>> a.__next__()4>>> a.__next__()5>>> a.__next__()Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration |
2、生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器;
|
1
2
3
4
5
|
def func(): yield 1 yield 2 yield 3 yield 4 |
上述代码中:func是函数称为生成器,当执行此函数func()时会得到一个迭代器。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> temp = func()>>> temp.__next__()1>>> temp.__next__()2>>> temp.__next__()3>>> temp.__next__()4>>> temp.__next__()Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration |
3、实例
a、利用生成器自定义range
|
1
2
3
4
5
6
7
8
|
def nrange(num): temp = -1 while True: temp = temp + 1 if temp >= num: return else: yield temp |
b、利用迭代器访问range
|
1
|
... |
【python之路29】python生成器generator与迭代器的更多相关文章
- Python之路,Day4 - Python基础4 (new版)
Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...
- python生成器(generator)、迭代器(iterator)、可迭代对象(iterable)区别
三者联系 迭代器(iterator)是一个更抽象的概念,任何对象,如果它的类有next方法(next python3)和__iter__方法返回自己本身,即为迭代器 通常生成器是通过调用一个或多个yi ...
- Python之生成器(generator)和迭代器(Iterator)
generator 生成器generator:一边循环一边计算的机制. 生成器是一个特殊的程序,可以被用于控制循环的迭代行为.python中的生成器是迭代器的一种,使用yield返回值函数,每次调用y ...
- Python的程序结构[7] -> 生成器/Generator -> 生成器浅析
生成器 / Generator 目录 关于生成器 生成器与迭代器 生成器的建立 通过迭代生成器获取值 生成器的 close 方法 生成器的 send 方法 生成器的 throw 方法 空生成器的检测方 ...
- Python之路,Day4 - Python基础(转载Alex)
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- python之路:Day04 --- Python基础4
本节内容 1.字符串格式化 2.迭代器和生成器 3.装饰器 4.Json & pickle 数据序列化 5.软件目录结构规范 一.字符串格式化 百分号式 %[(name)][flags][wi ...
- Python之路:Python各个器
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器 ...
- Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- Python之路,Day1 - Python基础1
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- 【Python之路】Python目录
Python基础1 -- Python由来.Python种类.编码方式, Python基础2 -- Python运算符.数据类型.enumerate.range.for循环 python基础3 -- ...
随机推荐
- 【默默努力】h5-game-heroVSmonster
先放下作者大大的项目地址:https://github.com/yangyunhe369/h5-game-heroVSmonster 然后游戏的效果为 截动图的按键与游戏按键应该冲突,我就截几张图片了 ...
- falcon监控指标
mysql监控指标: 流量状态: Bytes_received/s #平均每秒从所有客户端接收到的字节数,单位KB Bytes_sent/s #平均每秒发送给所有客户端的字节数,单位KB
- 常用DOM API总结
一. 获取节点 1. 获取元素节点 getElementsById getElementsByTagName getElementsByClassName 2. 获取属性节点 getAttribute ...
- LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)
传送门 解题思路 可以通过手玩或打表发现,其实要选的点一定是他们三个两两配对后其中一对的$lca$上,那么就直接算出来所有的$lca$,比较大小就行了. #include<iostream> ...
- c语言学习笔记 - 指针和字符串
前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...
- vue + element-ui实现简洁的导入导出功能
1.安装ElementUI模块 cnpm install element-ui -S 2.在main.js中引入 import ElementUI from 'element-ui' import ' ...
- 2016年深圳市服务业占GDP比重首次突破六成
2016年深圳市服务业占GDP比重首次突破六成 中商产业研究院 中商情报网 2017-01-12 11:08 分享: 中商情报网讯 1月10日,深圳市财政委员会召开新闻发布会,就深圳市2016 ...
- 大数据、AI“武装”企业服务:风控、检索、安全
大数据.AI“武装”企业服务:风控.检索.安全 小饭桌创业课堂2017-05-06 15:26:42阅读(127)评论(0) + - 文|吴杨可月 - - 小饭桌创业研究院出品 - 两件秘闻,将美国大 ...
- 如何用maven读取本地架包
一.这篇微博是建立在已经把架包复制过来的情况下的.其余情况另外谈. 二.本篇文章用的是cmd控制的 maven的安装请看以下链接:https://jingyan.baidu.com/article/3 ...
- iOS开发CATransform3D.h属性详解和方法使用
1.CATransform3D简介 layer有个属性transform,是CATransform3D类型.可以使其在三维界面作平移.缩放和旋转单独或组合动画! CATransform3D结构体: / ...