小学生都能学会的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 ...
随机推荐
- jQuery选择器补充
---------------------------------------------------------------------------------------------------- ...
- HDU 1042 N!【大数】
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...
- Cocos2d-x碰撞检測
假设不适用Box2D物理引擎.那么要进行Cocos2d-x的碰撞检測那我们的方法往往就是进行"矩形和点"."矩形和矩形"这样粗略的碰撞检測.我们一般採取开启sc ...
- Python游戏server开发日记(二)绕过GIL启动多线程Python环境
说道Python和多线程,非常easy想到GIL,GIL意味着仅仅要是用Python做的多线程程序.就无法利用多个CPU. 经过一些失败的尝试后,我也一度觉得GIL是无解的.我们甚至把注意力转向了Ir ...
- HDU 2732 Leapin' Lizards(拆点+最大流)
HDU 2732 Leapin' Lizards 题目链接 题意:有一些蜥蜴在一个迷宫里面,有一个跳跃力表示能跳到多远的柱子,然后每根柱子最多被跳一定次数,求这些蜥蜴还有多少是不管怎样都逃不出来的. ...
- fontend-githubs
https://github.com/dypsilon/frontend-dev-bookmarks
- 0x02 枚举、模拟、递推
1.TYVJ1266(这站是不是已经倒闭了啊) USACO陈年老题,对于这种开关问题啊,最多只按一次,而且第一行随便按完下面的就全确定了,类似的还有固定翻转一个长度的区间,这个也是最多翻一次的而且翻的 ...
- Linux就该这么学 20181011(第十五章邮件)
参考链接:https://www.linuxprobe.com. https://www.linuxprobe.com/chapter-15.html 电子邮箱系统 foxmail MUA 发送 MT ...
- 【刷题笔记】LeetCode 222. Count Complete Tree Nodes
题意 给一棵 complete binary tree,数数看一共有多少个结点.做题链接 直观做法:递归 var countNodes = function(root) { if(root===nul ...
- js写发布微博文本框---2017-04-14
实现效果: 1.文本框输入内容,低端字数对应减少 2.当文本框内容超出时,会显示字数超出多少 效果图如下: 实现代码: <!DOCTYPE html><html> <he ...