1.今日内容大纲

一. 昨日内容回顾函数名(第一类对象)1. 函数名可以当做变量来用2. 函数名可以作为集合类的元素3. 函数名可以作为参数传递4. 函数名可以作为返回值返回__name__ 查看函数的名字__doc__ 查看函数的文档注释闭包:内部函数对外部函数中的变量的调用def outer():a = 10def inner():areturn inner好处:1. 保护变量2. 常驻内存迭代器:dir() 查看数据可以执行的方法Iterable: 在数据内部存在 __iter__()  可以被迭代的内容.Iterator: 迭代器. 存在__iter__() 还存在__next__()还可以引入collections 中的Iterable和Iteratorisinstance(对象, 类型) 可以判断xxx对象是否是xxx类型特征:1. 节省内存2. 惰性机制(只有执行__next__()才会取值)3. 只能向前.for循环内部使用的是迭代器lst = [1,2,3]it = lst.__iter__()while 1:try:it.__next__()except StopIteration:break二. 今日主要内容1. 生成器生成器的本质就是迭代器.生成器由生成器函数来创建或者通过生成器表达式来创建2. 生成器函数生成器函数:在函数中return换成yield. 这个函数就是生成器函数def func():yieldgen = func() 函数并不会被执行, 而是创建一个生成器对象取值:gen.__next__() 下一个gen.send() 可以给上一个yield传值, 第一次执行不能用send()特性:1. 节省内存2. 惰性机制3. 只能向前3. 各种推导式1.列表推导式: [结果 for循环 if条件]2.字典推导式: { key: value for循环 if条件}3.集合推导式: {key for循环 if条件}4. 生成器表达式(笔试题)(结果 for循环 if条件)惰性机制记录在内存中的一段代码.预习:内置函数一.

2.生成器


# 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)

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)

4.生成器表达式

# 元组没有推导式
# [结果 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)) # 刚开始拿数据
# 生成器记录的是代码

012-2018-09-18 生成器相关推荐

  1. 2018.09.18 atcoder Many Formulas(搜索)

    传送门 感觉自己搜索能力退化了,这种弱智搜索写了整整5min,这样下去比赛会凉的. 看来得多练练题了. 代码: #include<bits/stdc++.h> #define ll lon ...

  2. 2018.09.18 while循环

    **  "loop" 循环   注意要有引号. **pass 过 #打印 1-100 start = 1 while start < 101:print("loop ...

  3. 滴滴 2019校园招聘笔试编程题-2018.09.18

    输入: slep slap sleep step shoe shop snap slep 输出: slep slap step 代码是交卷后写出来的,没有经过测试,不知道是否能够AC 利用DP求出每个 ...

  4. 【跃迁之路】【590天】程序员高效学习方法论探索系列(实验阶段347-2018.09.18)...

    @(跃迁之路)专栏 [跃迁之路]奖励金计划正式开始 从2018.7.1起,[跃迁之路]奖励金计划正式起航,从今以后,, 每月1日,我会将自己个人上月收入的1%计入[跃迁之路]奖励金池,积累到足够金额后 ...

  5. 2018.03.18 临汾市游记

    2018.03.18 临汾市游记 写在前面 首先,Capella 极其擅长记流水账,包括本文. 其次,本文中所有并列关系的人名,均按字典序排列. 背景 临汾一中 Mr_Wolfram 和 poorpo ...

  6. [转]如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...

    本文转自:http://www.cnblogs.com/yyangblog/archive/2011/01/07/1929657.html 问题概述: 在导入一个app后提示如下错误: "E ...

  7. 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...

    问题概述: 在导入一个app后提示如下错误: "Error generating final archive: Debug Certificate expired on 10/09/18 1 ...

  8. 学习手记(2018/7/14~2018/7/18)——快乐纪中

    2018/7/14:普通的纪中一天 儿子兄弟表示法 将一颗多叉树转换为二叉树的方法,左子节点连原树的第一个儿子,右子节点连原树的右边的兄弟 适用范围:树形dp 数位dp常见方法 状态压缩 分类讨论 记 ...

  9. 训练日志 2018.10.18

    花了一周时间把之前学过的算法和题重新看了一下,重新架构了一下知识体系,对 DP 和搜索有了更深刻的认识,这周正式开始图论内容,抽空再将搜索的优化和 A* 算法学习一下 2018.10.18

  10. 暑期训练日志----2018.8.18

    训练第20天. 上午整理了一下区间DP的知识点和例题,中午补了补线性DP,做了做洛谷上的题,抽时间系统化的整理一下线性DP 家里有事要回济南,两天时间基本废掉了...不知道还能不能在假期结束前看完DP ...

最新文章

  1. Debian Security Advisory(Debian安全报告) DSA-4407-1 xmltooling
  2. 什么是7层负载均衡?
  3. 一次面试引发的思考(中小型网站优化思考)
  4. EntityFramework 学习: Console中初见
  5. spring配置jndi_在Spring Framework中通过JNDI进行配置
  6. python中re怎么念_Python中re(正则表达式)模块学习
  7. Jsp 中遇到待解决问题
  8. jQuery右下角弹出广告
  9. 对于自组织团队的一些思考
  10. CSS3nbsp;Transitionnbsp;Transformnbsp;Animat…
  11. python假分数约分_数学中假分数怎么约分
  12. java中graphics_在java中如何绘图?Graphics类是什么意思?
  13. 一个中年SAP自由职业者的2020年终总结
  14. C语言>>输入两个字符串,比较这两个字符串是否相同并输出比较结果。要求不用任何字符串处理函数。
  15. 局部连接层(Locally-Connected Layer)
  16. 验证码识别论文总结---外文篇
  17. 机载导航设备自动测试系统-ETest
  18. 民间房产抵押借贷 房子说收就收你信吗?
  19. 解决报错:Cause: java.sql.SQLSyntaxErrorException: Table 'myactiviti.act_ge_property' doesn't exist
  20. 感动:我奋斗了18年才和你坐在一起喝咖啡(转)

热门文章

  1. 信息安全管理——消息摘要与数字签名
  2. inverted index
  3. swift 3, swift2
  4. 无镜数码相机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. 两个机器人的聊天记录
  6. c语言scanf运行出现吃回车,scanf读取回车
  7. od机考题目-免单统计-第10讲:高频真题解析 III(上)
  8. C语言,课程管理系统
  9. AI焦虑潮下,打工人的抵抗、转向、破局
  10. 招募 | “壹脑云科研圈“招募新成员啦