解析式,生成器
时间:2019-09-24
本文章向大家介绍解析式,生成器,主要包括解析式,生成器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
列表解析式List Comprehansion
[返回值 for element in 可迭代对象 if 条件] ---- 返回一个新列表
提高效率,字节码更少,减少了栈帧
立即返回值
生成器表达式Generator Expression
(返回值 for elment in 可迭代对象 if condition)
按需计算(惰性求值,延迟计算),需要的时候才算值
可迭代对象
迭代器
可用next()方法
集合解析式
{返回值 for element in 可迭代对象 if condition}
立即返回一个集合
字典解析式
{返回值 for element in 可迭代对象 if condition}
返回值使用 key:value的形式
立即返回一个字典
生成器函数
通过yield关键字得到一个生成器函数,返回一个生成器对象
延迟计算,惰性求值
yield会暂停函数
def inc():
for i in range(5):
yield i
print(type(inc))
print(type(inc()))
x = inc()
print(type(x))
print(next(x))
for m in x:
print(m, '*')
for m in x:
print(m, '**')
<class 'function'>
<class 'generator'>
<class 'generator'>
0
1 *
2 *
3 *
4 *
生成器函数等价于生成器表达式,只不过生成器函数可以更加复杂
def inc():
for i in range(5):
yield i
#等价于y = (i for i in range(5))
def gen():
print('line 1')
yield 1
print('line 2')
yield 2
print('line 3')
return 3
next(gen()) # line 1
next(gen()) # line 1
g = gen()
print(next(g)) # line 1
print(next(g)) # line 2
#print(next(g)) # StopIteration next无法找到return函数,只认识yield函数
print(next(g, 'End')) #end相当于缺省值
print(next(g, 'End'))
line 1
line 1
line 1
1
line 2
2
line 3
End
End #输出为只有end因为结束后g结束,只返回缺省值end
- 生成器函数中,可以使用多个yield语句,执行依次后会暂定执行,把yield表达式的返回值的值返回
- 再次调用会执行到下一个yield语句
- return依然可以终止函数运行,(一般不加),但return语句的返回值不能被获取到
- return会导致无法继续获取下一个值,抛出StopLteration异常
- 如果函数没有显示的return语句,生成器执行到结尾,继续执行也会抛出StopLteration异常
- ==next语句,动一下走一步==
应用
无限循环:使用yield语句,动一下走一步
- 协程coroutine:
- 比进程,线程轻量级
- 时在用户空间调度函数的一种实现
- 协程调度器实现思路
- 有两个生成器A.B
- next(A)后,A执行到了yield语句暂停,然后取执行next(B),B执行 到yield也暂停,然后再次调用next(A),再调用next(B),周而复始,实现了调度的效果
- 可以引入调度的策略来实现切换的方式
- 协程时一种非抢占式调度
yield form 语句
def inc():
for x in range(1000):
yield x
#等同于一下语句
def inc():
yield from range(1000)
yield from iterable 是for item in iterable : yield item 形式语法糖
zip语句
zip(iter1 [,iter2 [...]]) --> zip object
Return a zip object whose .__next__() method returns a tuple where
the i-th element comes from the i-th iterable argument. The .__next__()
method continues until the shortest iterable in the argument sequence
is exhausted and then it raises StopIteration.
返回一个n元组,n为zip括号中可迭代对象数量,每个可迭代对象依次取值,以最短的可迭代对象为准.多余不迭代
原文地址:https://www.cnblogs.com/agsol/p/11578657.html
- Centos7 firewalld防火墙基本操作
- Spark Sql系统入门4:spark应用程序中使用spark sql
- Flume+Kafka收集Docker容器内分布式日志应用实践
- CentOS7搭建ELK日志集中分析平台
- Centos安装sshfs实现挂载目录
- shell脚本监控磁盘使用率
- Python使用MD5加密字符串
- Spark MLlib之 KMeans聚类算法详解
- Python时间与时间戳转换
- linux配置ssh互信实现免密登陆
- uva--1339 - Ancient Cipher(模拟水体系列)
- Python获得13位unix时间戳
- Centos7下LVM对文件系统进行在线扩容
- centos7编译安装Redis
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言做几何布朗运动的模拟:复杂金融产品的几何布朗运动的模拟
- 手把手教你使用Flask搭建ES搜索引擎(实战篇)
- 【基础篇】Python+Go——带大家一起另寻途径提高计算性能
- 转录组分析 | 使用Trimmomatic过滤Fastq文件
- 转录组分析 | 使用FastQC进行数据质控
- R语言绘图 | 给箱线图加个点
- R语言绘图 | 使用pheatmap快速绘制热图
- 可能是目前最详细从零开始配置 TypeScript 项目的教程
- 比对得到的SAM文件怎么看?
- ANTNet|端侧架构,精度速度双超MobileNetV2
- 9个动图带你进入PyQtGraph的强大可视化世界
- 转录组分析 | 使用STAR进行比对
- 使用R/qtl进行QTL分析
- 转录组分析 | 使用RSEM进行转录本定量
- 使用R语言计算遗传力