1. 程式人生 > >Python學習之旅(十一)

Python學習之旅(十一)

Python基礎知識(10):函式(Ⅱ)

一、全域性變數和區域性變數

區域性變數:在函式內定義的變數,在函式內使用

全域性變數:在函式外定義的變數,在程式任何地方都可以使用

1、全域性變數與區域性變數同名

這時函式內部只調用區域性變數,如果要呼叫全域性變數需要在函式內加一句“global 同名變數”

x=1
#x:全域性變數
def test():
    global x
    x=5
    #x:區域性變數
    print(x)
    return x

test()

結果:1

2、一個函式中的內層函式呼叫外層函式中的變數

內層函式呼叫外層函式中的變數要在內層函式中加一句“nonlocal 變數”

def demo1():
    num=2
    def demo2():
        nonlocal num
        num+=1
        
    return demo2()
demo1()

demo1()

結果:3

3、全域性變數一般不可修改,如果函式中想要修改全域性變數要加上“global 變數”語句

如果B函式要呼叫A函式中的c變數,需要在A函式內部加一句“global c”

x=1
def test1():
    global x
    global y
    y=2
    x=x+y
    print(x)
    
return x def test2(): print(y) print(x) test1() test2()

結果:

3
2

二、函式遞迴

1、一個函式自己呼叫自己

2、有明確的結束條件:加if判斷

3、無窮遞迴:執行後它會永遠執行下去,進而導致程式崩潰

4、理論上所有遞迴函式都可以寫成迴圈的方式

計算階乘

#用迴圈語句
def fact1(num):
    result=num
    for i in range(1,num):
        result *=i
    return result

print(fact1(3))

#用遞迴函式 def fact2(n): if n==1: return 1 else: return n*fact2(n-1) print(fact2(3))

結果:6

5、使用遞迴函式時要防止棧溢位,解決棧溢位的方法是通過尾遞迴優化

6、匿名函式

用lambda定義,只能有一個表示式,沒有函式名

lambda x:x+1等價於def test(x):x+=1 retrun x

(1)可以把匿名函式賦值給一個變數,用該變數呼叫匿名函式

y=lambda x:x+2
y(1)
結果:3

(2)可以把匿名函式作為返回值返回