Python3简明教程五

这部分主要说明Python3的迭代器、生成器、装饰器等相关知识。

来源:实验楼Python3简明教程

1. 迭代器

Python 迭代器(Iterators)对象在遵守迭代器协议时需要支持如下两种方法。
__iter__(),返回迭代器对象自身。这用在 for 和 in 语句中。
__next__(),返回迭代器的下一个值。如果没有下一个值可以返回,那么应该抛出 StopIteration 异常。

class Counter(object):
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def __next__(self):
        #返回下一个值直到当前值大于 high
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1


>>> c = Counter(5,10)
>>> for i in c:
...   print(i, end=' ')
...
5 6 7 8 9 10
2. 生成器

生成器是更简单的创建迭代器的方法,通过在函数中使用 yield 关键字来完成。

>>> def my_generator():
...     yield 'a'
...     yield 'b'
...     yield 'c'

>>> for char in my_generator():
...     print(char)
a
b
c

>>> def counter_generator(low, high):
...     while low <= high:
...        yield low
...        low += 1
... 
>>> for i in counter_generator(5,10):
...     print(i, end=' ')
... 
5 6 7 8 9 10

当调用生成器函数时它返回一个生成器对象。如果把这个对象传入 dir() 函数,会在返回的结果中找到 __iter____next__ 等多个方法名。
任何一个生成数据的含有 __iter__ 方法的类都可以用作对象生成器。

  • 生成器表达式
    生成器表达式是列表推导式和生成器的一个高性能,内存使用效率高的推广。
    生成器表达式的语法要求其总是直接在在一对括号内,并且不能在两边有逗号。
>>> sum(x*x for x in range(1,10))
285
>>> g = (x*x for x in range(1,10))
>>> g
 at 0x7fc559516b90>
3. 装饰器

装饰器(Decorators)用来给一些对象动态的添加一些新的行为。

>>> def my_decorator(func):
...     def wrapper(*args, **kwargs):
...         print("Before call")
...         result = func(*args, **kwargs)
...         print("After call")
...         return result
...     return wrapper
...
>>> @my_decorator
... def add(a, b):
...     #我们的求和函数
...     return a + b
...
>>> add(1, 3)
Before call
After call
4
  • 闭包
    闭包(Closures)是由另外一个函数返回的函数。使用闭包可以去除重复代码。
>>> def add_number(num):
...     def adder(number):
...         #adder 是一个闭包
...         return num + number
...     return adder
...
>>> a_10 = add_number(10)
>>> a_10(21)
31
>>> a_10(34)
44
这部分内容较为复杂,更多详情可以去上述链接中好好实践实践,或查询一些资料。

你可能感兴趣的:(Python3简明教程五)