函式式程式設計

2021-08-30 10:55:56 字數 4372 閱讀 3716

一、高階函式

將函式作為引數使用的函式。

func(n, funca)

1、map()

map(function, , iterable, …) literable乙個或多個序列

原意就是對映,即把集合或者列表的元素,每乙個元素都按照一定規則進行操作,生成乙個新的列表或者集合

map函式是系統提供的具有對映功能的函式,返回值是乙個迭代物件(iterators迭代器)

示例:利用map()計算乙個序列的的平方根。

>>>def square(x) :            # 計算平方數

... return x ** 2

...

>>> map(square, [1,2,3,4,5]) # 計算列表各個元素的平方

[1, 4, 9, 16, 25]

>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函式

[1, 4, 9, 16, 25]

# 提供了兩個列表,對相同位置的列表資料進行相加

>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])

[3, 7, 11, 15, 19]

2、reduce()

reduce(function,  iterable [,  initializer])
function – 函式,有兩個引數

iterable – 可迭代物件

initializer – 可選,初始引數

reduce() 函式會對引數序列中元素進行累積。

函式將乙個資料集合(鍊錶,元組等)中的所有資料進行下列操作:用傳給 reduce 中的函式 function(有兩個引數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個資料用 function 函式運算,最後得到乙個結果。

>>>import functools

>>>def add(x, y) : # 兩數相加

... return x + y

...

>>> reduce(add, [1,2,3,4,5]) # 計算列表和:1+2+3+4+5

15>>> reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函式

15

3、filter()

filter(function, iterable)

function – 判斷函式,返回值是布林值。

iterable – 可迭代物件。

過濾函式: 對一組資料進行過濾,符合條件的資料會生成乙個新的列表並返回,返回型別「filter」,可用set()將結果轉為集合進行列印

-相同:都對列表的每乙個元素逐一進行操作

-不同:

map會生成乙個跟原來資料想對應的新佇列

filter不一定,只要符合條件的才會進入新的資料集合

def iseven(a):

return a % 2 == 0

list = [3,4,56,3,2,3,4556,67,4,4,3,23455,43]

rst = filter(iseven, list)

print(set(rst))

利用filter(),可以完成很多有用的功能,例如,刪除 none 或者空字串:

def is_not_empty(s):

return s and len(s.strip()) > 0

filter(is_not_empty, ['test', none, '', 'str', ' ', 'end'])

結果:['test', 'str', 'end']

4、sorted()

排序演算法函式

a = [234,22312,123,45,43,2,3,66723,34]

al = sorted(a, reverse=true) #對列表進行倒序排列

print(al)

a = [-43,23,45,6,-23,2,-4345]

# 按照絕對值進行排序

# abs是求絕對值的意思

# 即按照絕對值的倒序排列

al = sorted(a, key=abs, reverse=true)

print(al)

sorted(['bob', 'about', 'zoo', 'credit'], key=str.lower) #忽略大小寫排序

['about', 'bob', 'credit', 'zoo']

二、返回函式

高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回。

def lazy_sum(*args):

def sum():

ax = 0

for n in args:

ax = ax + n

return ax

return sum

當我們呼叫lazy_sum()時,返回的並不是求和結果,而是求和函式:

>>> f = lazy_sum(1, 3, 5, 7, 9)

>>> f

.sum at 0x101c6ed90>

呼叫函式f時,才真正計算求和的結果:

>>> f()

25

返回的函式並沒有立刻執行,而是直到呼叫了f()才執行。我們來看乙個例子:

def count():

fs =

for i in range(1, 4):

def f():

return i*i

return fs

f1, f2, f3 = count()

def count():

def f(j):

def g():

return j*j

return g

fs =

for i in range(1, 4):

return fs

三、裝飾器(decrator)

在不改動函式**的基礎上無限制擴充套件函式功能的一種機制,本質上講,裝飾器是乙個返回函式的高階函式

裝飾器的使用: 使用@語法, 即在每次要擴充套件到函式定義前使用@+函式名

# 任務:

# 對hello函式進行功能擴充套件,每次執行hello萬列印當前時間

import time

# 高階函式,以函式作為引數

def printtime(f):

print("time: ", time.ctime())

return f(*args, **kwargs)

上面**中,內部函式要寫*args, **kwargs引數,代表原傳入引數不變

# 上面定義了裝飾器,使用的時候需要用到@, 此符號是python的語法糖

@printtime

def hello():

print("hello world")

hello()

# 上面對函式的裝飾使用了系統定義的語法糖

# 下面開始手動執行下裝飾器

# 先定義函式

def hello3():

print("我是手動執行的")

hello3()

hello3 = printtime(hello3)

hello3()

f = printtime(hello3)

f()# 作業:

# 解釋下面的執行結果

四、偏函式

def int16(x, base=16):

return int(x, base)

int16("12345")

import functools

#實現上面int16的功能

int16 = functools.partial(int, base=16)

int16("12345")

函式式程式語言python 函式式程式設計

函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...

函式式程式設計

最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...

函式式程式設計

維基百科 函式式程式設計 英語 functional programming 或者函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當...