小学生都能学会的python(生成器)
小学生都能学会的python(生成器)
1. 生成器
生成器的本质就是迭代器.
生成器由生成器函数来创建或者通过生成器表达式来创建
# def func():
# lst = []
# for i in range(10000):
# lst.append("衣服%s" % i)
# return lst
# lst = func()
# print(lst) # def func():
# for i in range(1, 10000):
# yield "衣服%s" % i
#
# gen = func()
# for i in range(50):
# yf = gen.__next__()
# for i in range(50):
# yf = gen.__next__()
# for i in range(50):
# yf = gen.__next__() # def func():
# lst = []
# for i in range(1, 10000):
# lst.append("衣服%s" % i)
# if i % 50 == 0:
# yield lst
# lst = [] # 新的装衣服的地方
#
# gen = func()
# yf1 = gen.__next__()
# print(yf1)
# yf2 = gen.__next__()
# print(yf2)
# yf3 = gen.__next__()
# print(yf3)
# yf4 = gen.__next__()
# yf5 = gen.__next__()
# print(yf1)
# print(yf2)
# print(yf3)
# print(yf4)
# print(yf5) # 生成器:本质是迭代器, 写法和迭代器不一样. 用法和迭代器一样
# 生成器函数: 函数中带有yield, 执行生成器函数的时候返回生成器。而不是执行这个函数
# def func():
# print("你好啊, 我叫赛利亚,")
# yield "西岚的武士刀" # return 和yield都可以返回数据
#
# ret = func() # generator ret是一个生成器
# print(ret)
# s = ret.__next__() # 当执行到__next__()的时候, 函数才真正的开始执行
# print("接受到的是", s) # def func():
# print("打开手机")
# print("打开陌陌")
# yield "手机"
# print("约妹子")
# print("出来喝喝茶")
# yield "电脑"
# print("我加了一句话")
# gen = func() # 生成器
# ret1 = gen.__next__()
# print(ret1)
# ret2 = gen.__next__()
# print(ret2)
# ret3 = gen.__next__() # 找不到最后一个yield 会报错
# print(ret3)
# # 特点:
# 1. 节省内存, 几乎不占用内存
# 2. 惰性机制
# 3。只能往前走 # send() 也可以实现类似__next__()的效果, send()可以给上一个yield传值
#
# def func():
# print("韭菜盒子")
# a = yield "哇哈哈"
# print("肉包子", a)
# b = yield "脉动"
# print("锅包肉", b)
# yield "冰红茶"
#
# gen = func()
# ret = gen.send("胡辣汤")
# print(ret)
#
# ret = gen.send("刘伟") # 给上一个yield传值
# print(ret)
#
# ret = gen.send("刘德华") # 给上一个yield传值
# print(ret) # send()和__next__()的区别
# send不可以用在开头
# send可以给上一个yield传值, 不能给最后一个yield传值 def func():
yield "麻花藤"
yield "李彦宏"
yield "马云"
yield "刘强东" gen = func()
# print(gen.__next__()) # 麻花藤
# print(gen.__next__()) # 麻花藤
# print(gen.__next__()) # 麻花藤
# print(gen.__next__()) # 麻花藤 # 生成器的本质是迭代器.
# print("__iter__" in dir(gen))
#
# # 生成器可以直接使用for循环
# # for el in gen:
# # print(el)
#
# lst = list(gen) # 把生成器中的每一个数据拿出来组合成一个列表
# print(lst)
2. 生成器函数
生成器函数:在函数中return换成yield. 这个函数就是生成器函数
def func():
yield
gen = func() 函数并不会被执行, 而是创建一个生成器对象
取值:
gen.__next__() 下一个
gen.send() 可以给上一个yield传值, 第一次执行不能用send()
特性:
1. 节省内存
2. 惰性机制
3. 只能向前
3. 各种推导式
# 列表:装python1期, python2期。。。。。。
# lst = [] # 创建列表
# for i in range(1, 17): # 循环1-16
# lst.append("python%s" % i) # 装数据
# print(lst) # 推导式
# 列表推导式 : [结果 for循环 if筛选]
lst = ["python%s" % i for i in range(1, 17)]
print(lst) # 创建列表: [1,3,5,7,9..99]
lst = [i for i in range(1, 100, 2)]
print(lst) lst = [i for i in range(1,100) if i % 2 == 1]
print(lst) # 获取1-100内能被3整除的数
# lst = [i for i in range(1, 101) if i % 3 == 0]
#
# # 100以内能被3整除的数的平⽅
# lst = [i*i for i in range(1, 101) if i % 3 == 0]
# 寻找名字中带有两个e的⼈的名字 # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
# ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
#
# lst = [name for first in names for name in first if name.count("e") >= 2 ]
# print(lst) # 字典推导式, {key: value for循环 if 筛选}
# dic = {"张无忌":"九阳神功", "乔峰":"降龙十八掌", "楚留香":"帅"}
# d = {dic[k]: k for k in dic}
# print(d) # lst1 = ["东北", "陕西", "山西", "开封", "杭州", "广东", "济南"]
# lst2 = ['大拉皮', "油泼面", "老陈醋", "灌汤包", "西湖鲤鱼", "早茶", "胶东一锅鲜"]
#
# dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
# print(dic) # 集合推导式 无序不重复 可哈希
# {key for if} # lst = ["周杰伦","周伯通","周润发","周伯通","周笔畅","周伯通","周星驰","周伯通"]
# s = {el for el in lst}
# print(s)
1.列表推导式: [结果 for循环 if条件]
2.字典推导式: { key: value for循环 if条件}
3.集合推导式: {key for循环 if条件}
(结果 for循环 if条件)
惰性机制
记录在内存中的一段代码.
# 元组没有推导式
# [结果 for if]
# {key for if}
# {key:value for if}
# (结果 for if) # 生成器表达式, 拿到的是生成器 # 可以使用生成器表达式直接创建生成器
# gen = (i for i in range(10)) # generator
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__()) # 生成器表达式: 记录一下代码。 然后每次需要的时候去生成器中执行一次这个代码
# 列表推导式: 一次性把所有的数据创建出来, 容易产生内存浪费
# 特性:
# 1. 节省内存
# 2. 惰性机制
# 3.只能向前。 # 生成器函数
# def func():
# print(111)
# yield 222
#
# g = func() # 生成器
#
# g1 = (i for i in g) # 生成器
# g2 = (i for i in g1) # 生成器
#
#
# print(list(g1)) # 222
# print(list(g2))
# print(list(g)) # 才会开始真正的取数据 # 计算两个数的和
def add(a, b):
return a + b # 生成器函数, 0-3
def test():
for r_i in range(4):
yield r_i # 获取到生成器
g = test() # 惰性机制 for n in [2, 10]:
g = (add(n, i) for i in g) # 循环的内部也是一个生成器 # __next__()
# list() print(list(g)) # 刚开始拿数据
# 生成器记录的是代码
小学生都能学会的python(生成器)的更多相关文章
- 小学生都能学会的python(闭包和迭代器)
小学生都能学会的python(闭包和迭代器) 1. 函数名第一类对象 函数名其实就是变量名 1). 可以像变量一样互相赋值. 2). 可以作为函数的参数,进行传递 3). 可以作为返回值返回 4). ...
- 小学生都能学会的python(函数的进阶)
小学生都能学会的python(函数的进阶) 1. 动态传参 形参: 1. 位置参数 2. 默认值参数 3. 动态传参 *args 动态接收位置参数 **kwargs 动态接收关键字参数 def fun ...
- 小学生都能学会的python(函数)
小学生都能学会的python(函数) 神马是函数 函数: 对功能或者动作的封装 函数的定义 def 函数名(形参列表): 函数体(return) ret = 函数名(实参列表) 函数的返回值 retu ...
- 小学生都能学会的python(文件操作)
小学生都能学会的python(文件操作) 1. open("文件路径", mode="模式", encoding="编码") 文件的路径: ...
- 小学生都能学会的python(深浅拷贝)
小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...
- 小学生都能学会的python(小数据池)
小学生都能学会的python(小数据池) 1. 小数据池. 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存:int, str, bool. int: 缓存范围 -5~256 ...
- 小学生都能学会的python(字典{ })
小学生都能学会的python(字典{ }) 1. 什么是字典 dict. 以{}表示. 每一项用逗号隔开, 内部元素用key:value的形式来保存数据 {"jj":"林 ...
- 小学生都能学会的python(列表[ ])
小学生都能学会的python(列表[ ]) 1. 什么是列表(list) 能装东西的东西 列表中装的数据是没有限制的, 大小基本上是够用的 列表使用[]来表示. 在列表中每个元素与元素之间用逗号隔开 ...
- 小学生都能学会的python(编码 and 字符串)
小学生都能学会的python(编码 and 字符串) 一,编码 最早的计算机编码是ASCII. 有英文+数字+特殊字符 8bit => 1byte 没有中文, 后面的编码必须兼容ASCII ...
随机推荐
- soapui测试接口使用步骤
1.新建项目 2. 定义接口 url输入接口 3.新建测试集 选择项目,右键 4.在测试集下新建测试用例 5.在测试步骤中导入要测试的请求 6.run
- java并发之线程间通信协作
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...
- oracle导入expdp、导出impdp数据库用户
仅限oracle服务器上执行:把172.16.251.136:1521/orcl的AMI4_2用户导入到192.168.2.30:1521/orclss中的AMI1用户: 关于导入导出更详细的见文章 ...
- spring的启动过程就是创建ioc容器的过程
1. spring简介 spring的最基本的功能就是创建对象及管理这些对象之间的依赖关系,实现低耦合.高内聚.还提供像通用日志记录.性能统计.安全控制.异常处理等面向切面的能力,还能帮我们管理最头疼 ...
- 《C++编程思想》第四章 初始化与清除(原书代码+习题+解答)
相关代码: 1. #include <stdio.h> class tree { int height; public: tree(int initialHeight); ~tree(); ...
- ES 内存使用和GC指标——主节点每30秒会去检查其他节点的状态,如果任何节点的垃圾回收时间超过30秒(Garbage collection duration),则会导致主节点任务该节点脱离集群。
摘录自:http://blog.csdn.net/yangwenbo214/article/details/74000458 内存使用和GC指标 在运行Elasticsearch时,内存是您要密切监控 ...
- 使用神经网络-垃圾邮件检测-LSTM或者CNN(一维卷积)效果都不错【代码有问题,pass】
from sklearn.feature_extraction.text import CountVectorizer import os from sklearn.naive_bayes impor ...
- 3.linux(ubuntu)常用服务器搭建
1 ftp 1.1 ftp服务器 1.安装vsftpd服务器 sudo apt-get install vsftpd 2.配置vsftpd.conf文件 sudo vi /etc/vsftpd.con ...
- tabBar的图标不被系统渲染
navi.tabBarItem.selectedImage = [[UIImage imageNamed:imageStr]imageWithRenderingMode:UIImageRenderin ...
- Hessian实例
简述Hessian Hessian是一个由Caucho Technology开发的轻量级RPC框架,由于它使用二进制RPC协议,所以它更快.更简单,很适合于发送二进制数据(访问官网): 在进行基于He ...