Python3 函數

函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段

函數能提高應用的模塊性,和代碼的重複利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創建函數,這被叫做用户自定義函數

定義一個函數

規則:

  • 函數代碼塊以 def 關鍵詞開頭後接函數標識符名稱和圓括號 ()
  • 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
  • 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數説明。
  • 函數內容以冒號 : 起始,並且縮進
  • return [表達式] 結束函數,選擇性地返回一個值給調用方,不帶表達式的 return 相當於返回 None。

語法:

Python 定義函數使用 def 關鍵字,一般格式如下:

def 函數名(參數列表):
    函數體

Python語言:Day9練習題及其答案_#python

為什麼要有函數:將需要重複使用的某個功能,整合成一個函數,這樣每次使用的時候就只需要調用該函數,而不是重寫一段實現該功能的代碼

eg:

def max (a,b):
    #定義一個函數,輸入兩個參數,返回較大值。
    if a>b:
        return a;
    else:
        return b;


#如果我想比較3和4,5和6的大小,就可以調用兩次這樣的函數,而不是重複寫兩次比較大小的代碼
print(max(3,4));
print(max(5,6));

運行結果:

Python語言:Day9練習題及其答案_字符串_02

這裏的max就是我所定義的函數標識符(也就是函數名),圓括號裏面的就是我的函數參數,如果要調用我的這個函數,就可以給我這個函數傳入兩個參數,比如下面的3和4,5和6。print(max(3,4))的這個過程就是函數調用

參數傳遞

在 python 中,類型屬於對象,對象有不同類型的區分變量是沒有類型的

對象:

在編程中,對象是一個包含數據和功能的實體。它可以被認為是一個具體的實例,具有特定的屬性(數據)和方法(功能)。在Python中,幾乎所有的東西都是對象,包括數字、字符串、列表、字典等。
特點:

數據和行為:對象不僅存儲數據(如數值、文本等),還可以執行操作(方法)。
類型:每個對象都有一個類型,決定了它可以執行哪些操作。例如,一個字符串對象可以使用字符串方法(如 .upper(),將小括號內的字符串從小寫變成大寫),而一個列表對象可以使用列表方法(如 .append(),作用是在列表的最後添加上小括號內的元素)。

eg:

# 創建一個字符串對象
s = "Hello, World!" # s 是一個字符串對象
print(s.upper()) # 使用字符串對象的方法,這裏是將字符串轉換成大寫字母,輸出: "HELLO, WORLD!"

運行結果:

Python語言:Day9練習題及其答案_字符串_03

變量:

變量是一個用於存儲數據的命名空間。可以把它看作是一個標籤,指向某個對象變量本身並不包含數據,而是指向存儲在內存中的數據對象。你可以通過變量來訪問和操作這些對象。

動態性:在Python中,變量可以指向任何類型的對象,並且可以在運行時改變指向的對象。例如,你可以將一個整數賦值給變量,然後再將一個字符串賦值給同一個變量。
命名:變量有一個名稱,程序員可以使用這個名稱來引用存儲在其中的對象。eg:
eg:

# 創建一個變量並賦值
x = 10 # x 是一個變量,指向整數對象 10
print(x)  # 輸出: 10

x = "Hello" # 現在 x 指向一個字符串對象 "Hello"
print(x)  # 輸出: Hello

運行結果:

Python語言:Day9練習題及其答案_地址空間_04

對象是包含數據和功能的實體,具有特定的類型和方法。
變量是指向對象的命名標籤,可以動態改變指向不同的對象。

可更改(mutable)與不可更改(immutable)對象

在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。

  • 不可變類型:變量賦值 a=5 後再賦值 a=10,這裏實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丟棄,不是改變 a 的值,相當於新生成了 a。
  • 可變類型:變量賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。

python 函數的參數傳遞:

  • 不可變類型:類似 C++ 的值傳遞,如整數、字符串、元組。如 fun(a),傳遞的只是 a 的值,沒有影響 a 對象本身。如果在 fun(a) 內部修改 a 的值,則是新生成一個 a 的對象。
  • 可變類型:類似 C++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後 fun 外部的 la 也會受影響。

python 中一切都是對象,嚴格意義我們不能説值傳遞還是引用傳遞,我們應該説傳不可變對象和傳可變對象

eg:

def change (a):
    # 改變a的值,使其減一。
    a -= 1;
    return a;

# 調用函數
a1=10;
print("change(a1):",change(a1));#輸出: 9
print("a:",a1);#輸出: 10,a1的值沒有改變,因為函數只是返回了一個新的值,並沒有修改原來的變量。


def  change1(a_list):
    # 改變a_list中第一個元素的值,使其減一。
    a_list[0] -= 1;
    return a_list;

def change2(a_list):
    #對a_list進行重賦值;
    a_list = [1,2,3];
    return a_list;

# 調用函數
a2=[10,20,30];
print("change1(a2):",change1(a2));#輸出: [9, 20, 30]
print("a2:",a2);#輸出: [9, 20, 30],a2的值已經改變,因為函數直接修改了原來的列表。

print("change2(a2):",change2(a2));#輸出: [1, 2, 3]
print("a2:",a2);#輸出: [9,20,30],a2的值並未改變

運行結果:

Python語言:Day9練習題及其答案_字符串_05

從結果來看,這些變量似乎都是一個類似指針的存在,上面的a1存儲的是10的地址空間,然後傳到change()函數中的a,這個是函數中的參數a(新創建的)也指向了10的地址空間,然後修改參數a,相當於讓它指向了9所在的地址空間;下面的a2也是同理,a2指向的是列表的地址空間,然後傳到change1(),change2()函數中的參數a_list中,a_list也指向這個列表的地址空間,然後如果修改列表內部元素的值,就根據這個列表的地址空間找到其內部元素的所在,進行修改,而該列表地址並沒有改變,改變的是其內部元素的地址,而當我直接對列表重賦值的話,相當於讓a_list指向了一個全新的列表,這個時候a_list指向的列表就變了,所以和a2就沒有關係了,所以後面a2的值並沒有改變。

參數

以下是調用函數時可使用的正式參數類型:

  • 必需參數
  • 關鍵字參數
  • 默認參數
  • 不定長參數

必需參數

必需參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。

eg:

def max (a,b):
    #定義一個函數,輸入兩個參數,返回較大值。
    if a>b:
        return a;
    else:
        return b;

a=1;
b=12;
print(max(a,b));#一定要傳兩個參數,否則會報錯。
print(max());#如果不傳參數,則會報錯。

運行結果:

Python語言:Day9練習題及其答案_字符串_06

錯誤的意思是少了兩個所必須的參數。

關鍵字參數

關鍵字參數和函數調用關係緊密,函數調用使用關鍵字參數來確定傳入的參數值

使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因為 Python 解釋器能夠用參數名匹配參數值。

關鍵字參數就是你要傳入到函數裏面的那個變量的名字和函數所定義的那個參數的名字是一樣的。

但關鍵字參數在調用函數時要以“參數名=值”的形式傳遞參數才行。

eg:

def  print1(a,b):
    #打印參數b的值。
    print(b);

a=10;
b=20;
print1(b,a);#這個還是按順序傳參的
print1(b=12,a=13);#這個是根據關鍵字傳參的

運行結果:

Python語言:Day9練習題及其答案_賦值_07