1、生成器函数

# 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数
# yield: 相当于return 可以返回数据. 但是yield不会彻底中断函数. 分段执行函数.
# gen.__next__() 执行函数. 执行到下一个yield.
# gen.__next__() 继续执行函数到下一个yield.

不用生成器可能导致内存不够

def order():
lst = []
for i in range(10000):
lst.append("衣服"+str(i))
return lst
ll = order()
print(ll)

使用生成器逐个输出

def order():
for i in range(10000):
yield "衣服"+str(i)
g = order() # 获取生成器
mingwei = g.__next__()
print(mingwei)
#输出衣服0
zhaoyining = g.__next__()
print(zhaoyining)
#输出衣服1

2、send()用法

# send() 和__next__()是一样的. 可以执行到下一个yield, 可以给上一个yield位置传值

def func():
print("我是第一个段")
a = yield 123
print(a)
print("石可心是第二段")
b = yield 456
print(b)
print("赵一宁是第三段")
c = yield 789
print(c)
print("刘伟是最后一个段")
yield 79 # 最后收尾一定是yield,否则会报错
g = func()
print(g.__next__())#没有上一个yield 所以不能使用send() 开头必须是__next__()
print(g.send("煎饼果子"))#赋值给a
print(g.__next__())
print(g.__next__())
#我是第一个段
#
#煎饼果子
#石可心是第二段
#
#None
#赵一宁是第三段
#
#None
#刘伟是最后一个段
#
def eat():
print("我吃什么啊")
a = yield "馒头"
print("a=",a)
b = yield "鸡蛋灌饼"
print("b=",b)
c = yield "韭菜盒子"
print("c=",c)
yield "GAME OVER"
gen = eat() # 获取生成器
ret1 = gen. __next__()
print(ret1) # 馒头
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send( "猫粮")
print(ret4)
#我吃什么啊
#馒头
#a= 胡辣汤
#鸡蛋灌饼
#b= 狗粮
#韭菜盒子
#c= 猫粮
#GAME OVER

# for的内部一定有__next__()

def func():
yield 1
yield 13
yield 26
yield 88
yield 46
yield 100
for i in func(): # for的内部一定有__next__()
print(i)
print(list(func())) # 内部都有__next__()

3、推导式

# 推导式: 用一句话来生成一个列表(列表推导式)

lst = []
for i in range(1, 16):
lst.append("python"+str(i))
print(lst)
#等同于下列推导式
lst = ["python"+str(j) for j in range(1,16)]
print(lst)

# 语法:  [结果  for循环 判断]

lst = [i for i in range(100) if i%2==1]
print(lst)

# 100以内能被3整除的数的平方

lst = [i*i for i in range(100) if i%3==0]
print(lst)

# 寻找名字中带有两个e的人的名字

names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,'Joe'],
[ 'Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 1]]
lst = [name for line in names for name in line if type(name) == str and name.count("e") == 2]
print(lst)

#for循环写法

names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,'Joe'],
[ 'Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 1]]
lst = []
for line in names:
for name in line:
if name.count("e") == 2:
print(name)

#字典推导式

# 语法:{k:v for循环 条件筛选}

# [11,22,33,44] => {0:11,1:22,2:33,3:44}
lst = [11,22,33,44]
dic = {i:lst[i] for i in range(len(lst)) if i < 2}#字典推导式就一行
print(dic)
#输出{0: 11, 1: 22}
dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}
d = {v : k for k,v in dic.items()}
print(d)
#输出{'赵四': 'zs', '刘能': 'ln', '周杰伦': 'jay', '林俊杰': 'jj'}

#集合推导式(可去除重复)

lst = [1, 1, 4, 6,7,4,2,2]
s = { el for el in lst }
print(s)
#输出{1, 2, 4, 6, 7}

4、生成器表达式(多看看)

# 生成器函数
def func():
print(111)
yield 222
yield 333
g = func() # 获取生成器
g2 = (i for i in g) # 生成器
g3 = (i for i in g2) # 生成器
print(list(g))#输出111 [222, 333] 源头. 从源头把数据拿走了
print(list(g2))#输出[] 这里执行的时候. 源头已经没有数据
print(list(g3))#输出[] 这里也没有值了

#注意此题思想

# 求和
def add(a, b):
return a + b
# 生成器函数 # 0-3
def test():
for r_i in range(4):
yield r_i
# 0,1,2,3
g = test() # 获取生成器
for n in [2, 10]:
g = (add(n, i) for i in g)
print(list(g))
#输出[20, 21, 22, 23]

5、题目

1.求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表

lst = [(i,j) for i in range(5) for j in range(5) if i%2 ==0 and j %2 ==1]
print(lst)
#输出[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

python note 12 生成器、推导式的更多相关文章

  1. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  2. python ---12 生成器 推导式

    一.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 1.创建生成器 最后以yield结束 1. 通过⽣成器函数   2. ...

  3. python之路---12 生成器 推导式

    三十.函数进阶 1.生成器    函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 ①创建生成器       最后以yield结束 ...

  4. 12.Python略有小成(生成器,推导式,内置函数,闭包)

    Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...

  5. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  6. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  7. Python——生成器&推导式

    生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...

  8. Python之路-迭代器 生成器 推导式

    迭代器 可迭代对象 遵守可迭代协议的就是可迭代对象,例如:字符串,list dic tuple set都是可迭代对象 或者说,能被for循环的都是可迭代对象 或者说,具有对象.__iter__方法的都 ...

  9. python 列表推导式,生成器推导式,集合推导式,字典推导式简介

    1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...

随机推荐

  1. 【原创】Windows上应用程序报错常用分析方法总结

    在日常使用Windows的过程中,经常会遇到应用程序不能正常启动.关闭等使用问题.对于Windows来说,解决这些问题的方法比较多,大多时候我们可以通过百度或谷歌搜索来解决.但更多的时候,我们需要找出 ...

  2. java 的Date 日期相关操作

    String 与 Date互转(1)基于SimpleDateFormat实现: package com.bky.df; import java.text.ParseException; import ...

  3. springboot项目简单启动脚本

    #!/bin/bash function log_info () { DATE=`date "+%Y-%m-%d %H:%M:%S"` USER=$(whoami) echo &q ...

  4. Nginx 负载配置

    简版的,详细参数需要自己微调. nginx.conf http{ upstream name { server 127.0.0.1:8777; server 127.0.0.1:8778; serve ...

  5. LeetCode 24. Swap Nodes in Pairs 成对交换节点 C++/Java

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  6. 关于前段JS代码报错问题的解决方法

    最近接手别人的一个项目,项目导入到Myeclipse中,JS代码一直报错,说missing semicolon.该错误是Myeclipse在检查JS代码的过程出现的. 后来经过检查,发现JS代码本身没 ...

  7. servlet对象的生命周期

    servlet对象默认第一次访问的时候创建,服务器关闭的时候销毁.当servlet对象创建的时候会调用init方法,当对象销毁的时候,会调用destroy方法,每次访问servlet时,都会调用ser ...

  8. python3百度设置高级搜索例子

    #=======================================#作者:邓沛友#2018.12.16=============================coding:utf-8f ...

  9. go 语言学习笔记(一)

    本次学习目的:熟悉了解 go 语言特点,实现基本功能. 1.readfile.go package main import ( "bufio" "fmt" &q ...

  10. django原生sql查询如何返回字典格式

    django原生sql查询,默认返回的是元祖.如果想返回字典格式,需要自行封装: http://www.360doc.com/content/17/0802/11/9200790_676042880. ...