1. 程式人生 > >(六)Python函數語言程式設計1:高階函式 Higher-order-function

(六)Python函數語言程式設計1:高階函式 Higher-order-function

# 高階函式 Higher-order-function


# 變數可以指向函式
# 以Python內建的求絕對值的函式abs()為例,呼叫該函式用以下程式碼:
print(abs(-10)) # 10
print(abs) # <built-in function abs>

# 如果把函式本身賦值給變數呢?
f = abs
print(f) # <built-in function abs>
print(f(-2)) # 2

# 說明變數f現在已經指向了abs函式本身。直接呼叫abs()函式和呼叫變數f()完全相同。
# 函式名也是變數


# 1. 函式名做引數    常用等級:*****
def add(x, y):
    return x + y

def func(x, y, f):
	return f(x, y)

print(func(1, 2, add)) # 3

# 把函式作為引數傳入,這樣的函式稱為高階函式,函數語言程式設計就是指這種高度抽象的程式設計正規化。




# 2. map			常用等級:***

def f(x):
	return x * x

r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(r) # <map object at 0x0000000002124C88>
print(list(r)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

# map()傳入的第一個引數是f,即函式物件本身。由於結果r是一個Iterator,
# Iterator是惰性序列,因此通過list()函式讓它把整個序列都計算出來並返回一個list。

# list每一個元素都呼叫str函式轉為字串
print(list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']



# 3. reduce 			常用等級:***
# reduce把一個函式作用在一個序列[x1, x2, x3, ...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下一個元素做累積計算

from functools import reduce
def add(x, y):
	return x + y

sum = reduce(add, [1, 3, 5, 7, 9])
print(sum)


# 練習:用map和reduce實現 把字串'19910819'轉為數字
def char2num(s): # 字元轉為數字
	digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
	return digits[s]

l = list(map(char2num, '19910819'))
print(l) # [1, 9, 9, 1, 0, 8, 1, 9]

def func(x, y): # x * 10 + y
	return x * 10 + y

num = reduce(func, l)
print(num) # 19910819



# 4. filter 	常用等級:*****
# Python內建的filter()函式用於過濾序列。
def is_odd(n):
    return n % 2 == 1

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

print(l) # [1, 5, 9, 15]

# 練習:嘗試取出C://盤根目錄下的檔案和目錄列表,並過濾掉目錄,列出檔案列表



# 5. sorted 	常用等級:*****
# 排序演算法

l = sorted([36, 5, -12, 9, -21])
print(l) # [-21, -12, 5, 9, 36]


l = sorted([36, 5, -12, 9, -21], reverse=True) # 反向排序
print(l) # [36, 9, 5, -12, -21]


# sorted()函式也是一個高階函式,它還可以接收一個key函式來實現自定義的排序,例如按絕對值大小排序:
l = sorted([36, 5, -12, 9, -21], key=abs)
print(l) # [-21, -12, 5, 9, 36]


# 字串排序
l = sorted(['bob', 'about', 'Zoo', 'Credit']) # 按首位元組大小排序,首位元組相同的話依次向後逐位元組比較
print(l) # ['Credit', 'Zoo', 'about', 'bob']
# 預設情況下,對字串排序,是按照ASCII的大小比較的,由於'Z' < 'a',結果,大寫字母Z會排在小寫字母a的前面。


l = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) # 轉為小寫後比較
print(l) # ['about', 'bob', 'Credit', 'Zoo']


# 練習:
# 常用情況:將列表中的學生按成績由高到低排序 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

def by_score(t):
	return t[1]

l = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
l = sorted(l, key=by_score, reverse=True)
print(l) # [('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]

相關推薦

Python語言程式設計1高階函式 Higher-order-function

# 高階函式 Higher-order-function # 變數可以指向函式 # 以Python內建的求絕對值的函式abs()為例,呼叫該函式用以下程式碼: print(abs(-10)) # 10 print(abs) # <built-in f

scala語言程式設計系列--- scala語言程式設計完全解密

傳值呼叫與傳名呼叫通常,函式的引數是傳值引數; 也就是說,引數的值在傳遞給函式之前確定。其實, 在Scala中, 我們方法或者函式的引數可以是一個表示式, 也就是將一個程式碼邏輯傳遞給了某個方法或者函式./**   * scala 的   *     傳名呼叫(call-by

Kotlin學習日記Kotlin語言程式設計相關知識

尾遞迴函式kotlin 支援函數語言程式設計的尾遞迴。這個允許一些演算法可以通過迴圈而不是遞迴解決問題,從而避免了棧溢位。當函式被標記為 tailrec 時,編譯器會優化遞迴,並用高效迅速的迴圈代替它。一種特殊的遞迴呼叫自身後無其他操作是進行了優化的迴圈 tailrec fu

restapi7- 談談語言程式設計的思維模式和習慣

  國慶前,參與了一個c# .net 專案,真正重新體驗了一把搬磚感覺:在一個多月時間好像不加任何思考,不斷敲鍵盤加程式碼。我想,這也許是行業內大部分中小型公司程式猿的真實寫照:都是坐在電腦前的搬磚工人。不過也不是沒有任何收穫,在搬磚的過程中我似乎發現了一些現象和造成這些現象背後的原因及OOP思維、

Python語言程式設計高階函式

首先有一個高階函式的知識。 一個函式可以接收另一個函式作為引數,這種函式就稱之為高階函式。 def add(x, y, f): return f(x) + f(y) 當我們呼叫add(-5, 6, abs)時,引數x,y和f分別接收-5,6和abs,根據函式定義,我們可以推導計算過程為:

Python語言程式設計指南生成器

生成器是迭代器,同時也並不僅僅是迭代器,不過迭代器之外的用途實在是不多,所以我們可以大聲地說:生成器提供了非常方便的自定義迭代器的途徑。 這是函數語言程式設計指南的最後一篇,似乎拖了一個星期才寫好,嗯…… 轉載請註明原作者和原文地址:) 4.

Python語言程式設計高階函式 返回函式 匿名函式 裝飾器 偏函式

函數語言程式設計 將業務邏輯細化,抽象,封裝成一個個功能函式,並藉助語言自帶的高階函式api,將整個業務流程轉化為函式之間的相互呼叫,這就是函數語言程式設計。 對比:將業務邏輯細化,抽象,封裝成一個個物件,並藉助語言,庫,元件,框架等,將整個業務流程轉化為

python語言程式設計裝飾器、偏函式

1. 裝飾器 由於函式也是一個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。 >>>def now():        print('2015-3-25') >>>f = now >>>f() 201

python語言程式設計map/reduce、filter、sorted

1. 變數可以指向函式 函式本身也可以賦值給變數,即:變數可以指向函式: >>>f = abs >>>f(-10) 10 2. 傳入函式 既然變數可以指向函式,函式的引數能接收變數,那麼一個函式就可以接收另一個函式作為引數,這種函式就稱之

15.python語言程式設計—返回函式,匿名函式

1)返回函式(1)返回函式地址高階函式除了可以接收函式作為輸入以外,還可以輸出函式。示例程式碼如下:#!/usr/bin/env python3 # -*- coding: utf-8 -*- def func(*arg): def sum(): he

Python之路---> 、變量

() 參數名稱 外部 tro 標識 我們 (六) 函數聲明 局部變量   Python中的函數和數學上的函數定義是不一樣的,從數學的角度上來說函數的定義:給定一個數集A,假設其中的元素為x。現對A中的元素x施加對應法則f,記作f(x),得到另一數集B。假設B中的元素為y。則

Oracle據庫—— 分組

ble img color sele 最大值 (六) 部門 png std (一)組函數 avg:平均函數 max:最大值函數 min:最小值函數 sum:求和函數 stddev:標準差函數 count():計數函數 count(expr) 返回expr不為空的

python語言程式設計

一、python中or和and的使用 1、使用方式 result = a or b result = a and b 複製程式碼 2、or計算規則 當a為真的時候就直接返回a的值,否則返回b的值 3、and計算規則 當a為真的時候返回b,當a為假

Python 語言程式設計(待續)

函數語言程式設計 把計算視為函式而非指令 純函數語言程式設計:不需要變數,沒有副作用,測試簡單 支援高階函式,程式碼簡潔 高階函式——將函式作為引數傳入函式 map() 把函式依次作用在 list 的每個元素上,得到一個新的list並返回 [

python語言程式設計3(裝飾器的深入理解)

一、什麼是裝飾器 1、python中裝飾器可以理解為AOP程式設計,有點類似Spring中的註解,在不改變原函式或類的基礎上,對函式或類新增額外(自己需求補充)的功能。 2、裝飾器本質上是一個函式,該函式用來處理其他函式,它可以讓其他函式在不需要修改程式碼的前提下增加額外的功能,裝飾器的返回值也是

Python之路-Day08語言程式設計與內建函式

return可以返回任何值 當你在一個函式當中返回一個函式名的時候,其實返回的是這個函式在記憶體當中的地址,如果你用一個變數去接收它,然後以這個變數名執行的話,就會執行你返回的記憶體地址對應的那個函式. def test1(): print("in the test1")

python學習筆記03-python語言程式設計

1. 高階函式 1. 高階函式基礎 變數可以指向函式 函式名也是變數 高階函式允許傳入函式  #!/usr/bin/env python #將函式賦值給變數 A = abs print A(-10) #匯入__builtin__模組 import __builtin

python語言程式設計

一、函式的巢狀 1、函式巢狀的程式碼示例   def f1():       print('我是函式1')       def f2():          

Python語言程式設計-講解函式

Python函式優點:   函式是使用者自己編寫好的,因為在很多的情況下一個程式的執行需要重複很多的同一種工作,這個時候可以把重複工作的程式碼封裝成一個函式,每次使用的時候只需要呼叫這個函式就可以了,就算實在修改程式碼的時候,我們也只是修改自定一的函式塊的程式碼就可以了,不用修改很多的程式碼,這樣帶給我門的

Python--語言程式設計

運用yield實現   模擬 grep -rl 'root' /etc (遞迴找etc下所有檔案並開啟,過濾有'root'的檔案) # import os # g = os.walk(r'C:\Users\56360\Desktop\city\mycity') # print(next(g)) #