小白學 Python(17):基礎數據類型(函數)(下)

人生苦短,我選Pythonpython

前文傳送門git

小白學 Python(1):開篇github

小白學 Python(2):基礎數據類型(上)數據結構

小白學 Python(3):基礎數據類型(下)函數

小白學 Python(4):變量基礎操做3d

小白學 Python(5):基礎運算符(上)code

小白學 Python(6):基礎運算符(下)對象

小白學 Python(7):基礎流程控制(上)blog

小白學 Python(8):基礎流程控制(下)遞歸

小白學 Python(9):基礎數據結構(列表)(上)

小白學 Python(10):基礎數據結構(列表)(下)

小白學 Python(11):基礎數據結構(元組)

小白學 Python(12):基礎數據結構(字典)(上)

小白學 Python(13):基礎數據結構(字典)(下)

小白學 Python(14):基礎數據結構(集合)(上)

小白學 Python(15):基礎數據結構(集合)(下)

小白學 Python(16):基礎數據類型(函數)(上)

變量做用域

變量的做用域是指在程序中命名的變量產生想過的範圍。

沒看懂?不要緊,咱們寫個示例慢慢品。

a = 0

def print_1():
    a = 1
    print('a =', a)

    def print_2():
        a = 2
        print('a =', a)

print_a()

顯示結果以下:

a = 1

在上面的示例中, a 咱們進行了三次賦值,可是注意,這裏並非賦值覆蓋,而是每次賦值時做用域不一樣。

第一次賦值 a 是在最外面,這個稱爲全局變量,意思是它的做用域是全局的,咱們在全局任何地方使用 a ,都能得到這個值。

第二次賦值, a 是在 print_1() 這個函數中,咱們調用了 print_1() 這個函數,因此這裏的賦值會生效。

第三次賦值是在 print_2() 這個函數中,咱們並未調用這個函數,因此這裏 a 的賦值並不會生效。

好比咱們能夠這麼打印:

a = 0

def print_1():
    a = 1
    print('a =', a)

    def print_2():
        a = 2
        print('a =', a)


print('a =', a)

打印結果以下:

a = 0

這時咱們就將這個全局變量打印出來了。

第二個和第三個在方法內的 a 就成了局部變量,這兩個 a 都是隻在當前的函數中生效,出了這個函數就不生效了。

若是咱們將局部變量中的的賦值註釋掉,那麼在函數中是否能取到全局變量的值?

答案固然是確定的,咱們試試看:

a = 0

def print_1():
    # a = 1
    print('a =', a)

    def print_2():
        a = 2
        print('a =', a)

print_a()

打印結果以下:

a = 0

咱們還能夠再作一點改變,在函數 print_1() 中調用函數 print_2() ,以下:

a = 0

def print_1():
    # a = 1
    print('a1 =', a)

    def print_2():
        a = 2
        print('a2 =', a)

    print_2()

print('a3 =', a)
print_1()

打印結果以下:

a3 = 0
a1 = 0
a2 = 2

此示例添加 a1 、 a2 、 a3 僅爲打印後方便識別,並不是這是三個變量。

注意: 內層函數的變量做用域僅在內層函數中,並不會覆蓋到外層函數。

匿名函數

是的,你沒看錯,函數是能夠不命名的。

當咱們須要使用匿名函數的時候,可使用 lambda 關鍵字來聲明匿名函數。

  • lambda 只是一個表達式,函數體比 def 簡單不少。
  • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda 函數擁有本身的命名空間,且不能訪問本身參數列表以外或全局命名空間裏的參數。

語法:

函數對象名 = lambda 形參:表達式

咱們仍是寫一個簡單的匿名函數你們體會一下:

add = lambda x,y: x + y

print(add(1, 2))

打印結果以下:

3

這裏是實現了咱們上一篇文章中最簡單的加法,若是寫一個稍微複雜一點,好比說加上邏輯判斷的:

max_num = lambda x,y: x if x >= y else y

print(max_num(5, 9))

打印結果以下:

9

建議: 當函數比較複雜的時候,不建議使用匿名函數,由於它只能是一行,寫起來很差寫的同時還很差閱讀,結構晦澀難懂,若是進行復雜的業務邏輯,匿名函數能讓寫的人懷疑人生,讀的人生不如死。真愛生命,請遠離匿名函數。

遞歸函數

一個函數是能夠調用另外一個函數的,若是這個函數調用本身的話,那麼這個就叫遞歸函數。

如今咱們若是要求 n 的階乘:

千萬別告我你不知道什麼階乘,可能你須要回去問下你的初中數學老師。

n! = 1 * 2 * 3 * ... * n

看懂了哇,想一想看代碼怎麼寫。

想不出來仍是看我寫的吧:

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

print('10的階乘爲:', factorial(10))

打印結果:

10的階乘爲: 3628800

但願各位同窗必定要本身動手敲代碼。

示例代碼

本系列的全部代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便你們取用。

示例代碼-Github

示例代碼-Gitee

相關文章
相關標籤/搜索