程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Python】函數專題(知識總結、習題精練與編程實戰)

編輯:Python

個人主頁:黃小黃的博客主頁
支持我: 點贊 收藏 關注
格言:一步一個腳印才能承接所謂的幸運

本文來自專欄:Python基礎教程
歡迎點擊支持訂閱專欄 ️

文章目錄

  • 1 函數簡介與快速入門
  • 2 函數使用
    • 2.1 函數的定義與說明
    • 2.2 函數的文檔注釋
    • 2.3 函數的參數
    • 2.4 函數的返回值
    • 2.5 函數的嵌套調用
  • 3 函數專項訓練
    • 3.1 斐波那契數列
    • 3.2 素數判斷
    • 3.3 孿生素數
    • 3.4 溫度轉化
    • 3.5 豆堆問題
  • 寫在最後


1 函數簡介與快速入門

函數即 把具有獨立功能的代碼塊組織成一個小模塊。 可以在開發讓我們在開發程序時 提高編寫效率以及提高代碼的復用率。

這麼說可能體會不到函數的好處,我們來實際體會一下,下面的代碼塊是用於打印乘法口訣表的,當程序運行時,就會打印一次乘法口訣表:

for i in range(1, 10):
for j in range(1, i+1):
print(j, " * ", i, " = ", i*j, end="\t")
print()

如果需要將乘法口訣表打印100次呢? 難道需要將上面的代碼塊寫 100次嗎?答案是否定的,當我們學習了函數過後,只需要像下面那樣定義一個函數,將打印乘法口訣表功能的代碼塊封裝到函數裡面:

def myprint():
for i in range(1, 10):
for j in range(1, i+1):
print(j, " * ", i, " = ", i*j, end="\t")
print()

當需要打印乘法口訣表時,只需要調用定義過的 myprint() 函數即可,下面的代碼就將乘法口訣表打印了6次!!!

myprint()
myprint()
myprint()
myprint()
myprint()
myprint()

怎麼樣?是不是非常簡潔!下面我們開始系統學習函數相關的知識~


2 函數使用

2.1 函數的定義與說明

函數聲明的基本格式如下:

def 函數名(參數列表):
封裝的代碼
返回值
...

說明:

  • def是英文define的縮寫;
  • 函數名應該能表達函數封裝代碼的功能, 增加程序的可讀性,也方便將來的使用;
  • 參數列表和返回值根據程序需要選擇性添加;
  • 函數名稱需要符合標識符的命名規則。

標識符的命名規則:(回顧)

  • 可以由字母、下劃線和數字組成;
  • 不能以數字開頭,且不能與關鍵字重名。

2.2 函數的文檔注釋

在實際開發中,如果希望給函數添加注釋,則應該在 定義函數 下方,使用 連續的三對引號 添加文檔注釋:

  1. 引號中間添加對函數的說明性文字;

  2. 函數調用的位置,使用快捷鍵 CTRL + Q 可以查看函數的說明信息;

  3. 在函數定義的上方,應該與其他的代碼及注釋保留兩個空行。

2.3 函數的參數

函數的 參數在函數名後的小括號內部填寫, 多個參數見以 分隔。
簡單演示一下求兩數之和的函數,在該函數中有兩個參數,調用該函數則會打印兩數和的結果,每次調用傳入的參數不同,打印的結果不同,使函數更加靈活

def sum(num1, num2):
result = num1 + num2
print("%d + %d = %d" % (num1, num2, result))
sum(1, 3)
sum(99, 1)

辨析實參與形參

  • 形參: 定義函數時,小括號內的參數,是用來接收參數的,在函數內部作為變量使用,例如上面 sum 函數中的 num1與num2;
  • 實參: 調用函數時,小括號中的參數,是用來傳遞數據到函數內部使用的,例如在上述 sum 函數中的 1和3,99和1。

2.4 函數的返回值

在程序開發中,如果希望 函數在執行結束後返回一個結果,以便調用者進行後續處理, 則需要給函數一個返回值。

  • 在函數中使用 return 關鍵字返回結果;
  • 調用函數的一方,可以使用變量來接收函數的返回值;
  • return 表示返回,當該語句執行,則後續代碼不會執行。

我們對之前的求和函數設計一個返回值,使 sum 返回兩數的和,在外部調用時篩選出和大於5的情況

def sum(num1, num2):
return num1 + num2
for i in range(1, 6):
for j in range(i, 6):
result = sum(i, j)
if result > 5:
print(i, " + ", j, " = ", result)

2.5 函數的嵌套調用

在一個函數裡面調用了另外的函數,我們來看下面這段代碼:

def method01():
print("method01")
method02()
print("method01")
def method02():
print("---method02---")
method01()

說明:

  • 當調用 method01 時,先執行 method01 方法體內的語句,當執行到調用 method02() 這條語句時,則先執行完 method02() 內的所有語句再執行 method01() 方法的剩余語句。

3 函數專項訓練

3.1 斐波那契數列

斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家萊昂納多·斐波那契(Leonardo Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波那契數列以如下被以遞推的方法定義:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

問題: 請你編寫一函數 Fabonacci(n),其中參數 n 代表第 n 次的迭代,來實現求斐波那契第 n 項值的功能。

1️⃣ 方式一:使用遞歸
Tips:如果同學不熟悉遞歸,可以參考下博主的這篇文章:
️深入淺出悟透遞歸️

# 返回斐波那契數列的第 n 項
def fabonacci(n):
if n == 1 or n == 2:
return 1
else:
return fabonacci(n-1) + fabonacci(n-2)

2️⃣ 方式二:使用循環

# 返回斐波那契數列的第 n 項
def fabonacci(n):
if n == 1 or n == 2:
return 1
else:
num1 = 1 # 第一項
num2 = 1 # 第二項
result = 0 # 記錄結果
while n > 2:
result = num1 + num2
num1 = num2
num2 = result
n = n - 1
return result

測試代碼如下,用於打印斐波那契數列的前10項:

# 嘗試打印斐波那契前10項
for i in range(1, 11):
print(fabonacci(i), end=" ")

3.2 素數判斷

質數(素數)是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。

問題: 編寫一函數 Prime(n),對於已知正整數 n,判斷該數是否為素數,如果是素數,返回 True,否則返回 False。

分析:只需要循環判斷一個數是否能被除了1和本身外的其他數整除

參考代碼:

# 判斷是否為素數,如果是則返回True
def prime(n):
if n < 2:
return False
i = 2
while i <= n**0.5:
if n % i == 0:
return False
i = i + 1
return True

3.3 孿生素數

問題: 利用上題中判斷素數的函數,編寫程序找出 1~100 之間的所有孿生素數(若兩個素數之差為 2,則 這兩個素數就是一對孿生素數) 。例如: 3 和 5、5 和 7、11和 13 等都是孿生素數。

參考代碼:

# 判斷是否為素數,如果是則返回True
def prime(n):
if n < 2:
return False
i = 2
while i <= n**0.5:
if n % i == 0:
return False
i = i + 1
return True
# 測試打印1-100的孿生素數
# 使用枚舉的方式
for i in range(1, 101):
if prime(i) and prime(i + 2):
print(str(i) + "與" + str(i+2), end=" ")

運行結果:

3.4 溫度轉化

問題: 編寫一函數,將攝氏溫度與華氏溫度互轉。(公式: C*1.8+32=F)

分析:本題涉及到互相轉化問題,即一個函數實現兩種功能,考慮設置兩個參數,一個用於判斷是攝氏度轉華氏度還是華氏度轉攝氏度,一個用於傳入溫度值

參考代碼:

# 華氏度與攝氏度轉化 C*1.8+32=F
def calculate(typeNum, inputnum):
# typeNum 為 1 則為攝氏度轉華氏度
if typeNum == 1:
result = inputnum * 1.8 + 32
print(inputnum, "℃ = ", result, "F")
# typeNum 為 1 則為攝氏度轉華氏度
elif typeNum == 2:
result = (inputnum - 32) / 1.8
print(inputnum, "F = ", result, "℃")
else:
print("輸入有誤")
# 測試
typenum = int(input("請選擇輸入的類型,攝氏度/華氏度(1/2): "))
inputnum = float(input("請輸入溫度值: "))
calculate(typenum, inputnum)

運行結果:


3.5 豆堆問題

問題: 堆裡有 16 顆豆子,有兩個玩家(假設一個玩家是電腦)每個玩家都可以從堆中的 16 顆豆子中取出 1 顆, 2 顆或者 3 顆豆子。每個玩家在每回合中必須從堆中取出一定數目的豆子。玩家輪流取出豆子,取到最後 一顆豆子的玩家是輸家。 請你編寫程序,模擬豆堆游戲。

思路:寫一個人取豆子的函數 ; 幫電腦設計一個算法,實現取豆子的函數 ; 在主程序中進行輸流調用,誰最後拿到 1 粒豆子誰就輸。

參考代碼:

import random
# 玩家
def people(n):
print("-------------------------------------------")
while True:
pick_people = int(input("你打算取的豆子數: "))
if 1 <= pick_people <= 3:
break
else:
print("每次取出的豆子數應為1——3,請重新輸入!")
continue
print("豆子剩余數量:", n - pick_people)
return n - pick_people
# 電腦
def computer(n):
pick_computer = random.randint(1, 3)
print("電腦玩家取出豆子數:", pick_computer)
print("豆子剩余數量:", n - pick_computer)
return n - pick_computer
def play():
total = 16
print("豆子的總數為:", total)
while True:
total = people(total)
if total <= 0:
print("很抱歉,你輸了")
break
total = computer(total)
if total <= 0:
print("恭喜你,你贏了")
break
# 開始游戲
play()

運行結果:


寫在最後

以上便是本文的全部內容啦,後續內容將會持續免費更新,如果文章對你有所幫助,麻煩動動小手點個贊 + 關注,非常感謝 ️ ️ ️ !
如果有問題,歡迎私信或者評論區!

共勉:“你間歇性的努力和蒙混過日子,都是對之前努力的清零。”


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved