七、Python 函數

Python 函數

1、函數的瞭解

    1)函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段
    2)函數能提高應用的模塊性,和代碼的重複利用
    3)Python提供了許多內建函數,比如print()
    4)自己創建函數,這被叫做用戶自定義函數

2、定義一個函數

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

一般格式:
def 函數名(參數列表):
    函數體

3、參數傳遞

1) 在 python 中,對象纔有類型,變量是沒有類型的
  例如:
     a = [m,n,k]
     b = '1234'
  以上代碼中,[m,n,k] 是 List 類型,'1234' 是 String 類型,
  而變量 a 是沒有類型,它僅僅是一個對象的引用(一個指針),可以是指向 List 類型對象,
  也可以是指向 String 類型對象。


2) 可更改(mutable)與不可更改(immutable)對象
    在 python 中,字符串、元組和 Number 是不可更改的對象,而 list,dict 等則是可以修改的對象。
  不可變類型:
      變量賦值 a=5 後再賦值 a=10,這裏實際是新生成一個 int 值對象 10,
      再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當於新生成了a。
  可變類型:
      變量賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。

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

3.1 python 傳對象實戰

print('3.1 python 傳不可變對象實例')
def ChangeInt(a):     #定義一個函數
    a = 10   #在 a=10 時,則新生成一個 int 值對象 10,並讓 a 指向它

b = 2                             # 定義一個變量   實例中有 int 對象 2,指向它的變量是 b
ChangeInt(b)                      # 調用函數  按傳值的方式複製了變量 b,a 和 b 都指向了同一個 Int 對象,
print(f'b的值爲{b}:')             # 格式化字符串輸出, 結果依舊是 2   並沒有改變對象的值


#3.2 傳可變對象實例
print()
print('3.2 傳可變對象實例')
def changeme(mylist):               #定義一個函數
    mylist.append([1, 2, 3, 4])
    print("函數內取值: ", mylist)
    return

# 調用changeme函數
mylist = [10, 20, 30]
changeme(mylist)
print("函數外取值: ", mylist)

3.3參數類型

   以下是調用函數時可使用的正式參數類型:
      必需參數
      關鍵字參數
      默認參數
      不定長參數

  3.3.1 必須參數

#3.3.1 必需參數
print()
print('3.3.1 必需參數')
#必需參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。
def power(x):            #參數x就是一個必須參數,如果調用的時候不傳入 就會報錯
    return x*x

#調用並打印結果  如果 pow()不傳參數就會報錯
print('4的平方是:',power(4))

 3.3.2 關鍵字參數

  1)關鍵字參數和函數調用關係緊密,函數調用使用關鍵字參數來確定傳入的參數值。
  2)使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因爲 Python 解釋器能夠用參數名匹配參數值
  3)關鍵字參數與普通參數混合的時候,只能從參數的最後面匹配,否則報錯
  注意:
         是在調用的時候指定某個參數的值

 

def printStr(str,str1):
    print('輸出的字符串:',str,'和',str1)

#調用該函數  printStr(str=23,'abc')  如果這樣調用則報錯,關鍵字參數與普通參數混合的時候,只能從參數的最後面匹配
printStr('abc',str1=123)
printStr(str1=123,str='abc')

3.3.3  默認參數

調用函數時,如果沒有傳遞參數,則會使用默認參數
注意:
    定義函數的時候就指定了某個參數的值

def printInfo(name,age=12):
    print('名字:',name)
    print('年齡:',age)

#調用  關鍵參數使用  全是關鍵參數的時候  參數傳入順序可以打亂
printInfo(age=20, name='XiaoMing')
print("------------------------")
#關鍵參數+默認參數  使用
printInfo(name="XiaoMing")
#默認參數  使用
printInfo("XiaoMing")

3.3.4 不定長參數

一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,聲明時不會命名
語法格式一:
def functionname([formal_args,] *var_args_tuple ):
   function_suite
   return [expression]

這種語法傳入的其實是一個元組,加了星號 * 的參數會以元組(tuple)的形式導入,存放所有未命名的變量參數


語法格式二:
def functionname([formal_args,] **var_args_dict ):
   function_suite
   return [expression]
   
   這種語法參數帶兩個星號 **的會以 字典 的形式導入

# 語法格式一:傳遞一個元組
def printInfo(arg1, *vartuple):
    print("輸出參數arg1: ",end='')
    print(arg1)
    print("輸出元組參數vartuple: ",end='')
    print(vartuple)

# 調用printInfo 函數
printInfo(70, 60, 50)
# 這個時候 參數 vartuple並沒有被賦值,所以打印出來就是一個空的元組
printInfo('abc')


# 語法格式二  傳遞一個字典
def printInfo(arg1, **vardict):
    print("輸出參數arg1: ", end='')
    print(arg1)
    print("輸出元組參數vardict: ", end='')
    print(vardict)

# 調用printinfo 函數
printInfo(1, a=2, b=3)

3.3.5 匿名函數

python 使用 lambda 來創建匿名函數。
所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數。

1) lambda 只是一個表達式,函數體比 def 簡單很多
2) lambda 的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去
3) lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數
4) 雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率

#lambda 函數的語法只包含一個語句
'''
語法格式:
lambda [arg1 [,arg2,.....argn]]:expression
'''
#定義一個函數
sum = lambda arg1, arg2: arg1 + arg2
#調用函數
print('兩數相加後之和爲:',sum(3,2))

4、給大佬奉茶

    實例如下:

    

#1、函數的瞭解
print()
print('1、函數的瞭解')
'''
1)函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段
2)函數能提高應用的模塊性,和代碼的重複利用
3)Python提供了許多內建函數,比如print()
4)自己創建函數,這被叫做用戶自定義函數
'''

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

一般格式:
def 函數名(參數列表):
    函數體
    
'''
# 計算面積函數
#定義一個函數
def area(width, height):
    return width * height

#調用函數 並打印出結果
print('長方形的面積=',area(212,369))

#3、參數傳遞
print()
print('3、參數傳遞')
'''
1)在 python 中,對象纔有類型,變量是沒有類型的
  例如:
     a = [m,n,k]
     b = '1234'
  以上代碼中,[m,n,k] 是 List 類型,'1234' 是 String 類型,
  而變量 a 是沒有類型,它僅僅是一個對象的引用(一個指針),可以是指向 List 類型對象,
  也可以是指向 String 類型對象。
2)可更改(mutable)與不可更改(immutable)對象
    在 python 中,字符串、元組和 Number 是不可更改的對象,而 list,dict 等則是可以修改的對象。
  不可變類型:
      變量賦值 a=5 後再賦值 a=10,這裏實際是新生成一個 int 值對象 10,
      再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當於新生成了a。
  可變類型:
      變量賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。

3)python 函數的參數傳遞:
   不可變類型:
        類似 c++ 的值傳遞,如 整數、字符串、元組。如fun(a),傳遞的只是a的值,沒有影響a對象本身。
        比如在 fun(a)內部修改 a 的值,只是修改另一個複製的對象,不會影響 a 本身。
   可變類型:
        類似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後fun外部的la也會受影響
'''
#3.1 python 傳不可變對象實例
print()
print('3.1 python 傳不可變對象實例')
def ChangeInt(a):     #定義一個函數
    a = 10   #在 a=10 時,則新生成一個 int 值對象 10,並讓 a 指向它

b = 2                             # 定義一個變量   實例中有 int 對象 2,指向它的變量是 b
ChangeInt(b)                      # 調用函數  按傳值的方式複製了變量 b,a 和 b 都指向了同一個 Int 對象,
print(f'b的值爲{b}:')             # 格式化字符串輸出, 結果依舊是 2   並沒有改變對象的值


#3.2 傳可變對象實例
print()
print('3.2 傳可變對象實例')
def changeme(mylist):               #定義一個函數
    mylist.append([1, 2, 3, 4])
    print("函數內取值: ", mylist)
    return

# 調用changeme函數
mylist = [10, 20, 30]
changeme(mylist)
print("函數外取值: ", mylist)

#3.3參數類型
'''
以下是調用函數時可使用的正式參數類型:
   必需參數
   關鍵字參數
   默認參數
   不定長參數
'''
#3.3.1 必需參數
print()
print('3.3.1 必需參數')
#必需參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。
def power(x):            #參數x就是一個必須參數,如果調用的時候不傳入 就會報錯
    return x*x

#調用並打印結果  如果 pow()不傳參數就會報錯
print('4的平方是:',power(4))

#3.3.2 關鍵字參數
print()
print('3.3.2 關鍵字參數')
'''
1)關鍵字參數和函數調用關係緊密,函數調用使用關鍵字參數來確定傳入的參數值。
2)使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因爲 Python 解釋器能夠用參數名匹配參數值
3)關鍵字參數與普通參數混合的時候,只能從參數的最後面匹配,否則報錯
注意:
    是在調用的時候指定某個參數的值
'''
def printStr(str,str1):
    print('輸出的字符串:',str,'和',str1)

#調用該函數  printStr(str=23,'abc')  如果這樣調用則報錯,關鍵字參數與普通參數混合的時候,只能從參數的最後面匹配
printStr('abc',str1=123)
printStr(str1=123,str='abc')

#3.3.3  默認參數
print()
print('3.3.3  默認參數')
'''
調用函數時,如果沒有傳遞參數,則會使用默認參數
注意:
    定義函數的時候就指定了某個參數的值
'''
def printInfo(name,age=12):
    print('名字:',name)
    print('年齡:',age)

#調用  關鍵參數使用  全是關鍵參數的時候  參數傳入順序可以打亂
printInfo(age=20, name='XiaoMing')
print("------------------------")
#關鍵參數+默認參數  使用
printInfo(name="XiaoMing")
#默認參數  使用
printInfo("XiaoMing")

#3.3.4 不定長參數
print()
print('3.3.4  不定長參數')
'''
一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,聲明時不會命名
語法格式一:
def functionname([formal_args,] *var_args_tuple ):
   "函數_文檔字符串"
   function_suite
   return [expression]

這種語法傳入的其實是一個元組,加了星號 * 的參數會以元組(tuple)的形式導入,存放所有未命名的變量參數


語法格式二:
def functionname([formal_args,] **var_args_dict ):
   "函數_文檔字符串"
   function_suite
   return [expression]
   
   這種語法參數帶兩個星號 **的會以 字典 的形式導入
'''
# 語法格式一:傳遞一個元組
def printInfo(arg1, *vartuple):
    print("輸出參數arg1: ",end='')
    print(arg1)
    print("輸出元組參數vartuple: ",end='')
    print(vartuple)

# 調用printInfo 函數
printInfo(70, 60, 50)
# 這個時候 參數 vartuple並沒有被賦值,所以打印出來就是一個空的元組
printInfo('abc')


# 語法格式二  傳遞一個字典
def printInfo(arg1, **vardict):
    print("輸出參數arg1: ", end='')
    print(arg1)
    print("輸出元組參數vardict: ", end='')
    print(vardict)

# 調用printinfo 函數
printInfo(1, a=2, b=3)

#3.3.5 匿名函數
print()
print('3.3.5 匿名函數')
'''
python 使用 lambda 來創建匿名函數。
所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數。

1)lambda 只是一個表達式,函數體比 def 簡單很多
2)lambda 的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去
3)lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數
4)雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率

'''
#lambda 函數的語法只包含一個語句
'''
語法格式:
lambda [arg1 [,arg2,.....argn]]:expression
'''
#定義一個函數
sum = lambda arg1, arg2: arg1 + arg2
#調用函數
print('兩數相加後之和爲:',sum(3,2))

所有輸出結果

C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\python.exe F:/python-space/test/Function_study.py

1、函數的瞭解

2、定義一個函數
長方形的面積= 78228

3、參數傳遞

3.1 python 傳不可變對象實例
b的值爲2:

3.2 傳可變對象實例
函數內取值:  [10, 20, 30, [1, 2, 3, 4]]
函數外取值:  [10, 20, 30, [1, 2, 3, 4]]

3.3.1 必需參數
4的平方是: 16

3.3.2 關鍵字參數
輸出的字符串: abc 和 123
輸出的字符串: abc 和 123

3.3.3  默認參數
名字: XiaoMing
年齡: 20
------------------------
名字: XiaoMing
年齡: 12
名字: XiaoMing
年齡: 12

3.3.4  不定長參數
輸出參數arg1: 70
輸出元組參數vartuple: (60, 50)
輸出參數arg1: abc
輸出元組參數vartuple: ()
輸出參數arg1: 1
輸出元組參數vardict: {'a': 2, 'b': 3}

3.3.5 匿名函數
兩數相加後之和爲: 3223

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章