day 11 生成器
生成器
生成器本质就是迭代器,生成器是自己用python代码写的迭代器 将函数变成生成器
yield
用next 取值
一个next,对应一个yield
def func():
yield 111
yield 222
yield 333
ret = func()
# print(ret)
print(next(ret)) # 111 一个next取一个yield值,超出会报错
print(next(ret)) #
import time
def genrator_fun1():
a = 1
print('现在定义了a变量')
yield a
b = 2
print('现在又定义了b变量')
yield b g1 = genrator_fun1()
print('g1 : ',g1) #打印g1可以发现g1就是一个生成器
print('-'*20) #我是华丽的分割线
print(next(g1))
time.sleep(5) #sleep一秒看清执行过程
print(next(g1))
生成器好处:
不会一下子在内存中生成太多数据
yield return共同点和不同点:
return 终止函数,yield不会终止生成器函数
都会返回一个值,return给函数的执行者返回值,yield是给 next() 返回值
send next
send 不仅能对应yield取值,而且可以给上一个yield发送一个值
1、不能给第一个yield传值
2、最后一个yield永远得不到send传的值
def func():
a = yield 111
print('a=', a)
b = yield 222
print('b=',b)
yield 333
reg = func()
print(next(reg)) #第一位,打印第一个yield
print(reg.send('alex')) #在第二位,传值给第一位, a=alex 并打印222
print(reg.send('echo')) #在第三位,传值给第二位,b=echo 并打印 333
yield from (了解)
将一个可迭代对象变成一个迭代器返回
# 没有from
def func():
lst = ['alex', 'echo', 'nice', 'great']
yield lst
genor = func()
print(next(genor)) # ['alex', 'echo', 'nice', 'great']
for i in genor:
print(i) # ['alex', 'echo', 'nice', 'great']
# 有from
def func():
lst = ['alex', 'echo', 'nice', 'great']
yield from lst
genor = func()
# print(next(genor)) # alex 只打印第一个
for i in genor:
print(i) # alex echo nice great 一个一个出
列表推导式:
用一行代码构建简单,较复杂的列表
优点:节省代码行数
缺点:1、不能使用debug模式
2、任何列表都可以通过常规构建去构建,复杂的列表不能通过列表推导式构建
l1 = [i for i in range(100)]
print(l1)
分三种情况:
1、循环模式。 [ 变量(加工后的变量) for 变量 in iterable ]
l1 = [i for i in range(100)] # 变量
print(l1)
l1 = ['python%s期' % i for i in range(1, 25)] # 加工后的变量
print(l1)
2、三元模式(循环模式的变种)
# 构建一个列表:列表里面的元素是1~20,但是能被3整除元素替换成*。
print(['*' if i % 3 ==0 else i for i in range(1,21)]) # 有else, if在for前面
# 将至少含有两个e的名字放到一个列表中
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
print([name for l in names for name in l if name.count('e') >= 2]) # 没有else 则if放后面
3、筛选模式 [ 变量(加工后的变量) for 变量 in iterable if 条件]
# 30以内,能被3整除的数加入列表
l1 = [i for i in range(1, 31) if i % 3 == 0 ]
# 30以内能被3整除的数的 平方
l1 = [i*i for i in range(1, 31) if i % 3 == 0]
print(l1)
生成器表达式
与列表推导式几乎一模一样,就是[] 换成()
gentor = ('python%s期' %i for i in range(1,26))
print(gentor)
for i in gentor:
print(i)
字典推导式,集合推导式 (了解)
# {1: None, 2: None, 3: None, 4: None, 5: None}
print({i:None for i in range(1,6)})
# 将mcase列表键值调换
mcase = {'a': 10, 'b': 34, 'c': 20, 'd': 15}
print({value:key for key,value in mcase.items()})
针对只有返回值的这样的函数:python提供了一个函数可以简化,匿名函数
匿名函数,一行函数
#两个函数都是让用户输入两个值,然后相加,输出结果
def func(x, y):
return x + y func2 = lambda x,y: x + y
print(func2(3,4))
day 11 生成器的更多相关文章
- python函数(5):迭代器和生成器
迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...
- Python中什么时候使用生成器?
编者注:本文主要参考了<Python核心编程(第二版)> 说到生成器,先说说列表解析.列表解析可以动态创建列表. [expr for iter_var in iterable if con ...
- python_10 迭代器和生成器
迭代器协议: 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stopiteration异常,以终止迭代(只能往后走不能往前退) 2.可迭代对象:实现 ...
- python开发函数进阶:生成器表达式&各种推导式
一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...
- python学习笔记(四):生成器、内置函数、json
一.生成器 生成器是什么?其实和list差不多,只不过list生成的时候数据已经在内存里面了,而生成器中生成的数据是当被调用时才生成呢,这样就节省了内存空间. 1. 列表生成式,在第二篇博客里面我写了 ...
- python中的生成器,迭代器及列表生成式
列表生成器: 即List Comprehensions. 在python中,可通过内置的强大有简单的生成式来创建列表.例如创建一个1到10的列表list [1, 2, 3, 4, 5, 6, 7, ...
- Python命令 (if __name__=="__main__":)
1. 语法 1.以#号开头的语句是注释 2.请务必注意,Python程序是大小写敏感的,如果写错了大小写,程序会报错. 3.按照约定俗成的管理,应该始终坚持使用4个空格的缩进. 4.当语句以冒号:结尾 ...
- Python 入门指南
Release: 3.4 Date: March 29, 2014 Python 是一门简单易学且功能强大的编程语言. 它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程. Pyt ...
- PHP5.3, PHP5.4, PHP5.5新特性
PHP 5.3中的新特性 1. 支持命名空间 (Namespace) 2. 支持延迟静态绑定(Late Static Binding) 3. 支持goto语句 4. 支持闭包.Lambda/Anony ...
随机推荐
- R-CNN 学习记录
CNN是一个运用卷积神经网络进行图片分类的开山之作.RCNN是第一个把图片分类和目标检测连接起来的作品. RCNN主要解决的问题是: 1.怎样用深度神经网络进行目标定位:2.怎样用小批量的标注数据来训 ...
- 一例对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性的解决
这个问题相信只要是做MVC的,都碰到过,也都知道错误的原因,就是触发了定义的实例字段校验规则.比如定义的不为空,但是为空了,或者定义的字段长度为50,但是超过50了. 可是有时虽然知道是这样,但是具体 ...
- python 停止线程
Python没有提供方法去结束一个线程,无法给它发送信号,无法调整它的调度,也无法执行其他高级操作. 如果需要终止线程,需要通过编程让这个线程在某个特定点轮询来退出.但是如果一个线程一直阻塞在一个 I ...
- win10 任务栏锁定,win键没反应
现象:之前用win10,换成win10专业版后,安装360优化系统,过了几天后突然发现任务栏好像被锁定一般,按windows键没有任何反应,任务栏打开的文件,图片等等右键也没有反应,讲道理应该有关闭选 ...
- 一种比较low的linux的hung分析
在调试一个功能的时候,发现了两种hung,以前认为的hung肯定是softlock导致的,后来才发现不一定要有lock这种结构,但是有类似于锁的功能的时候,也可能触发hung,为了避免大家走弯路,故记 ...
- 【370】Python列表生成式(for 写入一行)
参考: python用列表生成式写嵌套循环的方法_python_脚本之家 参考: python之列表生成式 - 旷野足迹 - 博客园 对于读取Twitter数据最终会得到一个超级复杂的json文件, ...
- 使用karma做多浏览器的UI测试
avalon1.6开发得差不多,这次使用先进的开发理念进行开发,比如模块化,单元测试什么... ui测试是重要的一环,之前用阿里的totoro,但打开浏览器不方便.于是从webdrieverio, n ...
- 用Delphi改变图片的像素,即大小
我给你讲一种非常简单的方法: 第一步:在窗体上放上image1和image2两个图片控件.再放一个Button按钮控件. 第二步:在image1的Picture属性中载入一张JPG或者BMP图片.而i ...
- 命令行下IIS的配置脚本Adsutil.vbs
命令行下IIS的配置脚本Adsutil.vbs 2009-08-20 12:26:52 www.hackbase.com 来源:Jackal's Blog Jackal's Blog文件存在于:C ...
- 学习JS的心路历程-函式(一)
前几天有间单提到该如何声明函式及在Hositing中会发生什么事,但是函式的奥妙不仅于此. 身为一个使用JS的工程师,我们一定要熟悉函式到比恋人还熟! 这几天将会把函式逐一扒开跟各位一起探讨其中的奥妙 ...