1. 程式人生 > >Python開發【第十一篇】函式

Python開發【第十一篇】函式

函式

什麼是函式?

函式是可以重複執行的語句塊,可以重複呼叫並執行函式的面向過程程式設計的最小單位。

函式的作用:

  • 函式用於封裝語句塊,提高程式碼的重用性,定義使用者級別的函式、提高程式碼的可讀性和易維護性。

函式的語法:

def 函式名(形參列表):
    語句塊 

作用:建立一個函式,將語句塊打包,用函式名繫結,用來呼叫

說明:函式名的命名規則與變數名的命名規則相同(必須為識別符號),函式名是一個變數,它用來繫結函式。函式有自己的名稱空間,函式外部不可以訪問函式內部的變數,函式內部可以訪問函式外部的變數,但不能對外部變數賦值。語句塊部分不能為空,如果為空需要填寫pass語句

函式如果不需要傳入引數,形參列表可以為空。

例子:

#此示例示意用def語句來定義函式
 def say_hello():
    print('hello world')
    print('hello 中國')

函式呼叫

語法:

函式名(實際呼叫傳遞引數)

說明:函式呼叫是一個表示式,如果函式內部沒有return語句,函式執行完畢後返回None物件的引用

例子:

def say_hello():
    print("hello world")
    print("hello 中國")
#函式呼叫第一次
say_hello()
#函式呼叫第二次
say_hello()
#此示例示意用def語句定義函式
#函式外部的變數訪問不了函式內部的變數
def say_hello():
    a = 100
    print("內部a是:",a)
say_hello()
#定義一個有引數的myadd函式
def myadd(a,b):
    print(a+b)
myadd(1,2)
myadd([1,2,3],[4,5,6])

return語句

語法:

return [表示式]
註釋:[]代表其中的內容可以省略

作用:用於函式中,結束當前函式的執行,返回到呼叫該函式的地方,同時返回一個物件的引用關係

說明:

  • return語句後面的表示式可以省略,省略後相當於return None
  • 函式內部沒有return語句的,則該函式執行完最後一條語句後返回None

練習:

1.寫一個函式mymax,實現返回三個最大的值

如:def mymax(a,b,c):

​ ……….

​ print(mymax(1,2,3))#3

​ print(mymax(“ABC”,“abc”,“123”))#abc

#小白寫法
def mymax(a,b,c):
    return max(a,b,c)
print(mymax(1,2,3))
print(mymax("ABC","abc","123"))
#經典寫法
def mymax(a,b,c):
    zuida = a
    if b > zuida:
        zuida = b
    if c > zuida:
        zuida = c
    return zuida
print(mymax(1,2,3))
print(mymax("ABC","abc","123"))

函式的傳參

作用:把資料給函式

函式的形參

作用:接收函式呼叫傳過來的資料

python函式的引數傳遞

傳遞方式:

  • 位置傳參
  • 序列傳參
  • 關鍵字傳參
  • 字典關鍵字傳參

位置傳參

實際引數(實參)的對應關係與形式引數(形參)的對應關係是按照位置來依次對應的

示例:

# 此示例示意位置傳參
def myfun(a, b, c):
    '''這是一個函式傳參的示例'''
    print('a的值是:', a)
    print('b的值是:', b)
    print('c的值是:', c)

myfun(1, 2, 3)
myfun(4, 5, 6)
myfun("ABC", [1,2,3], (44,55,66))

說明:

實參和形參通過位置進行傳遞和匹配

實參的個數必須與形參的個數相同

序列傳參

序列傳參是指在函式呼叫過程中,用*(星號)將序列拆解後
按照位置進行傳遞的傳參方式

示例:

# 此示例示意 序列傳參
def myfun(a, b, c):
    '''這是一個函式傳參的示例'''
    print('a的值是:', a)
    print('b的值是:', b)
    print('c的值是:', c)

L = [11, 22, 33]

# myfun(L[0], L[1], L[2])
myfun(*L)

# myfun(L)

說明:

序列傳參時,序列拆解的位置將與形參一一對應

關鍵字傳參

關鍵字傳參是指傳參時,按照形參名稱給形參賦值
實參和形參按名稱進行匹配

示例:

# 此示例示意 關鍵字傳參
def myfun(a, b, c):
    '''這是一個函式傳參的示例'''
    print('a的值是:', a)
    print('b的值是:', b)
    print('c的值是:', c)


myfun(c=33, b=22, a=11)
myfun(b=222, c=333, a=111)

說明:

可以不按照位置進行匹配
傳參的順序可以寫亂

字典關鍵字傳參

字典關鍵字傳參是指實參為字典,將字典用**(雙星號)拆解後進行關鍵字傳參的傳遞方式

示例:

# 此示例示意 字典關鍵字傳參
def myfun(a, b, c):
    '''這是一個函式傳參的示例'''
    print('a的值是:', a)
    print('b的值是:', b)
    print('c的值是:', c)

d = {'a':100, 'c':300, 'b':200}

# myfun(a=d['a'], c=d['c'], b=d['b'])
myfun(**d)  # 等同於上面一條語句

# myfun(d)  # 出錯

說明:

字典的鍵名和形參名必須一致
字典的鍵名必須符合識別符號命名規則的字串
字典的鍵名要在形參中存在

函式的綜合傳參

函式的傳參方式在能確定形參能唯一匹配到相應實參的情況下可以任意組合
函式的位置傳參要優先於關鍵字傳參

示例:

def myfun(a, b, c):
        pass
    myfun(100, *[200, 300])
    myfun(100, *"BC")
    myfun(*"AB", 300)
    myfun(*[100], 200, *[300])
    myfun(100, c=300,b=200)
    myfun(a=100, 200, c=300)  # 錯誤的

    myfun(100, **{'c':300, 'b':200})
    myfun(100, **{'c':300}, b=200)
    myfun(100, b=200, **{'c':300})

函式的預設引數

語法:

def 函式名(形參名1=預設實參1,形參名2=預設實參2,形參名3=預設實參3,.....)

作用:

讓函式的呼叫者少傳遞引數來呼叫函式

示例:

# 此示例示意如何定義函式的預設引數
def info(name, age=1, address="不詳"):
    print(name, '今年', age,'歲,家庭住址:',
          address)

info("魏明擇", 35, "北京市朝陽區")
info("Tarena", 15)
info("張飛")
# info()  # 出錯

說明:

預設引數必須自右至左一次存在,如果一個引數有預設引數,則其右側的所有引數必須有預設引數
預設引數可以有0個、一個或多個,甚至全部都有預設引數

例子:

def fn(a,b=10,c):  #錯誤
    pass
def fn(a=0,b=None,c=False): #正確
    pass

函式的可變實參和不可變實參的傳遞

示例:

# 在函式內部對變數賦值是在函式內部建立新的區域性變數
# 此賦值語句不會改變外部變數的繫結關係 
L = [1, 2, 3]
def f1(L):
    L = [4, 5, 6]  # 賦值語句的作用是建立和或改變變數的繫結關係
    print(L)  # [4, 5, 6]

f1(L)
print(L)  # [1, 2, 3]
L = [1, 2, 3]
def f1(L):
    # L = [4, 5, 6]  # 賦值語句的作用是建立和或改變變數的繫結關係
    L.append("ABC")
    print(L)  # [1, 2, 3, "ABC"]

f1(L)
print(L)  # [1, 2, 3, "ABC"]

說明:

當一個可變通過函式實參傳入函式內時,在函式內可以通過區域性變數來操作可變物件(列表,字典,集合...)

面試題:

#執行以下程式的結果是什麼?為什麼?
L = [1,2]
def fn(a,lst=[])
    lst.append(a)
    print(lst)
fn(3,L)  #[1,2,3]
fn(4,L)  #[1,2,3,4]
#####################
fn(5)   #[5]
fn(6)   #[5,6]
fn(7)   #[5,6,7]

函式形參的定義方式

  • 位置形參
  • 星號元組形參
  • 命名關鍵字形參
  • 雙星號字典形參

位置形參

語法:

def 函式名(形參變數1,形參變數2,....):
語句塊

星號元組形參

語法:

def 函式名(*元組形參名):
    語句塊

作用:

收集多餘的位置傳參

說明:

元組形參名一般命名為'args'
*元組形參一個函式只能有一個

示例:

# 此示例示意星號元組形參
def func(*args):
    print("實參的個數是:", len(args))
    print("args=", args)

func()  # 無參
func(1,2,3,4)
func(1, 2, 3, 4, 5, 6, 7, 8)
s = "ABCDE"
func(*s)  # 等同於func('A', 'B', ....)
func(a=100, b=200)  # 出錯

命名關鍵字形參

語法:

def 函式名(*,命名關鍵字形參1,命名關鍵字形參2,....):
    語句塊
或
def 函式名(*args,命名關鍵字形參1,命名關鍵字形參2,....):
    語句塊

作用:

強制所有的命名關鍵字形參都必須用關鍵字傳參或字典關鍵字傳參

示例:

# 此示例示意命名關鍵字形參
def func(a, b, *, c, d):
    print(a, b, c, d)

# func(1, 2, 3, 4)  # 傳參失敗
func(1, 2, c=30, d=40)
func(a=10, b=20, c=30, d=40)
func(1, 2, **{'d':400, 'c':300})

雙星號字典形參

語法:

def 函式名(**字典形參名):
    語句塊

作用:

收集多餘的關鍵字傳參

示例:

# 此示例示意雙星號字典形參
def func(**kwargs):
    print("關鍵字傳參的個數是:", len(kwargs))
    print('kwargs=', kwargs)

func(name="隔壁老王", age=35, address="朝陽區")

def func(*,a, b, **kwargs):
    print("關鍵字傳參的個數是:", len(kwargs))
    print('kwargs=', kwargs)

func(a=1, b=2, c=3, d=4)

說明:

字典形參名一般命名為:'kwargs'
一個函式內字典形參最多隻有一個

函式的形參說明:

  • 位置形參,預設引數,星號元組形參,雙星號字典形參可以混合使用
  • 函式形參自左至右的定義順序為:
  • 位置形參
  • 星號元組形參
  • 命名關鍵字形參
  • 雙星號字典形參

示例:

def fn(a, b, *args, c, **kwargs):
    pass
fn(1, 2, 3, 4, c=30, d=40, e=50)

函式的不定長引數

  • 星號元組形參
  • 雙星號字典形參

用不定長引數可以接收任意的傳參

如:

def fn(*args,**kwargs):
    print(*args,**kwargs)