0
点赞
收藏
分享

微信扫一扫

【菜菜的Python学习日记】Python进阶之装饰器、高阶函数的用法

小猪肥 2022-01-21 阅读 42

请添加图片描述
系列索引:【菜菜的Python学习日记】一笔一划写日记之《Python从入门到入土》

函数的使用方式

  • 高阶函数的用法(filtermap以及它们的替代品)
items1 = list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10))))
items2 = [x ** 2 for x in range(1, 10) if x % 2]
  • globalnonlocal关键字的作用

    global:声明或定义全局变量(要么直接使用现有的全局作用域的变量,要么定义一个变量放到全局作用域)。
    nonlocal:声明使用嵌套作用域的变量(嵌套作用域必须存在该变量,否则报错)。

def nonlocal_test():
    count = 0
    def test2():
        nonlocal count
        count += 1
        return count
    return test2
 
val = nonlocal_test()
print(val())
print(val())
print(val())
以上输出为:123

装饰器

参考知乎大佬的文章,讲的很全很详细。

迭代器和生成器

迭代器是实现了迭代器协议的对象。
  • Python中没有像protocolinterface这样的定义协议的关键字。
  • Python中用魔术方法表示协议。
  • __iter____next__魔术方法就是迭代器协议。
class Fib(object):
    """迭代器"""
    
    def __init__(self, num):
        self.num = num
        self.a, self.b = 0, 1
        self.idx = 0
   
    def __iter__(self):
        return self

    def __next__(self):
        if self.idx < self.num:
            self.a, self.b = self.b, self.a + self.b
            self.idx += 1
            return self.a
        raise StopIteration()
  • 生成器是语法简化版的迭代器。
def fib(num):
    """生成器"""
    a, b = 0, 1
    for _ in range(num):
        a, b = b, a + b
        yield a
  • 生成器进化为协程。
    生成器对象可以使用send()方法发送数据,发送的数据会成为生成器函数中通过yield表达式获得的值。这样,生成器就可以作为协程使用,协程简单的说就是可以相互协作的子程序。
def calc_avg():
    """流式计算平均值"""
    total, counter = 0, 0
    avg_value = None
    while True:
        value = yield avg_value
        total, counter = total + value, counter + 1
        avg_value = total / counter

gen = calc_avg()
next(gen)
print(gen.send(10))
print(gen.send(20))
print(gen.send(30))
举报

相关推荐

0 条评论