Python初学者第二十四天 函数进阶(3)生成器
24day
1、列表生成式:
循环模式:[变量(加工后的变量) for 变量 in iterable]
print([i for i in range(0,101,2)])
[1,4,9,16,25,36,49]
print([i*i for i in range(1,8)])
#['python1期', 'python2期', .....'python20期']
print(['python%s期'%i for i in range(1,21)])
筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
[变量(加工后的变量) for 变量 in iterable if 条件]
print([i for i in range(1,31) if i % 3 == 0])
print([i for i in range(1,31) if i % 3 == 0])
30以内能被2整除的数的平方
print([ i*i for i in range(1,31) if i % 2 == 0])
[1,2,3,4,6,7,8]
print([i for i in range(1,9)if i != 5])
l1 = ['wusir','ba', 'aa' ,'alex']
过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
print([i.upper() for i in l1 if len(i) > 3])
['WUSIR','ALEX']
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
将列表中的至少含有两个'e'的人名留下来。
l1 = []
for l in names: #正常情况
for name in l:
if name.count('e') >= 2:
l1.append(name)
print(l1)
print([j for i in names for j in i if j.count('e')==2]) #列表生成式
>>> a = [i+1 for i in range(10)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a = [i+1 for i in range(10)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a = [i+1 for i in a]
>>> a
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a = [i+1 for i in a]
>>> a
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
通过列表生成式,我们可以直接创建一个列表
2、生成器:generator
生成器特性:
- 不占内存
- 只能向前,不能返回
- 当生成器达到要求会报错
创建generator,方法一:一个列表生成式的[]
改成()
,就创建了一个generator
>>> a3 = (i for i in range(5))
>>> a3
<generator object <genexpr> at 0x0000000001DF5BA0>
>>> next(a3)
0
>>> next(a3)
1
>>> next(a3)
2
>>> next(a3)
3
>>> next(a3)
4
>>> next(a3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
通过for循环来调用生成器
>>> a3 = (i for i in range(5))
>>> for i in a3:
... print(i)
...
0
1
2
3
4
通过while循环来调生成器(跳出循环会报错)
>>> a3 = (i for i in range(5))
>>> while True:
... next(a3)
...
0
1
2
3
4
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
StopIteration
方法二:使用yield创建生成器(一个函数中包含yield关键字,那么这个函数就不在是一个普通的函数,而是一个generator)
generator和函数不一样。函数是按顺序执行,遇到return语句或最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时会从上一次返回的yield语句处继续执行。
return VS yield
return :返回并中止function
yield :返回数据,并冰冻当前的执行过程。next唤醒冻结的函数执行过程,直到遇到下一个yield
def fib(max):
n,a,b = 0,0,1
while n < max:
yield b #把函数的执行过程冻结在这一步,并且把b的值,返回给外面的next
print(b)
a,b = b,a+b
n += 1
return 'done' f = fib(10)
next(f)
next(f)
next(f)
当函数里面存在同时存在yield和return时,return值无法返回
def range2(n):
count = 0
while count < n:
print('count',count)
count += 1
yield count
return 33333 new_range = range2(3)
n1 = next(new_range)
n2 = next(new_range)
n3 = next(new_range)
n4 = next(new_range)
#执行结果如下
Traceback (most recent call last):
count 0
count 1
count 2
File "D:/编辑的文本/生成器.py", line 27, in <module>
n4 = next(new_range)
StopIteration: 33333
3、生成器send
def range2(n):
count = 0
while count < n:
print('count',count)
count += 1
sign = yield count
print('sign',sign)
return 33333 new_range = range2(3)
n1 = next(new_range)
new_range.send('stop')
#执行结果:
count 0
sign stop
count 1
send------>>>>a、唤醒并继续执行;b、发送一个信息到生成器内部;
总结:
列表推导式 与生成器表达式区别;
1,列表推导式 一行搞定,构建简单。
2, 不能用debug排错,比较复杂的列表列表推导式不能推导出来。 生成器表达式:
1,循环模式。 (变量(加工后的变量) for 变量 in iterable)
(变量(加工后的变量) for 变量 in iterable if 条件)
1,一行搞定。
2,节省内存。
Python初学者第二十四天 函数进阶(3)生成器的更多相关文章
- python学习三十四天函数高阶函数定义及用法
python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...
- python设计模式第二十四天【命令模式】
1.使用场景 (1)调用过程比较繁琐,需要封装 (2)调用参数需要进行处理封装 (3)需要添加额外的功能,例如,日志,缓存,操作记录等 2.代码实现 #!/usr/bin/env python #! ...
- python学习第二十五天函数位置参数和关键词参数
函数位置参数顾名思义就是按位置排序,按位置对应参数,位置一一对应,函数的关键词参数是不按照顺序来的,可以指定的参数传值.但是注意的是,位置参数必须在关键词参数之前. 1,函数位置参数 def good ...
- python学习二十四天函数参数之默认参数
函数参数就是向函数传递参数,可以传递一个,可以是更多个,有的参数有值,有的没有,函数可以设置默认参数,默认参数必须放参数最后面. 1,不传递参数,设置默认参数 def hello(a,b,c='123 ...
- Python初学者第十四天 三元运算及文件处理2
14day 1.三元运算: 又称三目运算,是对简单的条件语句的简写 如简单条件语句: if a > b: n = a else: n = b print(n) 三目运算语句: n = a if ...
- Python学习第二十四课——Mysql 外键约束
外键:主要是关联两个表的 举个栗子:在建表中创建外键 -- 添加外键例子 CREATE TABLE teacher( id TINYINT PRIMARY KEY auto_increment, na ...
- 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘
孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...
- Python第二十四天 binascii模块
Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...
- 孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4
孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...
随机推荐
- 学习笔记---log4j的使用与配置
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式. 日志信息的优先级从高到低有OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL,分别用来 ...
- JAVA项目将 Oracle 转 MySQL 数据库转换(Hibernate 持久层)
项目开发时用的是Oracle数据库,但为了更好的做分布式,做集群,我们要将数据库转成 MySQL! 在数据库迁移中首先要做的事是将 Oracle 的表结构以及数据 克隆到 MySQL 数据库. 这点不 ...
- solr 6.6 基础环境搭建 (一)
Apache Solr 介绍 参考博主原文链接1:http://www.cnblogs.com/blueskyli/p/7100443.html 参考博主原文链接2:http://www.cnblog ...
- 既之前的基础,先写个简单的PHP 与数据库 的数据交流
程序分三个板块, 现在先不用 css 和 javascript 先用纯 html php 写吧. 所以那些 嵌入式 <font size=.... 什么的看看就算了,不推荐如此使 ...
- C# WebBrowser设置代理
WebBrowser控件是基于IE浏览器的,所以它的内核功能是依赖于IE. code: class IEProxy { //设置代理选项 private const int INTERNET_OPTI ...
- 利用OpenCV检测手掌(palm)和拳头(fist)
思路:利用训练好的palm.xml和fist.xml文件,用OpenCV的CascadeClassifier对每一帧图像检测palm和fist,之后对多帧中检测到的palm和fist进行聚类分组,满足 ...
- 导出为shape文件
private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)//导出为s ...
- 1Java开发环境
1 下载 1.1 oracle官方网站 http://www.oracle.com/index.html 1.2 点击DOWNLOADS http://www.oracle.com ...
- 【转】JS前台加密,java后台解密实现
因项目需求,需要一些敏感信息进行加密,不能以明文暴露到浏览器. 然后后台进行解密操作 先看一下效果图 未对其加密传输 1.前台JS <script type="text/javascr ...
- MySQL中文编码设置为utf-8
MySQL中文编码设置为utf-8 原文地址:http://blog.csdn.net/wangnan537/article/details/47819167 1. 查看MySQL数据库的默认编码有如 ...