Python函數全面解析:從基礎到高級特性

文章目錄

  • Python函數全面解析:從基礎到高級特性
    • 一、函數基礎概念
      • 1. 什么是函數?
      • 2. 函數的組成部分
    • 二、函數的參數傳遞
      • 1. 參數類型對比
      • 2. 參數傳遞示例
    • 三、函數的作用域
      • 作用域示例
      • global和nonlocal關鍵字
    • 四、函數的屬性和方法
      • 1. 函數的特殊屬性
      • 2. 函數的特殊方法
    • 五、高階函數特性
      • 1. 函數作為對象
      • 2. 閉包
      • 3. 裝飾器
      • 4. lambda函數
    • 六、函數的高級用法
      • 1. 生成器函數
      • 2. 函數注解
      • 3. 偏函數
    • 七、函數的最佳實踐

Python函數全面解析:從基礎到高級特性

函數是Python編程中最重要的構建塊之一,本文將用通俗易懂的方式全面講解Python函數的各種知識點,包括基本概念、參數傳遞、作用域、裝飾器、屬性和方法等。

一、函數基礎概念

1. 什么是函數?

函數是一段可重復使用的代碼塊,它接受輸入(參數),執行特定任務,然后返回結果。

# 定義一個簡單的函數
def greet(name):"""這是一個問候函數"""return f"Hello, {name}!"# 調用函數
print(greet("Alice"))  # 輸出: Hello, Alice!

2. 函數的組成部分

組成部分說明示例
def 關鍵字用于定義函數def my_function():
函數名函數的標識符greet, calculate_sum
參數函數接受的輸入(name, age)
冒號 :表示函數體開始def func(): 后面的 :
函數體函數執行的代碼塊縮進的代碼部分
返回值函數返回的結果return result
文檔字符串函數的說明文檔"""這是函數的說明"""

二、函數的參數傳遞

1. 參數類型對比

參數類型定義方式調用方式特點
位置參數def func(a, b):func(1, 2)按位置順序傳遞
關鍵字參數def func(a, b):func(a=1, b=2)明確指定參數名
默認參數def func(a=1, b=2):func()func(3)參數有默認值
可變位置參數def func(*args):func(1, 2, 3)接收任意數量位置參數
可變關鍵字參數def func(**kwargs):func(a=1, b=2)接收任意數量關鍵字參數

2. 參數傳遞示例

# 位置參數和關鍵字參數
def describe_pet(animal_type, pet_name):print(f"I have a {animal_type} named {pet_name}.")describe_pet('hamster', 'Harry')  # 位置參數
describe_pet(pet_name='Harry', animal_type='hamster')  # 關鍵字參數# 默認參數
def describe_pet(pet_name, animal_type='dog'):print(f"I have a {animal_type} named {pet_name}.")describe_pet('Willie')  # 使用默認的animal_type
describe_pet('Harry', 'hamster')  # 覆蓋默認值# 可變參數
def make_pizza(*toppings):print("Making a pizza with:")for topping in toppings:print(f"- {topping}")make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')# 可變關鍵字參數
def build_profile(**user_info):profile = {}for key, value in user_info.items():profile[key] = valuereturn profileuser_profile = build_profile(name='Alice', age=25, occupation='Engineer')
print(user_profile)

三、函數的作用域

Python中有四種作用域,查找順序如下:

局部(Local) → 嵌套(Enclosing) → 全局(Global) → 內置(Built-in) → 報錯

作用域示例

x = 'global x'  # 全局變量def outer():x = 'outer x'  # 嵌套作用域變量def inner():x = 'inner x'  # 局部變量print(x)  # 輸出: inner xinner()print(x)  # 輸出: outer xouter()
print(x)  # 輸出: global x

global和nonlocal關鍵字

x = 10def modify_global():global x  # 聲明使用全局變量x = 20modify_global()
print(x)  # 輸出: 20def outer():x = 10def inner():nonlocal x  # 聲明使用嵌套作用域變量x = 20inner()print(x)  # 輸出: 20outer()

四、函數的屬性和方法

1. 函數的特殊屬性

Python函數對象有許多內置屬性:

屬性描述示例
__name__函數名func.__name__
__doc__文檔字符串func.__doc__
__module__定義函數的模塊名func.__module__
__defaults__默認參數的元組func.__defaults__
__code__包含編譯代碼的對象func.__code__.co_varnames
def example(a, b=1, *args, **kwargs):"""這是一個示例函數"""passprint(example.__name__)  # 輸出: example
print(example.__doc__)  # 輸出: 這是一個示例函數
print(example.__defaults__)  # 輸出: (1,)

2. 函數的特殊方法

函數也是對象,可以擁有自己的屬性和方法:

def my_func():pass# 添加自定義屬性
my_func.custom_attr = "This is a custom attribute"
print(my_func.custom_attr)  # 輸出: This is a custom attribute# 函數也是對象,可以存儲在數據結構中
functions = [my_func, print, len]
for func in functions:print(func.__name__)

五、高階函數特性

1. 函數作為對象

def shout(text):return text.upper()def whisper(text):return text.lower()def greet(func):greeting = func("Hello, Python!")print(greeting)greet(shout)  # 輸出: HELLO, PYTHON!
greet(whisper)  # 輸出: hello, python!

2. 閉包

def outer_func(x):def inner_func(y):return x + yreturn inner_funcclosure = outer_func(10)
print(closure(5))  # 輸出: 15

3. 裝飾器

def my_decorator(func):def wrapper():print("Before function call")func()print("After function call")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
# 輸出:
# Before function call
# Hello!
# After function call

4. lambda函數

# 普通函數
def square(x):return x ** 2# lambda等效
square = lambda x: x ** 2print(square(5))  # 輸出: 25# 常用于排序
points = [(1, 2), (3, 1), (5, 4)]
points.sort(key=lambda point: point[1])
print(points)  # 輸出: [(3, 1), (1, 2), (5, 4)]

六、函數的高級用法

1. 生成器函數

def countdown(n):while n > 0:yield nn -= 1for i in countdown(5):print(i)  # 輸出: 5 4 3 2 1

2. 函數注解

def greet(name: str, age: int = 30) -> str:return f"Hello {name}, you are {age} years old."print(greet("Alice", 25))
print(greet.__annotations__)
# 輸出: {'name': <class 'str'>, 'age': <class 'int'>, 'return': <class 'str'>}

3. 偏函數

from functools import partialdef power(base, exponent):return base ** exponentsquare = partial(power, exponent=2)
cube = partial(power, exponent=3)print(square(5))  # 輸出: 25
print(cube(5))    # 輸出: 125

七、函數的最佳實踐

  1. 單一職責原則:一個函數只做一件事
  2. 良好的命名:函數名應清晰表達其功能
  3. 適當的長度:函數不宜過長,一般不超過20行
  4. 文檔字符串:為函數添加清晰的文檔說明
  5. 避免副作用:函數應盡量減少修改外部狀態
  6. 合理使用參數:參數不宜過多,超過5個考慮重構
# 好的函數示例
def calculate_circle_area(radius):"""計算圓的面積Args:radius (float): 圓的半徑Returns:float: 圓的面積"""return 3.14159 * radius ** 2

通過本文的講解,你應該對Python函數的各個方面有了全面的了解。從基礎定義到高級特性,函數是Python編程中不可或缺的部分。掌握這些知識將幫助你編寫更清晰、更高效的代碼。

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

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

相關文章

Ubuntu20.04的安裝(VMware)

1.Ubuntu20.04.iso文件下載 下載網址&#xff1a;ubuntu-releases-20.04安裝包下載_開源鏡像站-阿里云 2.創建虛擬環境 2.1打開VMware與創建新虛擬機 點擊創建新虛擬機 如果沒下好可以點擊稍后安裝操作系統 選擇linux版本選擇Ubuntu 64位然后點擊下一步。 注意這里需要選擇一…

Kafka 的日志清理策略:delete 和 compact

Kafka delete 日志清理策略&#xff08;日志刪除&#xff09; 原理&#xff1a;按照一定保留策略&#xff0c;直接刪除不符合條件的日志分段。Kafka 把 topic 的一個 partition 大文件分成多個小文件段&#xff0c;通過這種方式&#xff0c;能方便地定期清除或刪除已消費完的文…

Go語言中常量的命名規則詳解

1. 常量的基本命名規則 1.1. 命名格式 1. 使用const關鍵字聲明&#xff1b; 2. 命名格式&#xff1a;const 常量名 [類型] 值&#xff1b; 3. 類型可以省略&#xff0c;由編譯器推斷&#xff1b; 1.2. 命名風格 大小寫規則&#xff1a; 1. 首字母大寫&#xff1a;導出常…

22、web場景-web開發簡介

22、web場景-web開發簡介 Web開發是指創建和維護在互聯網上運行的網站和應用程序的過程。它涉及多個技術領域&#xff0c;包括前端開發、后端開發和數據庫管理&#xff0c;共同實現網站的功能和用戶體驗。 ### 一、Web開發的基本概念 #### 1. **Web應用程序** - **狹義上**&am…

Structured Query Language(SQL)它到底是什么?

Structured Query Language&#xff08;SQL&#xff09; 的中文意思是 “結構化查詢語言”&#xff0c;它是一種專門用于管理和操作關系型數據庫的標準化編程語言。以下是其核心含義和用途的總結&#xff1a; 1. 核心功能 定義數據&#xff1a;創建、修改數據庫結構&#xff08…

ubuntu22.04上運行opentcs6.4版本

1、下載github上的源碼&#xff1a; openTCS - Downloads 2、安裝java21 我的版本是&#xff1a;java --version java 21.0.6 2025-01-21 LTS Java(TM) SE Runtime Environment (build 21.0.68-LTS-188) Java HotSpot(TM) 64-Bit Server VM (build 21.0.68-LTS-188, mixed mo…

游戲引擎學習第307天:排序組可視化

簡短談談直播編程的一些好處。 上次結束后&#xff0c;很多人都指出代碼中存在一個拼寫錯誤&#xff0c;因此這次我們一開始就知道有一個 bug 等待修復&#xff0c;省去了調試尋找錯誤的時間。 今天的任務就是修復這個已知 bug&#xff0c;然后繼續排查其他潛在的問題。如果短…

基于PyTorch的殘差網絡圖像分類實現指南

以下是一份超過6000字的詳細技術文檔&#xff0c;介紹如何在Python環境下使用PyTorch框架實現ResNet進行圖像分類任務&#xff0c;并部署在服務器環境運行。內容包含完整代碼實現、原理分析和工程實踐細節。 基于PyTorch的殘差網絡圖像分類實現指南 目錄 殘差網絡理論基礎服務…

(27)運動目標檢測 之 分類(如YOLO) 數據集自動劃分

(27)運動目標檢測 之 分類(如YOLO) 數據集自動劃分 目標檢測場景下有時也會遇到分類需求,比如車牌識別、顏色識別等等本文以手寫數字數據集為例,講述如何將 0~9 10個類別的數據集自動劃分,支持調整劃分比例手寫數字數據集及Python實現代碼可在此直接下載:https://downloa…

Ubuntu安裝1Panel可視化管理服務器及青龍面板及其依賴安裝教程

Ubuntu安裝1Panel可視化管理服務器及青龍面板及其依賴安裝教程 前言一、準備工作二、操作步驟1、1Panel安裝2、青龍面板安裝3、青龍面板依賴安裝 前言 1Panel 是一款現代化的開源 Linux 服務器管理面板&#xff0c;專注于簡化服務器運維操作&#xff0c;提供可視化界面管理 Web…

DataGridView中拖放帶有圖片的Excel,實現數據批量導入

1、帶有DataGridView的窗體&#xff0c;界面如下 2、編寫DataGridView支持拖放的代碼 Private Sub DataGridView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragEnterIf e.Data.GetDataPresent(DataFormats.FileDrop) ThenDim file…

創新點!貝葉斯優化、CNN與LSTM結合,實現更準預測、更快效率、更高性能!

能源與環境領域的時空數據預測面臨特征解析與參數調優雙重挑戰。CNN-LSTM成為突破口&#xff1a;CNN提取空間特征&#xff0c;LSTM捕捉時序依賴&#xff0c;實現時空數據的深度建模。但混合模型超參數&#xff08;如卷積核數、LSTM層數&#xff09;調優復雜&#xff0c;傳統方法…

獲取點擊點所在區域所能容納最大連續空白矩形面積及頂點坐標需求分析及相關解決方案

近日拿到一個需求&#xff0c;通過分析思考以及查詢資料得以解決&#xff0c;趁著不忙記錄一下&#xff1a; 需求&#xff1a; 頁面上放一個圖片控件&#xff0c;載入圖片之后&#xff0c;點擊圖片任何一個白色空間&#xff0c;找出點擊點所在區域所能容納的最大連續空白矩形…

vue-cli 構建打包優化(JeecgBoot-Vue2 配置優化篇)

項目&#xff1a;jeecgboot-Vue2 在項目二次開發后&#xff0c;在本人電腦打包時間為3分35秒左右 webpack5默認優化&#xff1a; Tree Shaking&#xff08;搖樹優化&#xff09;&#xff1a;刪除未使用的代碼base64 內聯&#xff1a; 小于 8KB 的資源&#xff08;圖片等&…

科學養生:解鎖現代健康生活新方式

在現代社會&#xff0c;熬夜加班、外賣快餐、久坐不動成了很多人的生活常態&#xff0c;由此引發的亞健康問題日益凸顯。其實&#xff0c;遵循科學的養生方式&#xff0c;無需復雜操作&#xff0c;從日常細節調整&#xff0c;就能顯著提升健康水平。? 飲食上&#xff0c;把控…

PostGIS使用小結

文章目錄 PostGIS使用小結簡介安裝配合postgres使用的操作1.python安裝gdal PostGIS使用小結 簡介 PostGIS 是 PostgreSQL 數據庫的地理空間數據擴展&#xff0c;通過為 PostgreSQL數據庫增加地理空間數據類型、索引、函數和操作符&#xff0c;使其成為功能強大的空間數據庫&…

NNG和DDS

NNG (Nanomsg Next Generation) 和 DDS (Data Distribution Service) 是兩種不同的通信協議&#xff0c;各自在不同場景下具有其優勢。下面我將對這兩種技術進行詳細解釋&#xff0c;并通過具體的例子來說明它們如何應用在實際場景中。 1. NNG (Nanomsg Next Generation) NNG簡…

自制操作系統day7(獲取按鍵編碼、FIFO緩沖區、鼠標、鍵盤控制器(Keyboard Controller, KBC)、PS/2協議)

day7 獲取按鍵編碼&#xff08;hiarib04a&#xff09; void inthandler21(int *esp) {struct BOOTINFO *binfo (struct BOOTINFO *) ADR_BOOTINFO; // 獲取系統啟動信息結構體指針unsigned char data, s[4]; // data: 鍵盤數據緩存&#x…

Javase 基礎加強 —— 09 IO流第二彈

本系列為筆者學習Javase的課堂筆記&#xff0c;視頻資源為B站黑馬程序員出品的《黑馬程序員JavaAI智能輔助編程全套視頻教程&#xff0c;java零基礎入門到大牛一套通關》&#xff0c;章節分布參考視頻教程&#xff0c;為同樣學習Javase系列課程的同學們提供參考。 01 緩沖字節…

服務器操作系統調優內核參數(方便查詢)

fs.aio-max-nr1048576 #此參數限制并發未完成的異步請求數目&#xff0c;應該設置避免I/O子系統故障 fs.file-max1048575 #該參數決定了系統中所允許的文件句柄最大數目&#xff0c;文件句柄設置代表linux系統中可以打開的文件的數量 fs.inotify.max_user_watches8192000 #表…