python-------------生成器和推导式

#只要有yield关键字的的函数都是生成器函数
#yield不能和return共用且需要写在函数内
def generator():
    print(1)
    yield 'a'
#生成器函数: 执行之后会得到一个生成器作为返回值。
ret = generator()
print(ret)
print(ret.__next__())

def wahaha():
    for i in range(2000000):
        yield '哇哈哈',i

监听文字输出

#只要有yield关键字的的函数都是生成器函数
#yield不能和return共用且需要写在函数内
def generator():
    print(1)
    yield 'a'
#生成器函数: 执行之后会得到一个生成器作为返回值。
ret = generator()
print(ret)
print(ret.__next__())

def wahaha():
    for i in range(2000000):
        yield '哇哈哈',i


#send的获取下一个值得效果和next基本一致,
#只是在获取下一个值得时候,给上一值得位置 传递一个数据
#注意事项:第一次使用生成器必须用next,最后一个yield不能接受外部得值。
#例子:
def generator1():
    print(123)
    content = yield 1

    print('==================',content)
    print(456)
    yield  2

g = generator1()
ret1 =  g.__next__()
print('******',ret1)
ret2 = g.send('hello')
print('*********',ret2)

#计算移动平均值
def average():
    sum = 0
    count = 0
    avg = 0
    while True:
        num = yield avg
        sum += num
        count +=1
        avg = sum /count

avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)


def sehndchegqi():
    a = 'abcde'
    b = '12345'
    yield from a
    yield from b

gg = sehndchegqi()
for i in g:
    print(i)



#列表推导式
egg_list = ['鸡蛋%s'%i for i in range(10)]
print(egg_list)
#输出结果: ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',
# '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']


#生成器表达式

ggg = (i*i for i in range(10))#只能得到一个生成器ggg,
for i in ggg:
    print(i)
'''列表推导式和生成器表达式的不同:1.括号不同,2.返回值不同'''
#相比去列表推导式,其括号不同
#返回值不一样=====几乎不占用内存。

'''------------各种推导式------------------'''
#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]    #遍历之后挨个处理
#[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]   #筛选功能

#列表推导式
#30以内所有能被3整除的数
rett = [i for i in  range(30) if i%3 == 0]
print(rett)
#30以内所有能被3整除的数
rett1 = [i*i for i in  range(30) if i%3 ==0]
print(rett1)
#找到嵌套列表中名字含有俩个‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
name = [ name for lst in names for name in lst if name.count('e') ==2]
print(name)


#字典推导式


# 例一:将一个字典的key和value对调
mcase = {'a': 10, 'b': 34}
# #{10:'a' , 34:'b'}
msat = {mcase[k]:k for k in mcase}
print(msat)
# 例二:合并大小写对应的value值,将k统一成小写
mcase1 = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
# #{'a':10+7,'b':34,'z':3}
mcasedic = {k.lower():mcase1.get(k.lower(),0)+ mcase1.get(k.upper(),0) for k in mcase1}
print(mcasedic)
# print(mcase_frequency)

#集合推导式,自带结果去重功能
squared = {x**2 for x in [1, -1, 2]}
print(squared)

习题小解

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
# for n in [1,10,5]:
#     g=(add(n,i) for i in g)
n = 1
g=(add(n,i) for i in test())
n = 10
g=(add(n,i) for i in (add(n,i) for i in test()))
n = 5
g=(15,16,17,18)


print(list(g))
原文地址:https://www.cnblogs.com/xiangrikuidebuluo/p/9482604.html