简单了解python 生成器 列表推导式 生成器表达式


Posted in Python onAugust 22, 2019

生成器就是自己用python代码写的迭代器,生成器的本质就是迭代器。

通过以下两种方式构建一个生成器:

1、通过生成器函数

2、生成器表达式

生成器函数:

函数

def func1(x):
   x += 1
   return x
 print(func1(5))

生成器函数

def func1(x):
   x += 1
   yield x
 g_obj = func1(5)
 print(g_obj.__next__())

一个next对应一个yield。

yield VS return

return 结束函数,给函数的执行者返回值

yield 不会结束函数,一个next对应一个yield,给生成器对象。__next__()返回值。

生成器函数 VS 迭代器

区别1:自定制的区别:

l1 = [1,2,3,4,5]
 l1.__iter__()
 def func1(x):
   x += 1
   yield x
   x += 3
   yield x
   x += 5
   yield x
g1 = func1(5)
print(g1.__next__())
print(g1.__next__())
print(g1.__next__())

区别2:内存级别的区别。

迭代器是需要可迭代对象进行转化,可迭代对象非常占内存

生成器直接创建,不需要转化,从本质就节省内存

send & next

send与next一样,也是对生成器取值(执行一个yield)的方法。

send 可以给上一个yield传值,第一次取值永远都是next

最后一个yield永远也得不到send的值

列表推导式:一行代码搞定所需要的任何列表

循环模式 格式:[变量(加工后的变量)for 变量 in interable

lis = [i for i in range(1,101)]
print(lis)
lis = ['骑士计划%s期'% i for i in range(1,16)]
print(lis)
lis = [i**2 for i in range(1,11)]
print(lis)
print([i for i in range(1,31) if i % 3 == 0])
print([i*i for i in range(1,31) if i % 3 is 0 ])

筛选模式:

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
     ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
print([q for name in names for q in name if q.count('e') >= 2])

列表推导式

优点:一行解决,方便

缺点:容易着迷,不易排错,不能超过三次循环

列表推导式不能解决所有列表的问题,无需刻意使用

生成器表达式:将列表推导式的 [] 换成 () 即可

g = (i for i in range(199))
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之传说中的函数编写条规
Oct 11 Python
centos 下面安装python2.7 +pip +mysqld
Nov 18 Python
Python中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
python中import与from方法总结(推荐)
Mar 21 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
详解python中的hashlib模块的使用
Apr 22 Python
django实现支付宝支付实例讲解
Oct 17 Python
Python中的四种交换数值的方法解析
Nov 18 Python
python正则表达式的懒惰匹配和贪婪匹配说明
Jul 13 Python
Python常用类型转换实现代码实例
Jul 28 Python
Python实现的微信红包提醒功能示例
Aug 22 #Python
Python PIL图片添加字体的例子
Aug 22 #Python
在python image 中安装中文字体的实现方法
Aug 22 #Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 #Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 #Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
Aug 22 #Python
Django stark组件使用及原理详解
Aug 22 #Python
You might like
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
JavaScript类的写法
2016/09/17 Javascript
JS重载实现方法分析
2016/12/16 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
python中偏函数partial用法实例分析
2015/07/08 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
彪马日本官网:PUMA日本
2019/01/31 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
护士进修自我鉴定
2014/02/07 职场文书
追悼会答谢词
2015/01/05 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle