Python函數總結

目錄

一、普通函數

1.1 函數的定義與調用

1.2 函數的說明文檔

1.3?函數的參數

1.4?函數的返回值

二、函數的作用域和關鍵字

2.1 局部作用域

2.2 全局作用域

2.4?global關鍵字和nonlocal關鍵字的使用

三、函數的遞歸與嵌套

3.1 嵌套函數

3.2遞歸函數

四、函數名的應用

4.1 函數名可以作為另一個函數的參數或者返回值

4.2 函數名可以成為字典、集合、列表、元組中的元素

五、匿名函數與高階函數

5.1 匿名函數

5.2 高階函數

六、函數的閉包與裝飾器

6.1 閉包

6.2 裝飾器


一、普通函數

1.1 函數的定義與調用

定義:

def 函數名(參數):
? ? 函數體
? ? return 返回值

函數通過def關鍵字定義,def關鍵字后面跟著函數的函數名,函數名后面跟著小括號,小括號里面傳入函數需要的參數(函數可以有參數也可以沒有參數)。中間寫函數體,最后寫返回值(返回值可以有可以沒有,默認為None)。

1.2 函數的說明文檔

定義:函數說明文檔(docstring)是用來描述函數功能、參數、返回值等信息的字符串,直接寫在函數定義的第一行,使用三重引號 """ """ 包裹。它可以幫助其他開發者快速理解函數的用途,也方便自動生成文檔。

使用內置函數help()可以查看函數的說明文檔、使用函數名.__doc__的方式也能夠查看。

示例:

def add(a, b):"""計算兩個數的和。參數:a (int or float): 第一個加數b (int or float): 第二個加數返回:int or float: 兩數之和"""return a + bhelp(add)
print(add.__doc__)
1.3?函數的參數

函數的參數有可變參數與不可變參數

不可變參數:位置參數、關鍵字參數、僅關鍵字參數、默認參數。

可變參數:可變位置參數(*args)、可變關鍵字參數(**kwargs)。

參數的定義順序為:位置參數-->關鍵字參數-->可變位置參數(*args)-->僅關鍵字參數-->可變關鍵字參數(**kwargs)

1.4?函數的返回值

函數的返回值可以有多個(當有多個返回值時,會自動打包成元組),也可以沒有返回值,返回值默認為None

二、函數的作用域和關鍵字

函數作用域遵循以下規則:Python 按 LEGB 順序查找變量:Local(局部作用域)→ Enclosing(閉包作用域) → Global(全局作用域) → Built-in(內置作用域)。

2.1 局部作用域

定義在函數內的變量稱為局部變量,該變量只能在局部作用域中訪問和修改。

2.2 全局作用域

定義在函數外的變量稱為全局變量,該變量可以在任意作用域中訪問。

2.3 可變類型與不可變類型

可變類型:指的是在對某一可變類型進行修改時不會隨著修改而改變內存地址的,即對象本身不變。(可變類型有:列表,字典,集合)

不可變類型:該對象在內存中的地址固定,一旦確定了將不會發生改變,如果對該對象進行修改則會改變它在內存中的地址。(不可變類型有:字符串,元組,數值類型,布爾類型)

可變類型與不可變類型在函數作用域的影響:我們都知道,在局部作用域中如果不使用global關鍵字聲明的話就只能對對象進行訪問不能進行修改,如果該對象是一個可變類型的,那么我們在局部作用域中也能夠對該對象進行訪問和修改的操作(這里的修改不是改變該對象本身)

2.4?global關鍵字和nonlocal關鍵字的使用

global關鍵字:

如果想通過局部作用域來修改全局變量的話,那么就需要使用global關鍵字來聲明。被global關鍵字聲明的變量可以在局部作用域中被修改(未聲明的變量只能訪問)。

示例:

使用global:在函數內部,如果想要修改函數外部(全局作用域)定義的變量,必須使用 global 關鍵字聲明該變量。
x = 10  # 全局變量def modify():global x  # 聲明x是全局變量x = 20    # 修改全局變量xmodify()
print(x)  # 輸出 20

不使用global:如果沒有使用 global,函數內部對同名變量的賦值會創建一個新的局部變量,不會影響全局變量。

x = 10def modify():x = 20  # 這里創建了一個局部變量x,和全局變量無關modify()
print(x)  # 輸出 10,未被修改

nonlocal關鍵字:

nonlocal 用于在嵌套函數中聲明變量,表示該變量不是當前函數的局部變量,而是外層(但不是全局)函數作用域中的變量。這樣,內層函數就可以修改外層函數中的變量。

示例:多層嵌套

def outer():x = 10def middle():nonlocal xdef inner():nonlocal xx = 30inner()middle()print(x)  # 輸出 30outer()

三、函數的遞歸與嵌套

3.1 嵌套函數

定義:在一個函數內部定義另一個函數,或者在函數內部調用另一個函數,滿足其中任意一個條件即稱為嵌套函數。

示例:inner_function 是定義在 outer_function 內部的嵌套函數,outer_function 內部調用了 inner_function。

def outer_function(x):def inner_function(y):return y * yreturn inner_function(x) + 1print(outer_function(3))  # 輸出 10,因為 3*3+1=10
3.2遞歸函數

定義:遞歸函數就是函數自己調用自己

注意事項:在使用遞歸函數的時候要給遞歸函數設置一個出口,否則函數會一直執行下去直到棧溢出。

示例:factorial 函數通過遞歸計算階乘,if n == 0 是遞歸出口,防止無限遞歸。

def factorial(n):if n == 0:  # 遞歸出口return 1else:return n * factorial(n - 1)  # 函數自己調用自己print(factorial(5))  # 輸出 120

四、函數名的應用

4.1 函數名可以作為另一個函數的參數或者返回值

示例:函數名本質上是指向函數對象的引用,可以作為參數傳遞給其他函數,也可以作為函數的返回值返回。

def greet():return "Hello!"def call_func(func):return func()  # 調用傳入的函數result = call_func(greet)
print(result)  # 輸出:Hello!def get_greet_func():return greet  # 返回函數對象f = get_greet_func()
print(f())  # 輸出:Hello!
4.2 函數名可以成為字典、集合、列表、元組中的元素

示例:函數名作為函數對象,可以存儲在各種數據結構中,便于動態調用。

def add(x, y):return x + ydef multiply(x, y):return x * yfunc_list = [add, multiply]
print(func_list[0](2, 3))  # 輸出:5
print(func_list[1](2, 3))  # 輸出:6func_dict = {'加法': add, '乘法': multiply}
print(func_dict['加法'](4, 5))  # 輸出:9func_tuple = (add, multiply)
print(func_tuple[1](3, 7))  # 輸出:21func_set = {add, multiply}
for f in func_set:print(f(1, 2))  # 依次輸出3和2(順序不確定)

五、匿名函數與高階函數

5.1 匿名函數

匿名函數指的是只用一串代碼就能定義的函數,使用lambda關鍵字聲明。

語法:lambda 參數:函數體+返回值(函數體就是返回值,返回值就是函數體)

應用場景:對一些比較簡單的函數的創建與使用,作為高階函數中的參數,對一些只使用一次的簡單函數的創建。

示例:

# 普通函數定義
def add(x, y):return x + yprint(add(3, 5))  # 輸出 8# 使用匿名函數
add_lambda = lambda x, y: x + y
print(add_lambda(3, 5))  # 輸出 8# 作為高階函數參數
numbers = [1, 2, 3, 4, 5]# 用lambda對列表元素平方
squares = list(map(lambda x: x ** 2, numbers))
print(squares)  # 輸出 [1, 4, 9, 16, 25]# 用lambda篩選偶數
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # 輸出 [2, 4]# 用lambda排序,根據字符串長度排序
words = ['apple', 'banana', 'pear', 'grape']
words_sorted = sorted(words, key=lambda s: len(s))
print(words_sorted)  # 輸出 ['pear', 'grape', 'apple', 'banana']
5.2 高階函數

定義:一個函數如果他的參數中有函數名,或者是他的返回值有函數名就可以被稱為高階函數

常見的高階函數有:

1、map(function, iterable)?

參數:第一個參數為函數,第二個參數為可迭代對象

返回值:返回一個迭代器對象

作用:對可迭代對象中的每個元素執行指定函數。返回一個新的迭代器(返回結果為該迭代器的內存地址)

2、reduce(function, iterable[, initializer])

參數:第一個參數為函數,第二個參數為可迭代對象。initializer用于指定計的初始值。

  • 如果指定了 initializer,累計時的第一個調用會用 initializer 和可迭代對象的第一個元素作為參數調用 function。
  • 如果不指定,reduce 會用可迭代對象的前兩個元素作為第一次調用的參數,累計結果從第一個元素開始。

返回值:返回一個數值型對象。

作用:對可迭代對象的元素累計執行函數(函數必須接收兩個參數),將函數返回的結果與下一個元素做累積處理,最終返回單一值。

示例:

?
from functools import reduce# 計算列表元素之和
result = reduce(lambda x, y: x + y, [1, 2, 3, 4], 10)
print(result)  # 輸出 20,因為初始值是 10,累計結果是 10+1+2+3+4=20?

3、filter(function, iterable)

參數:第一個參數是一個函數,第二個參數是可迭代對象

作用:根據函數定義的規則過濾可迭代對象,保留函數返回值為True的元素,返回一個過濾后的迭代器對象。

返回值:返回一個迭代器對象

4、sorted(iterable, *, key=None, reverse=False)

參數:第一個參數為可迭代對象,第二個參數為‘*’目的是為了使key和reverse變為僅關鍵字參數,key是一個函數用于指定排序規則,默認為None。reverse為False時為升序排序,為True時為降序排序。

返回值:返回一個列表。

作用:對可迭代對象排序,按照key所定義的規則,返回一個新的列表。

示例:

# 對數字列表升序排序(默認)
print(sorted([3, 1, 4, 2]))  # 輸出 [1, 2, 3, 4]# 對數字列表降序排序
print(sorted([3, 1, 4, 2], reverse=True))  # 輸出 [4, 3, 2, 1]# 根據字符串長度排序
words = ['apple', 'banana', 'cherry', 'date']
print(sorted(words, key=len))  # 輸出 ['date', 'apple', 'banana', 'cherry']

5、zip(*iterables, strict=False)

參數:第一個參數為任意數量的可迭代對象,第二個參數strict默認為False

  • 如果為 False(默認),zip 會以最短的可迭代對象長度為準,生成對應數量的元組,超出部分會被忽略。
  • 如果為 True,則要求所有可迭代對象長度相同,否則會拋出 ValueError 異常。

返回值:返回一個迭代器對象

作用:合并參數一中的可迭代對象,參數二默認值為False,當strict為True時,要求每個可迭代對象的元素個數要一樣多,否則發生報錯。

6、enumerate(iterable, start=0)

參數:第一個參數是可迭代對象,第二個參數是指定索引起始值,默認從 0 開始計數。可以設置為任意整數。

返回值:返回一個迭代器對象

作用:可迭代對象進行遍歷時,同時獲取元素的索引(序號)和元素本身。返回一個枚舉對象(迭代器),其中每個元素是一個由索引和值組成的元組。

高階函數應用場景:

六、函數的閉包與裝飾器

6.1 閉包

定義:一個前提兩個條件,滿足就為閉包。在嵌套函數中,內部函數使用了外部函數的參數并且內部函數的返回值為外部函數的函數名,那么就把這個使用了外部函數參數的內部函數稱為閉包。

閉包的作用:我們都知道,當一個函數執行結束時,函數內部的變量都將被銷毀。如果使用了閉包,那么該函數執行結束將不會被銷毀,并且在全局作用域中可以通過閉包間接訪問局部變量。

示例:

def outer(x):def inner(y):return x + y  # 內部函數使用了外部函數的參數xreturn inner  # 返回內部函數f = outer(10)  # f是inner函數的閉包,記住了x=10
print(f(5))   # 輸出 15
6.2 裝飾器

定義和作用:裝飾器(Decorator)是一種特殊的函數它接受一個函數作為參數,并返回一個新的函數。它的主要作用是在不修改被裝飾函數的源代碼和調用方式的前提下,為函數增加額外功能(裝飾器的本質是:高階函數+閉包)

裝飾器的基本語法:使用語法糖@后面跟上裝飾器的函數名。在函數定義時裝飾需要被裝飾的函數。

def decorator(func):def wrapper():# 在調用原函數前可以做一些操作print("開始執行函數")func()# 在調用原函數后可以做一些操作print("函數執行完畢")return wrapper@decorator  # 語法糖,等同于 foo = decorator(foo)
def foo():print("這是被裝飾的函數")foo()
"""
輸出:
復制
開始執行函數
這是被裝飾的函數
函數執行完畢
"""

應用場景:

日志記錄:在函數執行前后打印日志信息

權限校驗:在函數執行前檢查用戶權限

性能測試:計算函數執行時間

緩存:保存函數的計算結果,避免重復計算

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93742.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sqlite-gui:一款開源免費、功能強大的SQLite開發工具

sqlite-gui 是一個輕量級的 SQLite 編輯器,基于 C/mingw64/WinAPI 開發,支持 Windows 平臺。 sqlite-gui 是一個免費開源的項目,代碼托管在 GitHub: https://github.com/little-brother/sqlite-gui 功能特性 支持 SQL 語法高亮…

Ethan獨立開發新品速遞 | 2025-08-19

每日精選Product Hunt上最值得關注的獨立產品,發現全球創新靈感,助力你的產品成長。 下面挑選出對獨立開發者最有參考價值的 10 個項目,側重開發工具、AI 工具、SaaS 和創業支持類產品,去除娛樂、小眾垂直和大公司產品。每條保留原…

從 Hive 數倉出發,全面剖析 StarRocks、MySQL、HBase 的使用場景與區別

以 Hive 數倉為底座,深入理解 StarRocks、MySQL 和 HBase 的區別與使用場景 一、前言 在現代大數據架構中,Hive 通常作為離線數倉的核心底座,負責批量數據的接入、清洗、計算與存儲。然而,為了滿足 實時計算、低延遲查詢、業務交互型操作和高并發存儲 等不同需求,我們往…

低延遲、跨平臺與可控性:直播SDK的模塊化價值解析

引言 音視頻直播已經從單純的娛樂應用,成長為產業級的實時交互基礎設施。無論是安防監控的秒級告警聯動、工業巡檢的遠程可視化操作,還是智慧教育中的多終端互動課堂、遠程醫療里的超低延遲手術協作,都離不開一條低延遲、高穩定性、跨平臺可…

JVM參數優化

JVM 參數優化是提升 Java 應用性能、減少 GC 停頓、避免 OOM(內存溢出)等問題的核心手段。優化的核心目標是平衡內存使用、GC 效率與應用響應速度,需結合應用類型(如 Web 應用、批處理應用)、業務場景(如高…

pytest高級用法之插件開發

背景 pytest,python全功能測試框架(用某句名言,甩unittest幾條街),鉤子函數、pytest插件、pytest裝飾器都能擴展pytest。 提及pytest高級用法,不得不說pytest插件,例如assert斷言失敗繼續斷言…

cesium中實時獲取鼠標精確坐標和高度

/*** 獲取鼠標位置的三維坐標(包含高度信息)* @param {Cesium.Cartesian2} position 鼠標位置* @returns {Cesium.Cartesian3|null} 三維坐標*/ function getMousePosition(position) {if (!position) return null;

Netty 集成 protobuf

什么是 Protobuf Protobuf(Protocol Buffers)是 Google 開發的一種高效、語言中立、平臺中立的序列化協議,用于在不同系統或語言之間傳輸結構化數據。開發者通過 .proto 文件定義消息結構,再使用生成的類進行序列化(轉為緊湊的二進制數據)和反序列化(還原為對象),相比…

程序調用 AI 大模型 -- Java

程序調用 AI 大模型 – Java 1、SDK 接入 安裝阿里云百煉SDK_大模型服務平臺百煉(Model Studio)-阿里云幫助中心 <dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><!-- 請將 the-latest-version 替…

VMware 虛擬機完全使用教程:從基礎到高級應用

VMware 虛擬機完全使用教程&#xff1a;從基礎到高級應用 一、引言 在當今數字化時代&#xff0c;計算機技術的飛速發展使得硬件性能不斷提升&#xff0c;但同時也帶來了資源浪費和管理復雜等問題。虛擬機技術應運而生&#xff0c;它能夠在一臺物理計算機上模擬出多臺獨立的計…

函數對象 vs 函數指針 vs lambda:該用哪個才高效?

博主介紹&#xff1a;程序喵大人 35 - 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x…

Java團隊項目開發規范——對象分層規范

分層與對象命名規范如上圖所示&#xff0c;系統劃分成3個層&#xff1a;Controller層&#xff0c;Service層&#xff0c;Domain層 Controller層&#xff1a; Controller層是接入層&#xff0c;提供對外或者前端的接口&#xff0c;該層主要作用是提供對外接口的封裝。基于CQRS分…

低功耗模式

1. 什么是低功耗&#xff1f;低功耗模式&#xff1a;MCU 暫停部分時鐘/外設&#xff0c;降低電流消耗&#xff0c;等待外部事件&#xff08;中斷/復位/喚醒&#xff09;再恢復運行。應用場景&#xff1a;電池供電設備&#xff08;傳感器、手持設備、IoT 節點&#xff09;——延…

GPT-5 官方前瞻:它將如何重塑你的數字生活?

你是否曾想過&#xff0c;有一天你的瀏覽器不再是一個被動等待指令的工具&#xff0c;而是一個能主動為你分憂解難的智能伙伴&#xff1f;OpenAI 的 CEO Sam Altman 最近的發言&#xff0c;以及關于 GPT-5 的種種跡象&#xff0c;都預示著這個未來比我們想象的更近。這不僅是一…

驅動開發系列65 - NVIDIA 開源GPU驅動open-gpu-kernel-modules 目錄結構

一:OS相關部分 kernel-open/ 內核接口層 kernel-open/nvidia/ nvidia.ko 的接口層,負責GPU初始化,顯存管理,PCIe通信,中斷處理,電源管理等底層功能。 kernel-open/nvidia-drm/ nvidia-drm.ko 的接口層,提供標準圖形接口,讓Xorg、Wayland、Kwin、GNOME等桌面環境能夠通…

GPT-4.1旗艦模型:復雜任務的最佳選擇及API集成實踐

GPT-4.1旗艦模型&#xff1a;復雜任務的最佳選擇及API集成實踐 概述 GPT-4.1作為新一代旗艦大模型&#xff0c;憑借其卓越的智能表現、強大的跨領域問題解決能力&#xff0c;成為復雜任務處理的首選。本文將詳細解析GPT-4.1的核心能力、接口用法、計費方式、功能對比及API集成…

paimon保姆級教程簡介

還在糾結 Flink 配 Hudi 還是 Iceberg&#xff1f;別選了&#xff0c;快來試試 Flink 的“天選之子”—— Apache Paimon&#xff01; 忘掉復雜的 Lambda 架構&#xff0c;擁抱真正的流批一體。我們的 Paimon 視頻教程&#xff0c;帶你用 Flink 原生湖倉格式&#xff0c;輕松構…

Transformer中的編碼器和解碼器是什么?

今天&#xff0c;我們來具體介紹Transformer的架構設計。 一個完整的Transformer模型就像一個高效的語言處理工廠&#xff0c;主要由兩大車間組成&#xff1a;編碼車間和解碼車間。 首先來看這幅“世界名畫”&#xff0c;你可以在介紹Transformer的場景中常常看到這幅圖&#x…

uniapp 應用未安裝:軟件包與現有軟件包存在沖突

應用未安裝&#xff1a;軟件包與現有軟件包存在沖突常見原因包名&#xff08;AppID&#xff09;沒變&#xff0c;但簽名證書不同安卓會把同一包名的 App 當成同一個應用。如果你之前安裝的版本用了 A 簽名&#xff0c;現在你打包用了 B 簽名&#xff0c;就會沖突&#xff0c;導…

MyCAT2的主從配置

1.創建數據源重置配置&#xff1a;/* mycat:resetConfig{} */添加讀寫的數據源/* mycat:createDataSource {"dbType": "mysql","idleTimeout": 60000,"initSqls": [],"initSqlsGetConnection": true,"instanceType&quo…