Python生成器、三元表达式、列表生成式、字典生成式、生成器表达式

什么是生成器:
只要函数内部包含有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 上面已经去过最大值,再取提示为空

原文地址:https://www.cnblogs.com/yangzhizong/p/9179305.html

时间: 2024-08-30 09:27:47

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

三元表达式,列表生成式,字典生成式,生成器表达式

三元表达式 条件成立时的返回值 if 条件 else 条件不成立时的返回值 def max2(x,y): if x > y: return x else: return y print(max2(10,20)) x=10 y=20 res=x if x > y else y print(res) 列表生成式 #输出1~10中每个数字的平方l=[item**2 for item in range(1,11)] print(l) names=['alex','wxx','lxx'] 为列表中每个人

递归/匿名函数/三元表达式/列表生成式/字典生成式/二分算法

让在下揭开尔等的面纱,一探究竟:) >>>递归: 递归是一个往复的过程,也就是由两个过程组成,一个是计算过程,一个是将值层层返回的过程,递归的奇妙之处,就在于自身调用自身,然后,过程遵循由复杂到简单,最终满足相应条件后,退出,返回结果.说了一大堆,不过直接上代码: test_list = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]] res = 0 def sum_list(test_list, res): f

Python排序,针对列表,字典

Python的内部容器,大概分为:tuple,set,list,dict,就排序来说,对列表和字典的排序需求较多,tuple主要作为不可变容器,set用来去重复,下面把list和dict常见排序方法总结一下: 一.列表 1. list排序很简单,主要看list的元素组成,如果元素是由单值组成,比如下面的方法: >>> a = [1,2,5,3,4] >>> a.sort() >>> print a [1, 2, 3, 4, 5] list本身自带sor

函数 三元表达式 列表生成式 字典生成式 生成器表达式

1.三元表达式 针对 if  条件判断的简写 可以比较下比如: def max2(x,y): if x > y: return x else: return y max2(20,30) ================================================= x=10 y=20 res=x if x > y else y print(res) 真正的核心代码从4条变成了一条就可以解决了 代码形式:条件成立时的返回值    if 条件    else 条件不成立时的返回

190329迭代器-生成器-三元运算-列表解析

一.迭代器 迭代器协议:对象必须提供一个next()方法,执行该方法要么返回迭代中的下一项,要么抛出一个Stoplteration异常终止迭代 可迭代对象:遵循迭代器协议,即可迭代对象,(可以被for循环的就是可迭代对象) l = {1,2,3} iter_l = l.__iter__() #将列表转换为迭代器 print(iter_l.__next__()) print(next(iter_l)) 二.生成器 1.生成器函数 def f(): for i in range(10): yield

Python中元组,列表,字典的区别

Python中,有3种内建的数据结构:列表.元组和字典.1.列表     list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这样python就知道你是在指明一个列表.一旦你创建了一个列表,你就可以添加,删除,或者是搜索列表中的项目.由于你可以增加或删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的,并且列表是可以嵌套的.实例:#coding=utf-8animalslist=['fox','tiger','ra

Python(二)-字符串、列表、字典 、元组、集合

版权声明: 本文作者为-陈鑫 本文的所有内容均来陈鑫总结,未经本人许可,禁止私自转发及使用. QQ: 499741233 E-mail: [email protected] 第1章 字符串处理 1.1 字符串转换 1.1.1 format() 字符串格式化 描    述: 1.花括号声明{}.用于渲染前的参数引用声明,花括号里面可以用数字代表引用参数的序号,或者变量直接引用. 2.从format参数引入的变量名. 3.冒号:为空格填充 4.字符位数声明. 5.千分位的声明. 6.变量类型的声明:

【转】Python元祖,列表,字典,集合的比较

http://rmingwang.com/python-tuple-list-dict-set.html 1. 元组         可以包含不同类型的对象,但是是不可变的,不可以在增减元素,用()来定义.元组的操作: tuple(obj),切片,in,for in,del,cmp,len,max,min #定义一个元组 tuple1 =() tuple1 = tuple({1,2,3,4,5,'6'}) tuple1 = (1, 2, '3', 4, '5') # 定义了一个元组之后就无法再添

python入门字符串、列表、字典基本操作

#字符串操作a = "Hellow World!" #字符串取值print(a[0]) #取指定元素的值print(a[0:7]) #取一定范围的值,取左不取右print(a[7:]) #字符串拼接b = "I lile python!"c = a + b #加号“+”是拼接字符串的print(c) #多次输出# print(c*2) #连续打印两次c #字符串切片print(c.split()) #以空格切割字符串c,输出是列表print(c.split(&quo

Python之元组、列表and 字典

序列: 元组和字符串都是不可变的哦 你看,数据空间不一样了 元组的话,你可以联想到C里面的结构体变量啊,为了包容不同的数据类型: 也可以这样取值哦: 列表:列表是可修改的哦~ 不然数据大了再另外开辟空间那岂不是累死-- 然后呢,字典在列表的基础上加了两个显示的索引(列表隐式的索引可以认为是角标): 我们再来看看字典索引('name' 'age' 'gander')没有加引号回事怎样一种情况呢: 注意看最后一行哦. 对了,没加引号索引就成变量了,惊喜不惊喜,意外不意外?! 要在程序里出现这种情况,