Python函數(shù)

Python函數(shù)

1.函數(shù)定義

def 函數(shù)名(參數(shù)表列):
    """
    函數(shù)文檔
    (函數(shù)功能描述)
    :param 參數(shù)名1:參數(shù)1描述
    :param 參數(shù)名2:參數(shù)2描述
    ......
    :return: 函數(shù)返回描述
    """
    函數(shù)體
    return 返回值

2.模塊調(diào)用

import 模塊名 as 新的模塊名
新的模塊名.方法名(參數(shù)表列)

3.函數(shù)參數(shù)

  • 必須參數(shù)
    必須以正確的順序傳入,且調(diào)用時必須與生明時保持一致。
def f(name, age):
    print("I am %s, I am %d years old."%(name,age))
f('Eric', 18)
  • 關(guān)鍵字參數(shù)
    使用關(guān)鍵字參數(shù)允許參數(shù)調(diào)用時和聲明時順序不一致。
f(age=18, name='Eric')
  • 默認參數(shù)
    若參數(shù)缺省,則默認值生效。
def f(name, age, sex = 'male'):
    print("I am %s, I am %d years old." % (name, age))
    print("Sex:%s"%sex)
f(name = 'lisi', age = 19)
f(name = 'zhangsan', age = 88, sex = 'female')
運行結(jié)果
  • 變長(不定長)參數(shù)
    傳入?yún)?shù)個數(shù)無限制。

形式參數(shù)以一個*號開頭,代表一個任意長度的元組(tuple),可以接收連續(xù)一串參數(shù)。
形式參數(shù)以兩個*號開頭,代表一個任意長度的字典(dict),實際參數(shù)的形式是“key=value”(鍵值對),可以接收連續(xù)的任意多個參數(shù)。

def 函數(shù)名(*args, **kwargs):
    函數(shù)體

示例:

def self_print1(*args):
    print(args)
    print(type(args))
self_print1(1, 2, 3, 4, 5, 6, (1, 2))

def self_print2(**kwargs):
    print(kwargs)
    print(type(kwargs))
self_print2(last_name = 'zhang', first_name = 'san')

def self_print3(*args, **kwargs):
    print(args)
    print(kwargs)
self_print3('zhangsan', 'lisi', gender1 = '男', gender2 = '女')
運行結(jié)果

實際參數(shù)以*開頭,可將元組、列表、集合拆分為單個元素。
實際參數(shù)以**開頭,可將字典拆分為單個鍵值對。

4.函數(shù)返回值

函數(shù)在執(zhí)行過程中只要遇到return語句,就會停止執(zhí)行并返回結(jié)果,所以也可以理解為 return 語句代表著函數(shù)的結(jié)束。
如果未在函數(shù)中指定return,那這個函數(shù)的返回值為None。
Python可返回多個值。如果return多個對象,解釋器會把這多個對象組裝成一個元組作為一個一個整體結(jié)果輸出。

5.遞歸函數(shù)

遞歸函數(shù):直接或間接地調(diào)用自身的函數(shù)。
示例:

# 階乘
def factorial(n):
    if n == 1:
        return 1
    else:
        return n*factorial1(n-1)
# 斐波那契數(shù)列
def fibonacci(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fibonacci(n-1)+fibonacci(n-2)
# 漢諾塔
def hanoi(i, A, B, C):
    if i > 0:
        hanoi(i - 1, A, C, B)
        print(A, '->', C)
        hanoi(i - 1, B, A, C)

6.高階函數(shù)

高階函數(shù):參數(shù)或返回值是函數(shù)的函數(shù)
示例:
絕對值求和

def add_abs(x, y, f):
    return f(x) + f(y)


print(add_abs(3, -6, abs))
運行結(jié)果
  • 常用庫高階函數(shù)
    1.map()
map(function, iterable)

該函數(shù)會把iterable中的數(shù)據(jù)依次傳遞給function函數(shù)處理,最后把結(jié)果返回。



示例:

def power(x):
    return x**2


print(list(map(power, [1, 2, 3, 4, 5])))
print(list(map(lambda x: x**2, [1, 2, 3, 4, 5])))
運行結(jié)果

2.reduce()

reduce(function, iterable)

reduce() 函數(shù)會對參數(shù)列表中的元素進行累積。
function函數(shù)必須為接收兩個參數(shù)的函數(shù),reduce()會把function的運行結(jié)果作為一個參數(shù),然后從iterable中再取出一個數(shù)據(jù)當作另一個參數(shù)。



3.filter()

filter(function, iterable)

filter() 函數(shù)會根據(jù)function來過濾iterable。
具體做法是:將iterable中的數(shù)據(jù)依次傳入函數(shù)function中,如果函數(shù)返回True,則保留該數(shù)據(jù),反之則不保留。



4.sorted()

sorted(key=None, reverse=False)

sorted()函數(shù)會對iterable進行非原地排序(不修改原對象)。
通過參數(shù)key(參數(shù)key是一個函數(shù))來選取參與比較的元素。

7.匿名函數(shù)

  • lambda表達式
lambda 形參列表: 函數(shù)返回值表達式語句

示例:

def cal(x, y):
    if x > y:
        return x*y
    else:
        return x/y

calc = lambda x, y:x*y if x > y else x/y
print("常規(guī)函數(shù)調(diào)用:",cal(5,4))
print("使用lambda:",calc(5,4))
print("常規(guī)函數(shù)調(diào)用:",cal(2,4))
print("使用lambda:",calc(2,4))
運行結(jié)果
  • 排序經(jīng)常使用lambda表達式
    示例:
stus = [
    {'name': 'zhangsan', 'age': 33},
    {'name': 'lisi', 'age': 12},
    {'name': 'wangwu', 'age': 53},
    {'name': 'zhaoliu', 'age': 18},
    {'name': 'tianqi', 'age': 77}
]
print('排序前:', stus)
# key值是按照哪個元素為依據(jù)進行排序
res = sorted(stus, key=lambda item:item['age'])
print('根據(jù)年齡排序后:', res)
res = sorted(stus, key=lambda item:item['name'])
print('根據(jù)姓名排序后:', res)
運行結(jié)果

8.內(nèi)置函數(shù)

abs()    dict()    help()    min()    setattr()
all()    dir()    hex()    next()    slice()
any()    divmod()    id()    object()    sorted()
ascii()    enumerate()    input()    oct()    staticmethod()
bin()    eval()    int()    open()    str()
bool()    exec()    isinstance()    ord()    sum()
bytearray()    filter()    issubclass()    pow()    super()
bytes()    float()    iter()    print()    tuple()
callable()    format()    len()    property()    type()
chr()    frozenset()    list()    range()    vars()
classmethod()    getattr()    locals()    repr()    zip()
compile()    globals()    map()    reversed()    __import__()
complex()    hasattr()    max()    round()     
delattr()    hash()    memoryview()    set()

9.函數(shù)作用域

(1) 四種作用域

L:local,局部作用域,即函數(shù)中定義的變量。
E:enclosing,嵌套的父級函數(shù)的局部作用域,即包含此函數(shù)的上級函數(shù)的局部作用域,但不是全局的。
G:global,全局變量,就是模塊級別定義的變量。
B:built-in,系統(tǒng)固定模塊里面的變量,比如int, bytearray等。

搜索變量的優(yōu)先級順序依次是:局部作用域>外層作用域>當前模塊中的全局>python內(nèi)置作用域(LEGB)。

注意:local和enclosing是相對的,enclosing變量相對上層來說也是local。

(2) 作用域的產(chǎn)生

在Python中,只有模塊(module),類(class)以及函數(shù)(def、lambda)才會引入新的作用域,其它的代碼塊(如if、try、for等)是不會引入新的作用域的。

(3) 變量的跨域修改

對于一個變量,內(nèi)部作用域先聲明就會覆蓋外部變量,不聲明直接使用,就會使用外部作用域的變量。

當修改的變量是在全局作用域(global作用域)上時,需要使用global關(guān)鍵字先聲明。
當修改嵌套作用域(enclosing作用域,外層非全局作用域)中的變量時,需要使用nonlocal關(guān)鍵字聲明。

10.用戶自定義函數(shù)特殊屬性

屬性 意義 讀寫性
__doc__ 該函數(shù)的文檔字符串,沒有則為 None;不會被子類繼承。 可寫
__name__ 該函數(shù)的名稱。 可寫
__qualname__ 該函數(shù)的 qualified name。 可寫
__module__ 該函數(shù)所屬模塊的名稱,沒有則為 None。 可寫
__defaults__ 由具有默認值的參數(shù)的默認參數(shù)值組成的元組,如無任何參數(shù)具有默認值則為 None。 可寫
__code__ 表示編譯后的函數(shù)體的代碼對象。 可寫
__globals__ 對存放該函數(shù)中全局變量的字典的引用 --- 函數(shù)所屬模塊的全局命名空間。 只讀
__dict__ 命名空間支持的函數(shù)屬性。 可寫
__closure__ None 或包含該函數(shù)可用變量的綁定的單元的元組。 只讀
__annotations__ 包含參數(shù)標注的字典。字典的鍵是參數(shù)名,如存在返回標注則為 'return'。 可寫
__kwdefaults__ 僅包含關(guān)鍵字參數(shù)默認值的字典。 可寫
  • 查看函數(shù)文檔
print(函數(shù)名.__doc__)

help(函數(shù)名)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 函數(shù)和函數(shù)式編程 5.1 引言函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)...
    VIVAFT閱讀 1,080評論 0 5
  • Python 函數(shù) 函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。 函數(shù)能提高應(yīng)用的模塊性,和...
    木易林1閱讀 162評論 0 0
  • 函數(shù)的構(gòu)建格式 在Python中,函數(shù)的構(gòu)建要遵循一定的格式,如下所示: 函數(shù)代碼塊以 def 關(guān)鍵詞開頭,后接函...
    backup備份閱讀 594評論 0 0
  • 函數(shù) 函數(shù)是一段具有特定功能的、可重用的語句組 使用函數(shù)主要有兩個目的:降低編程難度和代碼重用 定義函數(shù) Pyth...
    柄志閱讀 466評論 0 0
  • 1、文件描述符 打開的文件都有一個fd: file descriptor (文件描述符),在/proc/$$/fd...
    張大志的博客閱讀 1,035評論 0 0

友情鏈接更多精彩內(nèi)容