09-函式介紹
阿新 • • 發佈:2021-02-07
目錄
1. 函式簡介
1.1 什麼是函式
- 具有獨立功能的程式碼塊組織為一個小模組,這就是函式
1. 2 函式格式
def 函式名():
程式碼
1.3 呼叫方式
- 函式名()
# -*- coding: utf-8 -*- # @Time : 2021/2/6 # @Author : 大海 # 定義函式 def fib(n): """斐波那契數列""" a, b = 0, 1 while a < n: print(a) a, b = b, a + b # 呼叫函式 fib(10)
1.4 匿名函式
- 使用:
lambda
關鍵字用於建立小巧的匿名函式 - 格式:lambda 引數:表示式
# -*- coding: utf-8 -*-
# @Time : 2021/2/6
# @Author : 大海
f = lambda x: x ** 2
print(f(2))
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
print(pairs.sort(key=lambda pair: pair[1]))
2. 函式引數
- 定義時小括號中的引數,用來接收引數用的,稱為 “形參”
- 呼叫時小括號中的引數,用來傳遞給函式用的,稱為 “實參”
2.1 預設值引數(預設引數)
- 在形參中預設有值的引數,稱之為預設引數
# -*- coding: utf-8 -*- # @Time : 2021/2/6 # @Author : 大海 def ask_ok(prompt, retries=4, reminder='Please try again!'): while True: ok = input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retries < 0: raise ValueError('invalid user response') print(reminder) # 只給出必選實參: ask_ok('Do you really want to quit?') # 給出一個可選實參: ask_ok('OK to overwrite the file?', 2) # 給出所有實參: ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
- 預設值為不可變型別在定義作用域裡的函式定義中求值
# -*- coding: utf-8 -*-
# @Time : 2021/2/6
# @Author : 大海
# 預設值為不可變型別在定義作用域裡的函式定義中求值
i = 5
def f(arg=i):
print(arg)
i = 6
f() # 5
- 預設值為列表、字典或類例項等可變物件時
# -*- coding: utf-8 -*-
# @Time : 2021/2/6
# @Author : 大海
# 可變型別作為預設引數
def f(a, list_one=[]):
list_one.append(a)
return list_one
print(f(1))
print(f(2))
print(f(3))
# 後續呼叫之間共享預設值
def f(a, list_two=None):
if list_two is None:
list_two = []
list_two.append(a)
return list_two
print(f(1))
print(f(2))
print(f(3))
2.2 不定長引數
- 加了星號(*)的變數args會存放所有未命名的變數引數,args為元組
- 而加**的變數kwargs會存放命名引數,即形如key=value的引數, kwargs為字典.
- 不定長引數放在引數最後
# -*- coding: utf-8 -*-
# @Time : 2021/2/6
# @Author : 大海
# -*- coding: utf-8 -*-
# @Time : 2021/2/6
# @Author : 大海
def fun(a, b, *args, **kwargs):
"""可變引數演示示例"""
print("a =%d" % a)
print("b =%d" % b)
print("args:")
print(args)
print("kwargs: ")
for key, value in kwargs.items():
print("key=%s" % value)
fun(1, 2, 3, 4, 5, m=6, n=7, p=8)
c = (3, 4, 5)
d = {"m": 6, "n": 7, "p": 8}
fun(1, 3, *c, **d)
2.3 特殊引數
- 格式及說明:
/
和*
是可選的。這些符號表明形參如何把引數值傳遞給函式:位置、位置或關鍵字、關鍵字
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
----------- ---------- ----------
| | |
| 位置引數或關鍵字引數 |
| - 只能是關鍵字引數
-- 只能是位置引數
2.3.1 僅限位置引數
- 使用:僅限位置形參應放在
/
(正斜槓)前。/
用於在邏輯上分割僅限位置形參與其它形參。如果函式定義中沒有/
,則表示沒有僅限位置形參。
2.3.2 僅限關鍵字引數
- 把形參標記為僅限關鍵字,表明必須以關鍵字引數形式傳遞該形參,應在引數列表中第一個僅限關鍵字形參前新增
*
# -*- coding: utf-8 -*-
# @Time : 2021/2/6
# @Author : 大海
# 未使用 / 和 * 時,引數可以按位置或關鍵字傳遞給函式
def standard_arg(arg):
print(arg)
standard_arg('我是測試小白')
standard_arg(arg='我是測試小白')
# 僅限位置引數
def pos_only_arg(arg, /):
print(arg)
pos_only_arg('我是測試小白')
# 僅限位置引數,當做關鍵字引數傳參會報錯
# pos_only_arg(arg='a')
# 僅限位置引數
def kwd_only_arg(*, arg):
print(arg)
kwd_only_arg(arg='我是測試小白')
# 僅限位置和關鍵字引數同時存在
def combined_example(pos_only, /, standard, *, kwd_only):
print(pos_only, standard, kwd_only)
combined_example(1, 2, kwd_only=3)
combined_example(1, standard=2, kwd_only=3)