生成器、杂项

生成器

1.什么是生成器?
在函数内但凡出现 yield关键字,再调用函数就不会执行函数体代码,会返回一个值,该值称之为生成器

生成器本质就是迭代器

2.为什么要有生成器?

    生成器是一种自定义迭代器的方式

3.如何用生成器

# 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)
# print(g.__iter__().__iter__().__iter__() is g)
# res1=next(g)
# print('第一次的返回值:',res1)

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

# print('='*100)
# res3=next(g)
# print('第三次的返回值:',res3)

# print('='*100)
# res4=next(g)
# print('第三次的返回值:',res4)

# for item in g: #g=iter(g) #item=next(g)
#     print(item)

# i=range(1,1000)
# for item in range(1,100000000000000):
#     print(item)

###########################################

def my range(start,stop,step=1):

    while start<stop:
        yield start #暂停
        start+=step

g=my_range(1,5,2)   #1 3

print(next(g))
print(next(g))
print(next(g))
print(next(g))
for item in g:

    print(item)

总结yield的功能
1、提供一种自定义迭代器的方式

2、yield可以暂停住函数,返回值

yield VS return
相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制

不同点:return只能返回一次值,yield可以返回多次值了解知识
yield 值

x=yield

x=yield 值

def dog(name):

    food_list=[ ]
    print('狗哥 %s 准备开吃' %name)
    while True:
        food=yield food_list  #暂停 food=yield='一桶泔水'
        print('狗哥[%s]吃了<%s>' %(name,food))
         food_list.append(food)

alex_dog=dog('alex')
res1=next(alex_dog) #初始化,即让狗准备好
print(res1)

next(alex_dog)     #等同于alex_dog,send(None)

next(alex_dog)

res2=alexa_dog.send(('一泡翔','咖啡伴侣'))
print(res2)
res3=alex_dog.send('一桶泔水')

print(res3)

杂项

三元表达式

条件成立时的返回值    if 条件 else 条件不成立时的返回值

def max2(x,y):
    if x>y:
        return x
    else:

        return y

列表生成式

l=[item**2 for item n range(1,11)]

print(l)

###########################################

names=['alex','wxx','lxx']
l=[ ]
for name in names:
    l.append(name +'SB')

names=l

print(l)

下列代码执行效果等同于上面的,因为三元表达式的列表生成式,代码量更少,代码更简洁但最多for两层,不然会失去三元表达式的优势

names=[name+'SB' for name in names]

print(names)

例1:

names=['alex','wxx','egon','lxx','zhangmingyan']

l=[ ]
for name in names:

    if name !='egon':
        l.append(name + 'SB')
names=l

print(l)

一行代码代替上面多行,结果相同.......

names=[name+ 'SB' for name in names if != '']

print(names)

例2:

l=[item**2 for item in range(1,5) if item >2]

print(l)

例3:

names=['egon','alex_sb','wupeiqi','yuanhao']
names=[name.upper() for name in names]

print(names)

例3:

names=['egon','alex_sb','wupeiqi','yuanhao']
nums=[len(names) for name in names if not name.endswith('sb')] 

print(nums)

字典生成式:

s1='hello'

l1=[1,2,3,4,5]

res=zip(s1,l1)
print(res)

print(list(res))
# 结果:[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]
keys={'name':1,'age':2,'sex':3}
a=keys
print(a)
keys=['name','age','sex']
values=['egon',18,'male']
d={k:v for k,v in zip(keys,values)}
print(d)

例1:

#keys={'name':1,'age':2,'sex':3}
#a=key

#print(a)

keys=['name','age','sex']
values=['egon',18,'male']
d={k:v for k,v in zip(keys,values)}
print(d)

结果:

{'name': 'egon', 'age': 18, 'sex': 'male'}

例2:
常规做法

info={'name': 'egon', 'age': 18, 'sex': 'male'}
keys=info.keys()
print(keys)
iter_keys=keys.__iter__()
values=info.values()

print(values)

三元表达式:

info={'name': 'egon', 'age': 18, 'sex': 'male'}
keys=info.keys()
d={k:v for k,v in zip(keys,values)}

print(d)
结果:

{'name': 'egon', 'age': 18, 'sex': 'male'}

生成器表达式

g=(i for i in range(10))
# print(g)
print(next(g))
print(next(g))

nums=[11,22,33,44,55]
print(max(nums))

with open('a.txt',encoding='utf-8') as f:
    nums=(len(line) for line in f)
    print(max(nums))
print(max(nums))
print(max(nums))


l=['egg%s' %i for i in range(100)]
print(l)

g=('egg%s' %i for i in range(1000000000000))
# print(g)
print(next(g))
print(next(g))

[ ] 返回的是列表 内存占用大
{ }返回的是字典或者集合 内存占用大
( ) 返回的是生成器,内存占用小,文件再大也没关系,都是逐行代码执行的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值