1. 程式人生 > >Python常用高級函數

Python常用高級函數

它的 模塊 part 元素 內置 lte 整數 ted ()

一 、匿名函數

  有些時候,我們不需要顯式的定義函數,可以使用匿名函數臨時快速定義函數。

lambda x: x * x

關鍵字lambda表示匿名函數,冒號前面的x表示函數的參數,多個參數用‘,‘隔開,返回值就是表達式的結果。

二 、遞歸函數

  遞歸函數就是在函數內部調用函數本身。如:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

遞歸函數必須有終止條件,否則會導致無限遞歸,使棧溢出。python的遞歸最大深度為1000,但會在深度為998左右出現報錯。

遞歸使用:

1. 遍歷某文件夾中所有文件

import os
def read(filepath, n):
    files = os.listdir(filepath)   # 獲取到當前文件夾中的所有文件
    for fi in files:  # 遍歷文件夾中的文件,這裏獲取的只是本層文件名
        fi_d = os.path.join(filepath, fi)
        if os.path.isdir(fi_d): # 如果該路徑下的文件是文件夾
            print("\t"*n, fi)
            read(fi_d, n
+1) # 繼續進行相同的操作 else: print("\t"*n, fi) # 遞歸出口,最終在這裏隱含著return # 遞歸遍歷目錄下所有文件 read(e:/pythonDemo, 0)

2. 漢諾塔問題

# 無論多少個圓塊,可以抽象成為同一套思路:就是想辦法把(n-1)個a柱上的圓塊先移動到b柱,
# 然後把最底部最大的一個圓塊移動到c柱,最後把b柱上的(n-1)個圓塊移動到c柱
def hanoi(n, a, buffer, c): if n == 1: print(a, --->
, c) # 定義從a柱移動到c柱的操作 else: hanoi(n-1, a, c, buffer) # 把(n-1)個a柱上的圓塊移動到緩沖區buffer柱 hanoi(1, a, buffer, c) # 把最底部的最大的圓塊移動到c柱 hanoi(n-1, buffer, a, c) # 把(n-1)個緩沖區buffer柱上的圓塊移動到c柱 hanoi(3, A, B, C)

三 、偏函數

函數可以通過設置參數的默認值降低函數調用的難度,偏函數就有這種用處。

如用int()函數實現二進制的轉換:

>>>int(101010001, base=2)
337

python的functools模塊的partial函數就可以創建一個偏函數:

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2(1010101)
85

四 、sorted

python內置的sorted()函數可以對list進行排序,它的key參數控制排序方式是以什麽作為排序參照的,reverse=False/True控制是正向排序還是反向排序。

>>> sorted([bob, about, Zoo, Credit], key=str.lower, reverse=True)
[Zoo, Credit, bob, about]

五 、filter

filter()函數用於過濾序列,函數傳入兩個參數,第一個是一個返回布爾值的函數,第二個是list,filter會將列表中的元素依次傳入第一個函數中,返回值是True的將保留。

def not_empty(s):
    return s and s.strip()

list(filter(not_empty, [A, ‘‘, B, None, C,   ]))
# 結果: [‘A‘, ‘B‘, ‘C‘]

六 、map

map()函數接收兩個參數,一個是函數,一個是Iterablemap將傳入的函數依次作用到序列的每個元素,並把結果作為新的Iterator返回。

>>> r = map(lambda x: x*x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

七 、reduce

reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算。

即:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

把序列[1, 3, 5, 7, 9]變換成整數13579:

>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

Python常用高級函數