5.python函數

函數介紹

定義:  函數是指將一組語句的集合經過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名便可。數據結構

特性:減小重複代碼、使程序變的可擴展、使程序變得易維護函數

 1.普通參數

def func(name):     #name是形式參數
    print(name)      #函數體

func('derek')       #執行函數,'derek'是傳入的實參

2.默認參數

定義了默認參數後,在函數調用時不須要再傳入,默認參數放在最後面post

複製代碼
def info(name,age,country = 'CN'):   #country定義了一個默認參數
    print('姓名:',name)
    print('年齡:',age)
    print('國籍:',country)

info('derek',22)     #調用時,沒穿實參countrty,就用默認的參數
複製代碼

3.關鍵參數

 正常狀況下,給函數傳參數要按順序,不想按順序就能夠用關鍵參數,只需指定參數名便可,但記住一個要求就是,關鍵參數必須放在位置參數以後this

複製代碼
def info(name,age,country = 'CN'):
    print('姓名:',name)
    print('年齡:',age)
    print('國籍:',country)

info(age=22,name='derek')   #使用關鍵參數,能夠不按順序
複製代碼

4.*args

def info(name,age,*args):     #*args會把多傳入的參數變成一個元祖形式
    print(name, age,args)

info("derek","22","CN","Python")     #derek 22 ('CN', 'Python')

5.**kwargs

複製代碼
def info(name, *args, **kwargs):  # **kwargs 會把多傳入的參數變成一個dict形式
    print(name, args)    #derek (22, 'CN', 'Python')
    print(kwargs)        #{'sex': 'Male', 'province': 'HeBei'}

info("derek", 22, "CN", "Python", sex="Male", province="HeBei")
複製代碼

6.局部變量

做用域在函數內部,不影響外部spa

複製代碼
name = 'derek1'

def change_name(name):
    print('before change:',name)
    name = 'derek2'
    print('after change:',name)

change_name(name)
print('最後仍是沒改',name)


結果:
before change: derek1
after change: derek2
最後仍是沒改 derek1
複製代碼

遞歸函數

若是一個函數在內部調用自身,那麼這個函數就叫作遞歸函數。code

1. 必須有一個明確的結束條件;blog

2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小;遞歸

3.遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出作用域

複製代碼
#遞歸實現階乘n! = (n-1)! × n
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)
print(factorial(5))

結果:120

過程:
factorial(5)                        # 第 1 次調用使用 5
5 * factorial(4)                    # 第 2 次調用使用 4
5 * (4 * factorial(3))              # 第 3 次調用使用 3
5 * (4 * (3 * factorial(2)))        # 第 4 次調用使用 2
5 * (4 * (3 * (2 * factorial(1))))  # 第 5 次調用使用 1 
5 * (4 * (3 * (2 * 1)))             # 從第 5 次調用返回
5 * (4 * (3 * 2))                   # 從第 4 次調用返回
5 * (4 * 6)                         # 從第 3次調用返回
5 * 24                              # 從第 2 次調用返回
120                                 # 從第 1 次調用返回
複製代碼

高階函數

知足下列條件之一就可稱函數爲高階函數it

  • 某一函數當作參數傳入另外一個函數中

  • 函數的返回值包含一個或多個函數

複製代碼
#簡單的高階函數

def
func(): print('in the func') return foo() def foo(): print('in the foo()') return 666 res = func() print(res) 結果: in the func in the foo() 666
複製代碼

 map()函數

map()是 Python 內置的高階函數,它接收一個函數 f 和一個list,並經過把函數 f 依次做用在 list 的每一個元素上,獲得一個新的 list 並返回

複製代碼
def func(x):
    return x * x
a= map(func,range(1,10))
print(list(a))

結果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
複製代碼

reduce()函數

reduce()函數也是Python內置的一個高階函數。reduce()函數接收的參數和 map()相似,一個函數 f,一個list,但行爲和 map()不一樣,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每一個元素反覆調用函數f,並返回最終結果值

複製代碼
from functools import reduce
def f(x,y):
    return x + y
a = reduce(f,[1,3,5,7,9,10])
print(a)

結果:
35
複製代碼

filter()函數

filter()函數是 Python 內置的另外一個有用的高階函數,filter()函數接收一個函數 f 和一個list,這個函數 f 的做用是對每一個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list

複製代碼
def is_odd(x):
    return x % 2 == 1
a = filter(is_odd,[1,2,3,4,5,6,7,8])
print(list(a))

結果:[1, 3, 5, 7]
複製代碼

匿名函數lambda

lambda 函數是一種快速定義單行的最小函數,能夠用在任何須要函數的地方

優勢:讓代碼更加精簡,不須要考慮命名的問題

複製代碼
#常規函數
def fun(x,y):
    return x + y

#匿名函數
a = lambda x,y:x + y
print(fun(2,3))
複製代碼

 內嵌函數和做用域

定義:在一個函數體內建立另一個函數,這種函數就叫內嵌函數

複製代碼
實例

def foo():
    print("in the foo")
    def bar():
        print("in the bar")
    bar()

foo()


結果:
in the foo
in the bar
複製代碼

局部做用域和全局做用域的訪問順序

複製代碼
x = 0
def grandpa():
    x = 1
    def dad():
        x = 2
        def son():
            x = 3
            print(x)
        son()
    dad()
grandpa()
print(x)


結果:
3
0
複製代碼
相關文章
相關標籤/搜索