Python3簡明教程五

這部分主要說明Python3的迭代器、生成器、裝飾器等相關知識。

來源:實驗樓Python3簡明教程

1. 迭代器

Python 迭代器(Iterators)對象在遵守迭代器協(xié)議時需要支持如下兩種方法。
__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. 生成器

生成器是更簡單的創(chuàng)建迭代器的方法,通過在函數(shù)中使用 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

當調用生成器函數(shù)時它返回一個生成器對象。如果把這個對象傳入 dir() 函數(shù),會在返回的結果中找到 __iter____next__ 等多個方法名。
任何一個生成數(shù)據(jù)的含有 __iter__ 方法的類都可以用作對象生成器。

  • 生成器表達式
    生成器表達式是列表推導式和生成器的一個高性能,內(nèi)存使用效率高的推廣。
    生成器表達式的語法要求其總是直接在在一對括號內(nèi),并且不能在兩邊有逗號。
>>> sum(x*x for x in range(1,10))
285
>>> g = (x*x for x in range(1,10))
>>> g
<generator object <genexpr> at 0x7fc559516b90>
3. 裝飾器

裝飾器(Decorators)用來給一些對象動態(tài)的添加一些新的行為。

>>> 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):
...     #我們的求和函數(shù)
...     return a + b
...
>>> add(1, 3)
Before call
After call
4
  • 閉包
    閉包(Closures)是由另外一個函數(shù)返回的函數(shù)。使用閉包可以去除重復代碼。
>>> 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
這部分內(nèi)容較為復雜,更多詳情可以去上述鏈接中好好實踐實踐,或查詢一些資料。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容