python第五天

一、简单生成器函数

  与函数不同的是返回不用return,而是用yield。生成器函数返回的是一个迭代器。

def func():
    print(1)
    yield 2
    print(3)
    yield 4
a =func()
for i in a:
    print(i)
a =func()
print(a.__next__())
print(a.__next__())

  例子:要求生产100000个包子,但是又不可能一次性吃完,每次调用eat()函数时,传入要吃的数量,在进行生产,

  不会造成控件的浪费

def produce():
    for i in range(1,100001):
        yield i
a = produce()
def eat(num):
    for i in range(num):
        print(a.__next__())
eat(10)
eat(20)
例子

二、生成器函数进阶

  使用next()和send()

  使用send()的注意事项:

    第一次使用生成器时,必须使用next

    最后一个yield不能接收send传递的值

def func():
    print(1)
    content = yield 2
    print(content)
    yield 4
a =func()
print(a.__next__())
print(a.send(10))
使用send取值

   计算平均值例子,增加循环流程

def average():
    sum = 0
    avg = 0
    count = 0
    while True:
        num = yield avg
        count += 1
        sum += num
        avg = sum/count
f = average()
f.__next__()
ret = f.send(10)
ret = f.send(20)
print(ret)
计算平均值

  添加修饰器,使得不用一开始使用next

def init(func):
    def inner(*args,**kwargs):
        g = func(*args,**kwargs)
        g.__next__()
        return g
    return inner
@init
def average():
    sum = 0
    avg = 0
    count = 0
    while True:
        num = yield avg
        count += 1
        sum += num
        avg = sum/count
f = average()
ret = f.send(10)
ret = f.send(20)
ret = f.send(30)
print(ret)
计算平均值,添加修饰器的方法

  yield from就是yield的对象是迭代返回的,

  例如:

    yield from ‘12’ 这一句就相当于

    yield 1

    yield 2

def func():
    yield from '123'
    yield from [7,8,9]
g = func()
for i in g:
    print(i)
yield from

三、列表推导式

  1、循环模式

    简单循环

l1 = [i for i in range(2,10,2)]
print(l1)
#结果:[2, 4, 6, 8]

 

     带有表达式的循环

#打印1-10的平方
l1 = [i*i for i in range(1,11)]
print(l1)
#结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

#打印小米2到小米9
mi_list=['小米{}'.format(i) for i in range(2,10)]
print(mi_list)
#结果:['小米2', '小米3', '小米4', '小米5', '小米6', '小米7', '小米8', '小米9']

 

  2、筛选模式

    单层筛选

#筛选大于10的数
numbers = [45,7,63,2,25,84,8,87,54,8,76,2,45,19]
print([number for number in numbers if number >10])
#结果:[45, 63, 25, 84, 87, 54, 76, 45, 19]

    迭代列表中的列表,这个地方列表中的元素必须都是可迭代的

#筛选大于10的数
numbers = [[45,7,63,2],[25,84,8,87,54],[8,76,2,45,19]]
print([number for list in numbers for number in list if number >10])
#结果:[45, 63, 25, 84, 87, 54, 76, 45, 19]

 

四、生成器表达式

  生成器表达式和列表推导式的区别:

    1、生成器表达式使用(),列表推导式使用[]

    2、生成器表达式返回一个生成器,列表推导式返回一个列表

  一个简单的生成器表达式例子:

l1 = (i for i in range(2,10,2))
print(l1)             
#结果:<generator object <genexpr> at 0x00000206C615A408>
print(l1.__next__())    
#结果:2

 

五、字典推导式、集合推导式

  字典推导式

a = {i:"第{}个".format(i) for i in range(1,6)}
print(a)
#结果:{1: '第1个', 2: '第2个', 3: '第3个', 4: '第4个', 5: '第5个'}

  集合推导式

  集合推导式多了个去重的功能

b = {i*i for i in [1,-1,2,-2]}
print(b)
#结果:{1, 4}

 

 

 

学习链接

https://www.cnblogs.com/jin-xin/articles/10858058.html

http://www.cnblogs.com/Eva-J/articles/7213953.html#_label7

posted @ 2019-05-13 21:56  敲代码的彭于晏  阅读(168)  评论(0)    收藏  举报