1.map

# map函數會接受兩個參數,一個是function,一個是繼承iterable的物件
# map函數會把傳入的function依序作用到iterable的每個element,並把結果傳回一個map物件繼承iterator
def f(x):
    return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(hasattr(r,'__next__')) # True,查看有沒有__next__方法,所以是iterator
# print(next(r)) # 1
# print(next(r)) # 4
print(list(r)) # 因為iterator只有當呼叫時才會計算,所以轉換成list

2.reduce

# reduce函數一樣接受兩個參數,一個是function,一個是繼承iterable的物件,傳入的函數要能夠接受兩個參數
# reducec會把結果和下個序列元素做運算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

# 例如把list轉換成整數
from functools import reduce
def fn(x, y):
    return x * 10 + y
reduce(fn, [1, 3, 5, 7, 9]) # 13579

# 如果考慮字串的話,設計一個函數
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def str2int(s):
    def fn(x, y):
        return x * 10 + y
    def char2num(s):
        return DIGITS[s]
    return reduce(fn, map(char2num, s))
# 使用lambda函數
def str2int(s):
    def char2num(s):
        return DIGITS[s]
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))

# 以下都可以轉換成int
str2int('123')
str2int(['1','2','3'])
# 練習一個題目,把浮點數字串轉成float
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def char2num(s):
    return DIGITS[s]
def str2float(l):
    a,b = l.split('.')
    # a是小數點以前
    big = reduce(lambda x,y:x*10+y,map(char2num,a))
    # b是小數點以後
    re_b = b[::-1]
    small = reduce(lambda x,y:x/10+y,map(char2num,re_b))
    return big+small/10

print('str2float(\'123.456\') =', str2float('123.456'))
if abs(str2float('123.456') - 123.456) < 0.00001:
    print('成功!')
else:
    print('失敗!')

3.filter

# 一樣是接收一個函數和一個iterable,filter會把函數運作在每個iterable的element上,
# 然後根據回傳的布林值是True還是False,決定要不要保留該element

# 判斷是否為奇數
def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # [1,5,9,15]

# 判斷數字以相反順序排序是否還是相等,例:12321、101
def is_equal(n):
    return str(n) == str(n)[::-1]
list(filter(is_equal, range(1,500))) # [1~9,11,22,33...]

4.sorted

# sorted是一個高階函數,sorted還可以透過key參數傳入一個自定義的函數來做比較
sorted([36, 5, -12, 9, -21]) # [-21, -12, 5, 9, 36]
sorted([36, 5, -12, 9, -21], key=abs) # [5, 9, -12, -21, 36]

# 練習用成績來排序tuple
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_score(n):
    return n[1]
sorted(L,key=by_score)

results matching ""

    No results matching ""