什么是生成器:
只要函数内部包含有yield关键字,那么函数名()的到的结果(生成器地址)就是生成器,
再调用函数不会执行函数内部代码
这个生成器本身有  _iter_  he  _next_功能(即生成器就是一个迭代器)

为什么要用生成器:
生成器是一种自定义迭代器的方式

总结yield的功能
1、提供一种自定义迭代器的方式
2、yield可以暂停住函数,返回值

yield he return
相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制
不同点:return只能返回一次值,yield可以返回多次值

1.生成器next取值,例如1:
def func():                          #第一步:定义函数
    print('first1')
    print('first2')
    print('first3')
    yield 1 #暂停
    print('second1')
    print('second2')
    print('second3')
    yield 2  #暂停
    print('third')
    yield 3 #暂停
    print('fourth')
g=func()                             #调用函数,不执行函数体代码(只是得到了生成器即迭代器)
print(g)
res1=next(g) #把yield后面的返回值赋值给res1  #取到一个值,这个值是由func中的yield控制的,所以next后会逐一从上到下打印           
print('第一次的返回值:',res1)

print('='*100)
res2=next(g)
print('第二次的返回值:',res2)

输出结果为:
<generator object func at 0x05597BD0>
first1
first2
first3
第一次的返回值: 1
===============================================================
second1
second2
second3
第二次的返回值: 2

1.生成器next取值(for循环),例如2:

for item in g:  #g=iner(g)  #item=next(g)
    pass        #注意next(g)只会打印函数体print的结果,碰到yield会暂停pass,yield,继续下次循环

输出结果:
first1
first2
first3
second1
second2
second3
third
fourth

实际每次yield的值已经赋值给了item=next(g),item,只是上面没有打印
for item in g:
    print(item)
first1
first2
first3
1
second1
second2
second3
2
third
3
fourth

2.自定义range函数模型(例如:my_range)
def my_range(start,stop,step=1):
    while start < stop:
        yield start
        start+=step

obj=my_range(1,7,2) #顾头不顾尾只能从1,2,3,4,5,6中取值
print(next(obj))    #1
print(next(obj))    #3
print(next(obj))    #5
print(next(obj))   #报错StopIteration

3.三元表达式 (条件成立时返回值 if 条件 else 条件不成立时返回值)
x=10
y=20
res = x if x > 10 else y
print(res)

4.列表生成式:(值放在for循环的左边))(给一筐鸡蛋)

#原始取值
l=[]
for i in range(1,11):
    l.append(i)
    print(l)
 
改进为:
l=[i for i in range(1,11)]
print(l)     #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  得到的是一组列表,占内存空间大

例如1:
names=['alex','wxx','lxx']
names=[name+'SB' for name in names]
print(names)  #['alexSB', 'wxxSB', 'lxxSB']

5.生成器表达式:(给一只鸡)
# 相对列生成式省空间,刚开始什么都不执行,t本身就是一个迭代器,需要逐一取值
t=(i for i in range(100000000))
print(t)       #<generator object <genexpr> at 0x05057BD0> 得到的是一个生成器不占内存空间
print(next(t))  #0
print(next(t))  #1
print(next(t))  #2

6.字典生成式:()
keys=['name','age','sex']
values=['egon',18,'male']
res=zip(keys,values)
print(list(res))    #[('name', 'egon'), ('age', 18), ('sex', 'male')]
方式一
d={ }
for k,v in zip(keys,values):
    d[k]=v
print(d)   #{'name': 'egon', 'age': 18, 'sex': 'male'}

方式二
d={k:v for k,v in zip(keys,values)}
print(d)   #{'name': 'egon', 'age': 18, 'sex': 'male'}

7.zip()拉链函数:
s='hello'
l=[1,2,3,]
res=zip(s,l)
print(list(res))    #[('h', 1), ('e', 2), ('l', 3)]

8.max函数(取位数最长的值len)
情况1:
with open('a.txt',encoding='utf-8') as f:
    nums=[len(line) for line in f]  #【】nums里面已经把值全部存放到列表中
    print(max(nums))                   #返回值32
print(max(nums))   #在任何地方取都OK   #返回值32
# 情况2:
with open('a.txt',encoding='utf-8') as f:
    nums=(len(line) for line in f)  #如果(),nums是迭代器对象,每取一次里面就没有了
    print(max(nums))                   #返回值32
print(max(nums))   #max() arg is an empty sequence 上面已经去过最大值,再取提示为空

Python生成器、三元表达式、列表生成式、字典生成式、生成器表达式的更多相关文章

  1. Python 函数递归-三元表达式-列表生成式-字典生成式-匿名函数-内置函数

    上节课复习: 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res ...

  2. Python 列表生成式 & 字典生成式

    Python 列表生成式 & 字典生成式 通过生成式可以更加简洁地生成列表和字典 列表生成式 对比 直接生成数据后加入列表示例: user_list = list() for i in ran ...

  3. Python中多个列表与字典的合并方法

    Python中多个列表与字典的合并方法 1多列表的合并 1)a+=b a=['] b = ['] a += b print(a) >>>['] 2) a.extend(b) a=[' ...

  4. Python 元祖、列表、字典、文件(转载)

    转自http://yangsq.iteye.com/category/20857 python的元组.列表.字典数据类型是很python(there python is a adjective)的数据 ...

  5. python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04

    递归 递归: # 函数在调用阶段直接或间接地又调用了自身 应用场景: # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)   -->  l = [1, [2, [3, [4, [5, ...

  6. python迭代器 生成器 三元运算 列表解析

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...

  7. day13 生成器 三元运算 列表解析

    本质上来说生成器迭代器都是一种数据类型,如果你直接打印生成器是无法得出值的,会得到一串内存地址,即一个对象想要得到生成器的值必须要用for或者next,list等来获取 生成器生成器就是一个可迭代对象 ...

  8. python数据结构-如何在列表、字典、集合中根据条件筛选数据

    如何在列表.字典.集合中根据条件筛选数据 问题举例: 过滤列表[1, 2, 5, -1, 9, 10]中的负数 筛选字典{“zhangsan”:97, "lisi":80, &qu ...

  9. Python中元组、列表、字典的遍历和相互转化

    一.元组,列表,字典的遍历 1.1 元组的遍历 元组的遍历借助 range() 函数,基本思想是通过元组的长度使用for循环进行遍历,代码如下:     fruits=("apple&quo ...

  10. python 三元表达式 列表推导式,生成器表达式。递归,匿名函数, 内置函数

    三元表达式 三元表达式仅应用于: 1.条件成立返回一个值 2.条件不成立返回一个值 res = x if x>y else y print(res) name= input("姓名&g ...

随机推荐

  1. SQL Server扩展事件system_health会话总结

    system_health会话概念 我们知道扩展事件(Extended Events)是从SQL Server 2008开始引入的.system_health会话是SQL Server默认包含的扩展事 ...

  2. LeetCode Remove Linked List Elements 删除链表元素

    题意:移除链表中元素值为val的全部元素. 思路:算法复杂度肯定是O(n),那么就在追求更少代码和更少额外操作.我做不出来. /** * Definition for singly-linked li ...

  3. python_94_类变量实例变量

    class Role: n=123#类变量 name='我是类name' list=[] def __init__(self,name,role,weapon,life_value=100,money ...

  4. mybatis association嵌套association的两级嵌套问题

    今天遇到了一个双表连接查询以及自关联的问题,由于第一次遇到,所以在这记下,日后好查阅 针对一个表的关联属性本身也有自关联的情况下,可以用association嵌套association的方法来处理. ...

  5. JavaScript -- DOM事件

    什么是事件 事件就是文档或浏览器窗口中发生的一些特定的交互瞬间.比如你在网页上见到的鼠标点击一个按钮,按钮的颜色发生了变化,就是因为这个标签绑定了点击事件 鼠标事件 onload:页面加载时触发 on ...

  6. Mybatis学习记录(3)

    1.输出映射和输入映射 Mapper.xml映射文件定义了操作数据库的sql,每个sql就是一个statement,映射文件是mybatis的核心. (1)parameterType(输入类型)   ...

  7. HTML5<nav>元素

    HTML5中<nav>元素定义页面导航链接的部分区域,但并不是所有的链接都放到nav元素里面. 实例: <header id="pageHeader"> & ...

  8. Eclipse:Win10中设置Courier New字体

    问题:在Eclipse中设置字体的时候,没有找到Courier New字体.系统为Win10. 解决:Eclipse使用的字体为系统字体.在系统字体中有一部分是隐藏的.Courier New已经在系统 ...

  9. Java Object类 instanceof关键字 练习:判断是否为同一人 集合按照人的年龄排序,如果年龄相同按名字的字母顺序升序 Comparator比较器

    package com.swift; public class Same_Person_Test { public static void main(String[] args) { /* * Obj ...

  10. OpenCV3.42+VS2017配置+模块计算机类型“X86”与目标计算机类型“x64”冲突”的问题解决

    目录 OpenCV3.42+VS2017配置 Visual Studio 2017 第三方依赖设置,附加依赖项和附加库目录 "fatal error LNK1112: 模块计算机类型&quo ...