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 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...
随机推荐
- 面试题42:计算逆波兰表达式(RPN)
这是一个比较简单的题目,借助栈可以轻松实现逆波兰表达式. 题目描述: Evaluate the value of an arithmetic expression in Reverse Polish ...
- JavaI/O系统2
数据流: DataInputStream,DataOutputStream.可以用于与计算机无关的格式读写java的基本数据类型以及String对象 对象流: ObjectInputStream,Ob ...
- hadoop学习笔记(八):MapReduce
一.MapReduce编程模型 一种分布式计算框架,解决海量数据的计算问题. MapReduce将整个并行计算过程抽象到两个函数: Map(映射):对一些独立元素组成的列表的每一个元素进行制定的操作, ...
- bootstrap栅格系统的属性及使用
栅格系统 媒体查询 在栅格系统中,我们在 Less 文件中使用以下媒体查询(media query)来创建关键的分界点阈值. 小屏幕(平板,大于等于 768px) @media (min-width: ...
- EF的小知识
关于EF多表提交保存的问题,同理,修改也适用,用EF不久,总是每张表提交都SaveChanges()一下,后面查看了点资料,其实直接可以add到每张表,直接最后提交就行了,这样操作起来和性能上都要好很 ...
- 啰里吧嗦jvm
一.为什么要了解jvm 有次做项目的时候,程序run起来的时候,总是报OutOfMemoryError,有老司机教我们用jconsole.exe看内存溢出问题 就是这货启动jconsole后,发现一个 ...
- 啰里吧嗦式讲解java静态代理动态代理模式
一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于 ...
- Sql Server 中使用日期遍历
一个存储过程小案例,内容如下: declare @dt datetime set @dt='2016-01-01' while (@dt<='2016-12-31') begin -- 转换字符 ...
- 湘潭校赛 Hard Wuxing
Hard Wuxing Accepted : 13 Submit : 166 Time Limit : 1000 MS Memory Limit : 65536 KB 题目描述 “五行”是中国 ...
- Linux学习3-Linux系统安装CentOS6.5
1.启动虚拟机(虚拟机的安装参见Linux学习1-创建虚拟机) 本此安装系统:CentOS6.5 2.启动客户端后迅速按下F2键进入Bios设置,注意:启动后需鼠标点击虚拟机的屏幕并迅 ...