003---生成器 & 迭代器
生成器 & 迭代器
列表生成式
现在有个需求,列表[1, 2, 3, 4, 5, 6, 7, 8, 9],将列表里的每个值加1。
- 二逼青年版
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = []
for item in a:
b.append(item + 1)
a = b
print(a)
- 普通青年版
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for index, ele in enumerate(a, 0):
a[index] += 1
print(a)
- 文艺版(lambda + map 搭配使用)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a = list(map(lambda x:x+1,a))
print(a)
- 装逼青年版
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print([i + 1 for i in a])
- 这种写法就是列表生成式
- 习题:利用列表生成式一行代码实现9 * 9乘法表
print('\n'.join([''.join(['%d * %d = %-3d' % (i, j, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))
生成器
- 通过列表生成式,可以直接创建一个列表,但是毕竟内存有限,列表的容量也是有限的。创建一个包含100万个元素的列表,但是我们仅仅需要访问前面几个元素,这就造成了内存大量白白浪费。
- 在python中有一种更好的解决方式,边循环边计算的机制。称为(generator)
- 简单创建生成器(只需要把列表生成器的方括号改成括号)
g = (i for i in range(5))
print(type(g),g.next())
- next()取值和for循环取值
# 使用next()取值
g = (i for i in range(5))
print(type(g))
print('开始取值')
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# print(next(g)) # 报错:StopIteration,因为取不到值了
# 基本上不会使用next(),正确应该使用for循环。而且还不需要担心会报错。拿不到函数return返回值
g = (i for i in range(10))
for i in g:
print(i)
- 斐波拉契
# 斐波拉契:1 1 2 3 5 8 13 21
def fbi(num):
n, a, b = 0, 0, 1
while n < num:
yield b # # 到这停止,可以理解为冻结当前代码。并且,把值返回给外面的next()
print(a, b)
a, b = b, a + b
n += 1
for i in fbi(2):
print(i)
代码解析:
- return 和 yield 的区别
- 返回并终止函数
- 返回数据,并冻结当前的执行过程。
- next()唤醒冻结函数的执行过程,继续执行,直到遇到下一个yield
- 函数加了yield之后
- 函数()就得到了生成器,不next()不开始执行。
- return 在生成器里,代表生成器的终止,直接报错
- return 和 yield 的区别
深入
# 生成器send,相当于唤醒。
def work(n):
count = 0
while count < n:
count += 1
sign = yield count
print('sign的值:',sign)
if not sign:
yield count + 2
new_range = work(4)
# res = next(new_range) # 开始第一次取值 拿到一个1
# print(res) # 1
# res1 = new_range.send(True) # 第二次取值 发送一个true 函数遇到true 循环
# print(res1) # 2
# res2 = new_range.send(False) # 第三次取值 n=3
# print(res2)
迭代器
可以作用for循环的类型:
- 集合类型:str、list、tuple、dict、set
- generator:生成器和带yield的函数
这些类型称为可迭代对象:iterable
from collections import Iterable print(isinstance([],Iterable))
print(isinstance('',Iterable))
print(isinstance({},Iterable))
print(isinstance(set(),Iterable))
print(isinstance((i for i in range(2)),Iterable))生成器不仅可以作用域for还可以被next()不断取值,直到没有数据可取
from collections import Iterator
print(isinstance((i for i in range(2)),Iterator))
总结
- 凡是可以作用于for循环的对象都是可迭代对象,Iterable
- 凡是可以作用于next()的对象都是迭代器,Iterator
- 集合数据类型虽然不是迭代器,但是可以通过iter()函数变成Iterator。
003---生成器 & 迭代器的更多相关文章
- 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 ...
随机推荐
- SQL Server ->> 重新创建Assembly和自动重建相关的数据库编程对象(存储过程,函数和触发器)
在SQL Server中,一旦一个Assembly被其他的数据库编程对象(存储过程,函数和触发器)引用了,这个Assembly就不能被删除.但是问题是,在SQL Server要更新一个Assembly ...
- Consul 配置ACLs
比如consul.exe 在D:\consul来个json配置文件在 D:\consul\config.jsonjson 格式{ "acl_datacenter": "d ...
- 关于移动App开发前端UI框架选择
问题:现在移动开发各种必须,而移动开发纠结在于怎样快速高效的开发出来. 做web开发有些年头了,成熟的前端套件(easyui,extjs,jqueryui)很是方便,可以开发出来规范一直的产品,各种组 ...
- html css:背景图片链接css写法
图片作为背景,并且是链接的写法.例如网站的logo图片.例如:土豆的logo图片 <a title="土豆网 tudou.com 每个人都是生活的导演" href=" ...
- WCF思考随笔一: WCF是干什么的?
对于WCF,之前知道是微软新一代开发框架的重要组成部分,是从之前Socket,COM,COM+,.NET Remoting,WebService等等系统内或系统间通讯解决方案发展而来,同时对各种解决方 ...
- gluon 实现线性回归
from mxnet import autograd, nd num_inputs = 2 num_examples = 1000 true_w = [2,-3.4] true_b = 4.2 fea ...
- react中使用css动画效果
index.js import React, { Component, Fragment } from 'react'; class App extends Component { construct ...
- 【转】Android 之ActivityThead、ActivityManagerService 与activity的管理和创建
在android中,Activity是四大组件中比较重要的一个(当然其他的也比较重要),那么android中是怎样管理这些activity的?应用的进程和主线程是怎么创建的,应用的消息循环又是在什么时 ...
- NYOJ298 点的变换 【矩阵乘法经典】
任意门:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=298 点的变换 时间限制:2000 ms | 内存限制:65535 KB 难度:5 ...
- 【洛谷P1005】矩阵取数游戏
矩阵取数游戏 题目链接 每行分别跑一趟区间DP即可 这道题区间DP是非常裸的,按套路来即可 但是很毒瘤的是需要高精度, “我王境泽就是爆零,从这跳下去,也不会用__int128的!” #include ...