python 高階函數

來源:互聯網
上載者:User

標籤:反轉   比較   迭代器   sorted   組合   多個   數列   reverse   元素   


# 高階函數
# 數學概念 y = g(f(x))
# 高階函數必須滿足至少一個條件
# 1 接受一個或多個函數作為參數(如:f(x))
# 2 返回一個函數對象

def counter(base):
def inner(step = 1): # 當成本地變數來理解
nonlocal base
base = base + step
return base
return inner

foo1 = counter(10)
foo2 = counter(10)
print(foo1 == foo2) # false

# 自訂sort函數
# 1
lst = [1, 2, 5, 4, 2, 3, 5, 6]
def sort(iterable):
ret = []
for x in iterable:
for i, y in enumerate(ret): # 函數用於將一個可遍曆的資料對象組合為一個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。
if x > y:
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort(lst))
# 2
lst = [1, 2, 5, 4, 2, 3, 5, 6]
def sort(iterable, reverse=False):
ret = []
for x in iterable:
for i, y in enumerate(ret):
flag = x>y if reverse else x<y
if flag:
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort(lst))
# 3
lst = [1, 2, 5, 4, 2, 3, 5, 6]
def comp(a, b):
return a < b
def sort(iterable, key=comp, reverse=True):
ret = []
for x in iterable:
for i, y in enumerate(ret):
flag = key(x, y) if reverse else key(y, x)
if flag:
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort(lst))
# 4
lst = [1, 2, 5, 4, 2, 3, 5, 6]
def sort(iterable, key=lambda a,b:a<b, reverse=False):
ret = []
for x in iterable:
for i, y in enumerate(ret):
flag = key(x, y) if reverse else key(y, x)
if flag:
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort(lst))

# 5 最終的高階函數
lst = [1, 2, 5, 4, 2, 3, 5, 6]
def sort(iterable, key=lambda a,b:a<b):
ret = []
for x in iterable:
for i, y in enumerate(ret):
if key(x, y):
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort(lst))
print(sort(lst, lambda a,b:a>b))

# 6
lst = [1, 2, 5, 4, 2, 3, 5, 6]
def sort(iterable, key=None):
ret = []
if key is None:
key = lambda a,b:a<b
for x in iterable:
for i, y in enumerate(ret):
if key(x, y):
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort(lst))
print(sort(lst, lambda a,b:a>b))

# 內建函數-高階函數
# sorted(iterable[, key][, reverse]) --> 值不變
# 對一個可迭代對象的所有元素排序,返回一個新的列表,定序為key定義的函數,reverse表示是否反轉
# sorted(lst, key=lambda x:6-x) 返回新列表
lst = [1, 2, 5, 4, 2, 3, 5, 6, 7]
print(sorted(lst, key=lambda x:6-x)) # key函數只是用來比較,不影響排序
# list.sort(key=lambda x:6-x) 就地修改
lst = [1, 2, 5, 4, 2, 3, 5, 6, 7]
print(lst.sort(key=lambda x:6-x))

# filter(function, iterable) --> 留下要的值 filter object
# 過濾可迭代對象的元素,返回一個迭代器
# function一個具有一個參數的函數,返回bool
# 例:過濾出數列中能被3整除的數字
print(list(filter(lambda x:x%3==0, [1, 9, 55, -3, 78, 28, 123])))

# map(function, *iterables) --> 返回新的值 map object
# 對多個可迭代對象的元素按照指定的函數進行映射,返回一個迭代器
# list(map(lambda x:2*x+1, range(5)))
print(list(map(lambda x:2*x+1, range(5))))
# dict(map(lambda x:(x%5, x), range(500)))
print(dict(map(lambda x:(x%5, x), range(500)))) {0: 495, 1: 496, 2: 497, 3: 498, 4: 499}

python 高階函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.