Python函數實戰:從基礎到高級應用

Python-函數

Python 中可以使用def關鍵字來定義函數。

函數定義規則:

  • 函數代碼塊以 def 關鍵詞開頭,后接函數標識符名稱和圓括號 ()
  • 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用于定義參數。
  • 函數的第一行語句可以選擇性地使用文檔字符串—用于存放函數說明。
  • 函數內容以冒號 : 起始,并且縮進。
  • return [表達式] 結束函數,選擇性地返回一個值給調用方,不帶表達式的 return 相當于返回 None。

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

函數的參數

寫一個函數,根據給出的三條邊的長度判斷是否可以構成三角形,如果可以構成三角形則返回True,否則返回False

def make_judgement(a, b, c):"""判斷三條邊的長度能否構成三角形"""return a + b > c and b + c > a and a + c > bprint(make_judgement(1, 2, 3))  # False
print(make_judgement(4, 5, 6))  # True

如果不想按照從左到右的順序依次給出abc 三個參數的值,也可以使用關鍵字參數,通過“參數名=參數值”的形式為函數傳入參數。

print(make_judgement(b=2, c=3, a=1))  # False
print(make_judgement(c=6, b=4, a=5))  # True

在定義函數時,我們可以在參數列表中用/設置強制位置參數positional-only arguments),用*設置命名關鍵字參數。所謂強制位置參數,就是調用函數時只能按照參數位置來接收參數值的參數;而命名關鍵字參數只能通過“參數名=參數值”的方式來傳遞和接收參數

# /前面的參數是強制位置參數
def make_judgement(a, b, c, /):"""判斷三條邊的長度能否構成三角形"""return a + b > c and b + c > a and a + c > b# 下面的代碼會產生TypeError錯誤,錯誤信息提示“強制位置參數是不允許給出參數名的”
# TypeError: make_judgement() got some positional-only arguments passed as keyword arguments
# print(make_judgement(b=2, c=3, a=1))

說明:強制位置參數是 Python 3.8 引入的新特性,在使用低版本的 Python 解釋器時需要注意。

# *后面的參數是命名關鍵字參數
def make_judgement(*, a, b, c):"""判斷三條邊的長度能否構成三角形"""return a + b > c and b + c > a and a + c > b# 下面的代碼會產生TypeError錯誤,錯誤信息提示“函數沒有位置參數但卻給了3個位置參數”
# TypeError: make_judgement() takes 0 positional arguments but 3 were given
# print(make_judgement(1, 2, 3))
參數的默認值

Python 中允許函數的參數擁有默認值,帶默認值的參數必須放在不帶默認值的參數之后

from random import randrange# 定義搖色子的函數
# 函數的自變量(參數)n表示色子的個數,默認值為2
# 函數的因變量(返回值)表示搖n顆色子得到的點數
def roll_dice(n=2):total = 0for _ in range(n):total += randrange(1, 7)return total# 如果沒有指定參數,那么n使用默認值2,表示搖兩顆色子
print(roll_dice())
# 傳入參數3,變量n被賦值為3,表示搖三顆色子獲得點數
print(roll_dice(3))
def add(a=0, b=0, c=0):"""三個數相加求和"""return a + b + c# 調用add函數,沒有傳入參數,那么a、b、c都使用默認值0
print(add())         # 0
# 調用add函數,傳入一個參數,該參數賦值給變量a, 變量b和c使用默認值0
print(add(1))        # 1
# 調用add函數,傳入兩個參數,分別賦值給變量a和b,變量c使用默認值0
print(add(1, 2))     # 3
# 調用add函數,傳入三個參數,分別賦值給a、b、c三個變量
print(add(1, 2, 3))  # 6
可變參數

Python 語言中可以通過星號表達式語法讓函數支持可變參數。所謂可變參數指的是在調用函數時,可以向函數傳入0個或任意多個參數。

# 用星號表達式來表示args可以接收0個或任意多個參數
# 調用函數時傳入的n個參數會組裝成一個n元組賦給args
# 如果一個參數都沒有傳入,那么args會是一個空元組
def add(*args):total = 0# 對保存可變參數的元組進行循環遍歷for val in args:# 對參數進行了類型檢查(數值型的才能求和)if type(val) in (int, float):total += valreturn total# 在調用add函數時可以傳入0個或任意多個參數
print(add())         # 0
print(add(1))        # 1
print(add(1, 2, 3))  # 6
print(add(1, 2, 'hello', 3.45, 6))  # 12.45

如果我們希望通過“參數名=參數值”的形式傳入若干個參數,具體有多少個參數也是不確定的,我們還可以給函數添加可變關鍵字參數,把傳入的關鍵字參數組裝到一個字典中,

# 參數列表中的**kwargs可以接收0個或任意多個關鍵字參數
# 調用函數時傳入的關鍵字參數會組裝成一個字典(參數名是字典中的鍵,參數值是字典中的值)
# 如果一個關鍵字參數都沒有傳入,那么kwargs會是一個空字典
def foo(*args, **kwargs):print(args)print(kwargs)foo(3, 2.1, True, name='測試', age=43, gpa=4.95)

用模塊管理函數

import關鍵字導入指定的模塊再使用完全限定名模塊名.函數名)的調用方式

module1.py

def foo():print('hello, world!')

module2.py

def foo():print('goodbye, world!')

test.py

import module1
import module2# 用“模塊名.函數名”的方式(完全限定名)調用函數,
module1.foo()  # hello, world!
module2.foo()  # goodbye, world!

在導入模塊時,還可以使用as關鍵字對模塊進行別名,這樣我們可以使用更為簡短的完全限定名。

test.pyimport module1 as m1
import module2 as m2m1.foo()  # hello, world!
m2.foo()  # goodbye, world!

標準庫中的模塊和函數

Python 標準庫中提供了大量的模塊和函數來簡化我們的開發工作,我們之前用過的random模塊就為我們提供了生成隨機數和進行隨機抽樣的函數;而time模塊則提供了和時間操作相關的函數;我們之前用到過的math模塊中還包括了計算正弦、余弦、指數、對數等一系列的數學函數。隨著我們深入學習 Python 語言,我們還會用到更多的模塊和函數。

Python 標準庫中還有一類函數是不需要import就能夠直接使用的,我們將其稱之為內置函數,這些內置函數不僅有用而且還很常用,下面的表格列出了一部分的內置函數。

# 內置函數綜合案例:學生成績管理系統def student_grade_system():"""學生成績管理系統演示各種內置函數的使用"""print("=== 學生成績管理系統 ===")# 1. abs - 計算成績差值的絕對值score1 = 85score2 = 92diff = abs(score1 - score2)print(f"\n1. 兩位學生成績差值的絕對值: {diff}")# 2. bin/hex/oct - 顯示學生ID的不同進制表示student_id = 123print(f"\n2. 學生ID {student_id} 的不同表示:")print(f"二進制: {bin(student_id)}")print(f"十六進制: {hex(student_id)}")print(f"八進制: {oct(student_id)}")# 3. chr/ord - 處理特殊字符grade_symbol = 'A'print(f"\n3. 等級符號 '{grade_symbol}' 的Unicode碼: {ord(grade_symbol)}")print(f"Unicode碼65對應的字符: {chr(65)}")# 4. input - 獲取學生姓名name = input("\n4. 請輸入學生姓名: ")# 5. len - 計算姓名長度print(f"姓名長度: {len(name)}")# 6. max/min/sum - 計算成績統計grades = [85, 92, 78, 90, 88]print(f"\n5. 成績統計 - 班級成績: {grades}")print(f"最高分: {max(grades)}")print(f"最低分: {min(grades)}")print(f"平均分: {sum(grades) / len(grades):.2f}")# 7. pow - 計算加權成績base_score = 80weight = 1.2weighted_score = pow(base_score, weight)print(f"\n6. 基礎分 {base_score} 的加權分(權重1.2): {weighted_score:.2f}")# 8. range - 生成學號序列print("\n7. 生成的學號序列:")for id in range(2023001, 2023006):print(id, end=' ')# 9. round - 四舍五入平均分avg = sum(grades) / len(grades)print(f"\n\n8. 精確到小數點后2位的平均分: {round(avg, 2)}")# 10. type - 檢查數據類型print("\n9. 數據類型檢查:")print(f"grades的類型: {type(grades)}")print(f"name的類型: {type(name)}")# 11. open - 寫入學生數據到文件print("\n10. 將學生數據寫入文件...")with open('student_data.txt', 'w', encoding='utf-8') as f:f.write(f"學生姓名: {name}\n")f.write(f"學生成績: {grades}\n")f.write(f"平均分: {avg:.2f}\n")print("數據已寫入student_data.txt文件")# 運行學生成績管理系統
student_grade_system()

函數應用實戰

例子1:隨機驗證碼

設計一個生成隨機驗證碼的函數,驗證碼由數字和英文大小寫字母構成,長度可以通過參數設置。

import random
import string# 生成一個隨機字符串 ,長度為10 ,由數字和字母組成
ALL_CHAR = string.digits + string.ascii_letters;def generate_code(*,code_len=4):"""生成指定長度的驗證碼:param code_len: 驗證碼的長度(默認4個字符):return: 由大小寫英文字母和數字構成的隨機驗證碼字符串random.choice(ALL_CHAR,k=code_len) 從ALL_CHAR中隨機選擇k個字符"""return ''.join(random.choices(ALL_CHAR,k=code_len))for _ in range(5):print(generate_code(code_len=10))

例子2:判斷素數

設計一個判斷給定的大于1的正整數是不是質數的函數。質數是只能被1和自身整除的正整數(大于1),如果一個大于 1 的正整數 N 是質數,那就意味著在 2 到 N?1 之間都沒有它的因子。

def is_prime(num: int) -> bool:"""判斷一個正整數是不是質數:param num: 大于1的正整數:return: 如果num是質數返回True,否則返回False"""for i in range(2, int(num ** 0.5) + 1):if num % i == 0:return Falsereturn True

說明1:上面is_prime函數的參數num后面的: int用來標注參數的類型,雖然它對代碼的執行結果不產生任何影響,但是很好的增強了代碼的可讀性。同理,參數列表后面的-> bool用來標注函數返回值的類型,它也不會對代碼的執行結果產生影響,但是卻讓我們清楚的知道,調用函數會得到一個布爾值,要么是True,要么是False

說明2:上面的循環并不需要從 2 循環到 N?1 ,因為如果循環進行到 N 時,還沒有找到$\small{N}$的因子,那么 N 之后也不會出現 N 的因子,大家可以自己想一想這是為什么。

例子3:最大公約數和最小公倍數

設計計算兩個正整數最大公約數和最小公倍數的函數。 x 和 y 的最大公約數是能夠同時整除 x 和 y 的最大整數,如果 x 和 y 互質,那么它們的最大公約數為 1; x 和 y 的最小公倍數是能夠同時被 x 和 y 整除的最小正整數,如果 x 和 y 互質,那么它們的最小公倍數為 x×y 。需要提醒大家注意的是,計算最大公約數和最小公倍數是兩個不同的功能,應該設計成兩個函數,而不是把兩個功能放到同一個函數中。

def lcm(x: int, y: int) -> int:"""求最小公倍數"""return x * y // gcd(x, y)def gcd(x: int, y: int) -> int:"""求最大公約數"""while y % x != 0:x, y = y % x, xreturn x

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

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

相關文章

Mac在局域網中突然很慢(包括SMB、NFS、SCP、SSH、Ping等場景均很慢)

今天 SMB 又突然好慢,大概只有 8-9 MB/s,而蘋果 SMB 很容易突然很慢是出了名的。我就想裝 NFS,但是 NFS 弄好之后還是很慢,我服了,我就檢查了scp等場景,都很慢,但是互聯網下載速度還是很快的。 …

UMAP:用于降維的均勻流形近似和投影實驗

關鍵詞: Uniform Manifold Approximation and Projection (UMAP):均勻流形近似與投影 一、說明 對于降維,首先看數據集是否線性,如果是線性的用pca降維;如果是非線性數據,t-SNE或者UMAP,本文針…

【Datawhale組隊學習202506】YOLO-Master task03 IOU總結

系列文章目錄 task01 導學課程 task02 YOLO系列發展線 文章目錄 系列文章目錄前言1 功能分塊1.1 骨干網絡 Backbone1.2 頸部網絡 Neck1.3 頭部網絡 Head1.3.1 邊界框回歸頭1.3.2 分類頭 2 關鍵概念3 典型算法3.1 NMS3.2 IoU 總結 前言 Datawhale是一個專注于AI與數據科學的開…

Spring IOC容器核心揭秘:BeanFactory創建、配置加載解析并注冊為BeanDefinition

文章目錄 一、為何這個階段如此重要?二、整體流程全景圖三、源碼級深度解析1. BeanFactory的誕生源碼入口:refresh()方法核心方法:obtainFreshBeanFactory()核心實現:refreshBeanFactory()BeanFactory實例化 2. ★ 核心&#xff1…

解鎖n8n:開啟工作流自動化的無限可能(5/6)

文章摘要:n8n 是一款開源低代碼工作流自動化平臺,通過可視化拖放節點創建復雜工作流,無需大量代碼。具有強大集成能力、數據轉換、錯誤處理等功能,適用于數據同步、客戶關系管理、IT 自動化等場景。相比 Zapier、IFTTT 等工具&…

數據賦能(308)——合作共享——數據交流

概述 重要性如下: 信息準確性:數據交流原則確保在數據傳遞過程中信息的準確性,這是決策和業務活動的基礎。決策支持:準確的數據交流為決策提供有力支持,幫助組織做出更明智的決策。業務效率:有效的數據交…

TCP流量控制與擁塞控制:核心機制與區別

一、TCP流量控制(Flow Control) 定義:通過調節發送方的發送速率,確保接收方能夠及時處理數據,避免緩沖區溢出。 本質:解決發送方與接收方之間的"端到端"速率匹配問題。 1. 實現機制&#xff1a…

iOS多端兼容性調試:一次iOS性能優化分工具協作排查過程

在多技術棧混合開發日益普及的今天,iOS應用中越來越多地集成了WebView、Flutter、React Native甚至小程序模塊。而這些模塊帶來的復雜性,不僅體現在UI適配,還包括數據同步、系統權限管理、線程調度等方面的問題。 本文記錄的是我們在處理一個…

秋招Day14 - MySQL - 索引

索引為什么能夠提高MySQL的查詢效率? 索引可以理解為目錄,通過索引可以快速定位數據,避免全表掃描 一般是B樹結構,查找效率是O(log n)。 索引還能加速排序、分組、連接等操作。 create index idx_name on students(name); 能簡…

第5天:LSTM預測火災溫度

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 目標 復用LSTM模型實現火災溫度預測 具體實現 (一)環境 語言環境:Python 3.10 編 譯 器: PyCharm 框 架: Pytorch &am…

目標檢測之YOLOV11自定義數據使用OBB訓練與驗證

一、前置條件與環境準備 在開始訓練前,確保已完成以下準備《目標檢測之YOLOV11自定義數據預處理——從原始標注到YOLO-OBB格式轉換與驗證》: 數據目錄結構: yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程進階一(Labview與OPC UA設備通信)

1.Labview與OPC UA設備通信 OPC UA通信協議優勢顯著,具體表現如下: 跨平臺兼容:支持多種操作系統和硬件平臺,實現無縫數據交換。高安全性:內置加密、身份驗證和授權機制,確保數據傳輸安全。高效數據交換:采用二進制編碼和優化的傳輸協議,提高通信效率。復雜數據建模:…

【Comsol教程】如何求解指定范圍的積分 或 在積分中去除奇異點/異常值

我們在Comsol中經常需要對物體的邊界求積分,比如求物體在流場中所受的總流體牽引力,又或者是物體在電場中受到的總介電泳力。當物體的材料或者邊界條件存在突變時,物體表面的粘性應力或者麥克斯韋電應力可能會存在異常值。通常解決方法有細化…

Python 多版本治理理念(Windows 平臺 · 零基礎友好)

🧠 Python 多版本治理理念(Windows 平臺 零基礎友好) 🌐 核心原則:三維治理、四級隔離、五項自治 以下是基于人工智能深度學習環境搭建實踐,總結出的"零基礎入門 Conda工具鏈 全隔離項目環境"…

Python文件管理利器之Shutil庫詳解

Shutil是一個Python內置的用來高效處理文件和目錄遷移任務的庫。Shutil不僅支持基本的文件復制、移動和刪除操作,還具備處理大文件、批量遷移目錄、以及跨平臺兼容性等特性。通過使用Shutil,我們可以更加輕松地實現文件系統的管理和維護,本文…

學習華為 ensp 的學習心得體會

引言? 在信息技術日新月異的今天,網絡技術作為連接世界的橋梁,其重要性不言而喻。作為一名對網絡技術充滿熱情的大一新生,我選擇了 eNSP(Enterprise Network Simulation Platform,企業網絡模擬平臺)作為我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一個小案例講解:控制面板(GUI)

# 好吧,每天更新實在有點艱巨,我盡量少量多次 代碼倉 所有代碼都會上傳到這里,可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 運行效果圖 ? 知識要點 一、安裝dat.gui npm i dat.gui 二、使用步驟&a…

飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究

以下是一篇關于飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究的論文 ,涵蓋理論分析、數學模型構建、控制策略設計及仿真驗證等內容,適用于電氣工程、新能源技術等領域的研究參考。 飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究 摘要 隨著風電在電力…

一次性理解Java垃圾回收--簡單直接方便面試時使用

Java的垃圾回收是一個面試必問題,只要按照下面的步驟回答肯定不會有大問題。 1.先告訴面試官垃圾回收分為兩大步: a.識別哪些對象是"垃圾"(不再被使用的對象) b.回收這些垃圾對象占用的內存空間 2. 接下來分別介紹標記階段和回收階段的細節…