小学生都能学会的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(生成器)的更多相关文章

  1. 小学生都能学会的python(闭包和迭代器)

    小学生都能学会的python(闭包和迭代器) 1. 函数名第一类对象 函数名其实就是变量名 1). 可以像变量一样互相赋值. 2). 可以作为函数的参数,进行传递 3). 可以作为返回值返回 4). ...

  2. 小学生都能学会的python(函数的进阶)

    小学生都能学会的python(函数的进阶) 1. 动态传参 形参: 1. 位置参数 2. 默认值参数 3. 动态传参 *args 动态接收位置参数 **kwargs 动态接收关键字参数 def fun ...

  3. 小学生都能学会的python(函数)

    小学生都能学会的python(函数) 神马是函数 函数: 对功能或者动作的封装 函数的定义 def 函数名(形参列表): 函数体(return) ret = 函数名(实参列表) 函数的返回值 retu ...

  4. 小学生都能学会的python(文件操作)

    小学生都能学会的python(文件操作) 1. open("文件路径", mode="模式", encoding="编码") 文件的路径: ...

  5. 小学生都能学会的python(深浅拷贝)

    小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...

  6. 小学生都能学会的python(小数据池)

    小学生都能学会的python(小数据池) 1. 小数据池. 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存:int, str, bool. int: 缓存范围 -5~256 ...

  7. 小学生都能学会的python(字典{ })

    小学生都能学会的python(字典{ }) 1. 什么是字典 dict. 以{}表示. 每一项用逗号隔开, 内部元素用key:value的形式来保存数据 {"jj":"林 ...

  8. 小学生都能学会的python(列表[ ])

    小学生都能学会的python(列表[ ]) 1. 什么是列表(list) 能装东西的东西 列表中装的数据是没有限制的, 大小基本上是够用的 列表使用[]来表示. 在列表中每个元素与元素之间用逗号隔开 ...

  9. 小学生都能学会的python(编码 and 字符串)

    小学生都能学会的python(编码 and 字符串) 一,编码 最早的计算机编码是ASCII. 有英文+数字+特殊字符 8bit => 1byte 没有中文, 后面的编码必须兼容ASCII    ...

随机推荐

  1. django rest-farme-work 的使用(1)

    Django REST框架是一个用于构建Web API的强大且灵活的工具包 您可能想要使用REST框架的一些原因: 可浏览性 身份认证 支持ORM和非ORM的序列化 良好的文档支持 安装初步 pip ...

  2. MySQL SQL模式特点汇总

    前言 MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值.DBA可以设置全局SQL模式以匹配站点服务器操作要求,并且 ...

  3. Python学习笔记(1)Pycharm基本认识

    Pycharm的使用 集成开发环境(IDE,集成开发环境) VIM  #经典的linux下的文本编辑器 Pycharm,主要用于python开发的ide PyCharm常用快捷键 Ctrl + / # ...

  4. php中的form表单

    表单处理 表单的概念在生活中很常见,就像是问卷调查表一样,别人先把问卷发给你,你照着问卷的要求填写,完事过后再将填完的问卷发给别人,从而达到一个将别人需要的信息传递给别人的一种方式. 传统的网页大多数 ...

  5. 【Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) B】Weakened Common Divisor

    [链接] 我是链接,点我呀:) [题意] 给你n个数对(ai,bi). 让你求一个大于1的数字x 使得对于任意的i x|a[i] 或者 x|b[i] [题解] 求出第一个数对的两个数他们有哪些质因子. ...

  6. 【hdu 6396】Swordsman

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 开k个优先队列.每个队列都满足从小到大那种.. 首先将所有的怪物加入到第一个队列中. 然后对于v[i]>=pq[i].top( ...

  7. 【hihocoder 1032】最长回文子串

    [题目链接]:http://hihocoder.com/problemset/problem/1032 [题意] [题解] 原文地址:https://segmentfault.com/a/119000 ...

  8. 在使用SSH+JPA开发中,ajax使用ObjectMapper类从后台向前台传值

    使用ObjectMapper对象的writeValue方法 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.writeValu ...

  9. [React] Reference a node using createRef() in React 16.3

    In this lesson, we look at where we came from with refs in React. Starting with the deprecated strin ...

  10. linux下jenkins安装

    在安装jenkins之前.首先确认jdk和tomcat,maven已经配置好 详细配置方法,请看的我博客. jdk:jdk的安装与配置 tomcat:tomcat的安装与配置 maven:maven的 ...