Python函數與lambda 表達式(匿名函數)

Python函數

一、函數的作用

二、函數的定義

def function_name([parameter_list]):   
      [''' comments ''']  
      [function_body]
  • def:函數定義關鍵詞

  • function_name:函數名稱

  • ():參數列表放置的位置,可以為空

  • parameter_list:可選,指定向函數中傳遞的參數

  • comments:可選,為函數指定注釋(如何列印函數中的注釋)

  • function_body:可選,指定函數體

"""函數的定義"""
"""
def function_name([parameter_list]):
    [''' comments ''']  注釋
    [function_body]  函數體
"""


# 定義函數,參數為空(注意縮進)
def function_demo():  # 不要忘記冒號
    print("我是一個函數")  # [function_body] 函數體


# 定義函數,含有參數,注釋
def func_with_params(a, b, c):
    """
    這是一個攜帶參數和注釋的函數  ---> comments
    """
    print(f"傳入的參數為:a={a},b={b},c={c}")


#  列印函數comments(注釋)
# 1、__doc__  列印出注釋
print(func_with_params.__doc__)  # func_with_params()---->()沒有括弧
# 2、help 列印函數和注釋
help(func_with_params)  # func_with_params()---->()沒有括弧


# 空函數 (函數體未想好/功能暫時沒想好怎麼寫)
# 1、pass
def filter_char(s):
    pass


# 2、comments
def filter_char1(c):
    """
    功能:過濾銘感詞
    """
三、定義函數的注意事項:
  • 縮進:python 是通過嚴格的縮進來判斷程式碼塊兒

    • 函數體和注釋相對於 def 關鍵字必須保持一定的縮進,一般都是 4 個空格

    • pycharm 自動格式化快捷鍵:ctrl+alt+L

  • 定義空函數

    • 使用 pass 語句佔位

    • 寫函數注釋 comments

四、函數的調用

function_name([parameter_value])
# function_name:函數名稱
# parameter_value:可選,指定各個參數的值
"""函數的調用"""
# 無參函數調用
function_demo()
# 有參函數調用
func_with_params(1, 2, 3)

五、函數參數的使用

  • 形式參數:定義函數時,函數名稱後面括弧中的參數

  • 實際參數:調用函數時,函數名稱後面括弧中的參數

"""函數參數的使用"""
# 1、形式參數:定義函數時,函數名稱後面括弧中的參數
def demo(a, b, v):  # a, b, v
    print(f"傳入的參數為:a={a},b={b},c={v}")
# 2、實際參數:調用函數時,函數名稱後面括弧中的參數
demo(1, 2, 4)  # 1,2,3實際參數
1、位置參數
  • 數量必須與定義時一致

  • 位置必須與定義時一致

"""位置參數"""


def demo(a, b, v):
    print(f"傳入的參數為:a={a},b={b},c={v}")


# 1、正確的
demo(1, 2, 3)


# 2、錯誤的例子,數量少了
# demo(1, 45)  # 有一個黃色提示  系統提示:TypeError: demo() missing 1 required positional argument: 'v'
# 3、錯誤的例子,數量多了
# demo(1, 2, 3, 4)  # 有一個黃色提示  系統提示:TypeError: demo() takes 3 positional arguments but 4 were given


def person(name, age):
    print(f"姓名{name}")
    if age > 18:
        print(f"{name}已成年")
    else:
        print(f"{name}未成年")


# 4、順序錯
# person(22, 'tom')  # TypeError: '>' not supported between instances of 'str' and 'int'
# 5、正常
person('jack', 28)
2、關鍵字參數
  • 使用形式參數的名字確定輸入的參數值

  • 不需要與形式參數的位置完全一致

"""關鍵字參數"""


def person(name, age):
    print(f"姓名:{name}")
    if age > 18:
        print(f"{name}已成年")
    else:
        print(f"{name}:未成年")


person(age=25, name='楊冪')
3、設置默認參數
  • 定義函數時可以指定形式參數的默認值

  • 指定默認值的形式參數必須放在所有參數的最後,否則會產生語法錯誤

  • param=default_value:可選,指定參數並且為該參數設置默認值為 default_value

  • 注意:給形式參數設置默認值,默認值要用不可變對象(整數型、浮點型、元組、布爾值、字元串),用可變對象(字典,列表),默認值可能會催著調用發生變化

# 注意:給形式參數設置默認值,默認值要用不可變對象(整數型、浮點型、元組、布爾值、字元串),可變對象(字典,列表)
# 錯誤示範,默認值為空列表
def wrong_demo2(a, b, c=[]):
    c.append(a)
    c.append(b)
    print(a, b, c)


wrong_demo2(1, 2)
wrong_demo2(3, 4)

"""設置默認參數"""


def person(name, age, international='中國'):
    print(f"姓名:{name}")
    print(f"國籍為{international}")
    if age > 18:
        print(f"{name}已成年")
    else:
        print(f"{name}:未成年")


person(name='jace', age=30)
person(name='tom', age=25, international='美國')


# 錯誤的,默認值沒有放在最後
def age(a=18, c, b):
age(c, b)   # 系統報錯:SyntaxError: non-default argument follows default argument
4、可變參數
  • 可變參數也稱為不定長參數

  • 傳入函數中實際參數可以是任意多個

  • 常見形式()

    • *args

      接收任意多個實際參數,並將其放到一個元組中

      使用已經存在的列表或元組作為函數的可變參數,可以在列表的名稱前加*

    • **kwargs

      接收任意多個類似關鍵字參數一樣顯式賦值的實際參數,並將其放到一個字典

      使用已經存在字典作為函數的可變參數,可以在字典的名稱前加**

# *args 接收任意多個實際參數,並將其放到一個元組中
# 函數定義中的*args相當於打包
def print_language(*args):
    print(args)
    for a in args:
        print(a)


# 調用函數,把不同數量的參數傳遞進去,用位置參數
# print_language('python', 'java')
# print_language('python', 'java', 'php', "go")

# 函數調用時*args相當於解包
lis = ['python', 'java', 'php', "go"]
# 相當於 print_language('python', 'java', 'php', "go")
print_language(*lis)

# **kwargs 接收任意多個類似關鍵字參數一樣顯式賦值的實際參數,並將其放到一個**字典**中
# 函數定義中的**kwargs相當於打包
def print_info(**kwargs):
    print(kwargs)
    for a in kwargs.items():
        print(a)


print_info(tom=18, jack=24)
print_info(tom=18, jack=24, Aice=25)
# 函數調用時**kwargs相當於解包
di = {'cat': 18, 'jace': 24, 'alict': 65}
print_info(**di)

六、函數返回值

def function_name([parameter_list]):
    [''' comments ''']
    [function_body]
    return [value]

# value:可選,指定要返回的值

"""函數返回值"""


# 定義加法函數
def sum(a, b):
    result = a + b
    # 函數返回值
    # return result, a, b  # 返回保存元組


r = sum(1, 2)
print(r)

lambda 表達式(匿名函數)

1、使用場景
  • 需要一個函數,但是又不想費神去命名這個函數

  • 通常在這個函數只使用一次的場景下

  • 可以指定短小的回調函數

2、語法
result = lambda [arg1 [, arg2, .... , argn]]: expression
  • result:調用 lambda 表達式

  • [arg1 [, arg2, …. , argn]]:可選,指定要傳遞的參數列表

  • expression:必選,指定一個實現具體功能的表達式

# 常規寫法                              
def circle_area(r):                 
    """                             
    計算圓的面積                          
    r:半徑                            
    """                             
    result = math.pi * r ** 2       
    return result                   
r = 10                              
print(f"半徑為{r}的面積為{circle_area(r)}")
                                    
# lanbda表達式                         
# result = lambda 參數 : expression   
result = lambda r: math.pi * r ** 2 
print(f"半徑為{r}的面積為{circle_area(r)}")

# 對獲取到的資訊進行排序             
book_info = [             
    ('python', 15),       
    ('javn', 100),        
    ('軟體測試基礎', 25)        
]                         
print(book_info)          
# 指定規則排列                  
# lambda x: (x[1]) 返回了列表中每
book_info.sort(key=lambda 
print(book_info)