為了理解map,讓我們首先看看什麼是iterables。iterable是任何可以迭代的東西。通常這些是列表或數組,但是Python有許多不同類型的迭代器。您甚至可以創建自己的對象,這些對象可以使用Python中魔法方法進行迭代。這裡有兩個方法:
class Counter: def __init__(self, low, high): # set class attributes inside the magic method __init__ # for "inistalise" self.current = low self.high = high
def __iter__(self): # first magic method to make this object iterable return self def __next__(self): # second magic method if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1「魔法方法是python內置方法,不需要主動調用,存在的目的是為了給python的解釋器進行調用,幾乎每個魔法方法都有一個對應的內置函數,或者運算符,當我們對這個對象使用這些函數或者運算符時就會調用類中的對應魔法方法,可以理解為重寫內置函數。」第一個神奇的方法是用「__ iter__」返回迭代對象,通常在循環開始時使用。
如果我們運行:
for c in Counter(3, 8): print(c)那麼將會輸出:
在Python中,迭代器是一個對象,它只有一個簡單的魔法方法。這意味著您可以訪問對象中的位置,但不能遍歷對象。有些對象將使用方法__next__,如上面代碼中第二個例子。
現在我們知道了什麼是可迭代對象,讓我們回到map函數。map函數允許我們將一個函數應用到iterable中的每個項。通常,我們希望對列表中的每一項都應用一個函數,但是要知道對於大多數迭代器來說都是可能的。Map接受兩個輸入,即要應用的函數和可迭代的對象:
假設我們有一個列表:
我們希望將列表中的每一個數字進行平方,那麼可以這麼寫代碼:
x = [1, 2, 3, 4, 5]
def square(num): return num*num
print(list(map(square, x)))Python中的函數是惰性的。如果我們代碼中不包含「list()」,函數將存儲迭代的定義,而不是一個列表。我們需要顯式地告訴Python「將這個轉換為一個列表」,以便我們使用它。
現在寫一個像「square(num)」這樣的普通函數很好,但是它看起來不太對。我們必須定義一個完整的函數才能在map中使用一次?我們可以使用lambda(匿名)函數在map中定義一個函數。