1. 程式人生 > 其它 >09-函式介紹

09-函式介紹

技術標籤:Python學習python

目錄

1. 函式簡介

1.1 什麼是函式

1. 2 函式格式

1.3 呼叫方式

1.4 匿名函式

2. 函式引數

2.1 預設值引數(預設引數)

2.2 不定長引數

2.3 特殊引數


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)