首頁 > 軟體

Python中函數的建立與呼叫你瞭解嗎

2022-03-30 19:03:23

建立函數

函數用 def 語句建立,語法如下:

def 函數名(參數列):  # 具體情況具體對待,引數可有可無
	"""函數說明檔案字串"""
    函數封裝的程式碼
    ……

標題行由 def 關鍵字,函數的名字,以及引數的集合(如果有的話)組成

def 子句的剩餘部分包括了一個雖然可選但是強烈推薦的檔案字串,和必需的函數體

函數名稱 的命名應該 符合 識別符號的命名規則

  • 可以由 字母、下劃線 和 數位 組成
  • 不能以數位開頭
  • 不能與關鍵字重名
def washing_machine():  # 洗衣機可以幫我們完成
    print("打水")
    print("洗衣服")
    print("甩幹")

呼叫函數

使用一對圓括號 () 呼叫函數,如果沒有圓括號,只是對函數的參照

任何輸入的引數都必須放置在括號中

圖例:

案例:加洗衣粉

def washing_machine():  # 洗衣機可以幫我們完成
    print("打水")
    print("加洗衣粉!!!")
    print("洗衣服")
    print("甩幹")
# 早上洗衣服
washing_machine()
# 中午洗衣服
washing_machine()
# 晚上洗衣服
washing_machine()

總結

  • 定義好函數之後,只表示這個函數封裝了一段程式碼而已
  • 如果不主動呼叫函數,函數是不會主動執行的

思考

  • 能否將 函數呼叫 放在 函數定義 的上方?
    • 不能!
    • 因為在 使用函數名 呼叫函數之前,必須要保證 Python 已經知道函數的存在
    • 否則控制檯會提示 NameError: name 'menu' is not defined (名稱錯誤:menu 這個名字沒有被定義)

函數的引數

形參和實參 

  • 形參定義 函數時,小括號中的引數,是用來接收引數用的,在函數內部 作為變數使用
  • 實參呼叫 函數時,小括號中的引數,是用來把資料傳遞到 函數內部 用的

問題

當我們想洗其他的東西,要手動改方法內部的程式碼:

def washing_machine():  # 洗衣機可以幫我們完成
    print("打水")
    print("加洗衣粉!!!")
    print("洗床單")  # 洗被套
    print("甩幹")

在函數內部有一定的變化的值:

def washing_machine():  # 洗衣機可以幫我們完成
    print("打水")
    print("加洗衣粉!!!")
    print("洗衣服")
    print("甩幹")
washing_machine()
def washing_machine():  # 洗衣機可以幫我們完成
    print("打水")
    print("加洗衣粉!!!")
    print("洗床單")
    print("甩幹")
washing_machine()
......

思考一下存在什麼問題

函數只能處理固定的資料

如何解決?

如果能夠把需要處理的資料,在呼叫函數時,傳遞到函數內部就好了!

傳遞引數

  • 在函數名的後面的小括號內部填寫 引數
  • 多個引數之間使用 , 分隔
  • 呼叫函數時,實參的個數需要與形參個數一致,實參將依次傳遞給形參
def washing_machine(something):  # 洗衣機可以幫我們完成
    print("打水")
    print("加洗衣粉!!!")
    print("洗" + something)
    print("甩幹")
# 洗衣服
washing_machine("衣服")
# 洗床單
washing_machine("床單")

圖例

def washing_machine(xidiji,something):  # 洗衣機可以幫我們完成
    print("打水")
    print("加" + xidiji)
    print("洗衣服" + something)
    print("甩幹")
#早上洗衣服
#按照引數位置順序傳遞引數的方式叫做位置傳參
#使用洗衣機,執行洗衣機內部的邏輯
washing_machine("洗衣液","衣服")#something = 衣服
#中午洗被罩
washing_machine("洗衣粉","被罩")# something = 被罩
#晚上洗床單
washing_machine("五糧液","床單")# something = 床單

作用

  • 函數,把 具有獨立功能的程式碼塊 組織為一個小模組,在需要的時候 呼叫
  • 函數的引數,增加函數的 通用性,針對 相同的資料處理邏輯,能夠 適應更多的資料

1.在函數 內部,把引數當做 變數 使用,進行需要的資料處理

2.函數呼叫時,按照函數定義的引數順序,把 希望在函數內部處理的資料,通過引數 傳遞

位置引數

與 shell 指令碼類似,程式名以及引數都以位置引數的方式傳遞給 python 程式,使用 sys 模組的 argv 列表接收

圖例

預設引數

預設引數就是宣告了 預設值 的引數,因為給引數賦予了預設值,所以在函數呼叫時,不向該引數傳入值也是允許的

函數的返回值

  • 在程式開發中,有時候,會希望 一個函數執行結束後,告訴呼叫者一個結果,以便呼叫者針對具體的結果做後續的處理
  • 返回值 是函數 完成工作後,最後 給呼叫者的 一個結果
  • 在函數中使用 return 關鍵字可以返回結果
  • 呼叫函數一方,可以 使用變數 來 接收 函數的返回結果

案例:計算任意兩個數位的和

# 函數的返回值: return, 用於對後續邏輯的處理
# 理解: 把結果揣兜裡,後續想幹啥幹啥,想列印列印,想求和就求和
# 注意:
# a. 函數中如果沒有return,那麼直譯器會自動加一個return None
# b. return表示函數的終止,return後的程式碼都不會執行
# 1 定義一個函數,計算兩個數的和
# 2 計算這兩個數的和是不是偶數
def get_sum(x, y=100):  # 預設引數
    he = x + y  # sum = 10 + 20
    return he   # return 30
    print("return表示函數的終止,return後的程式碼都不會執行")
# 將函數return後的結果賦值給變數dc: dc = sum  ->  dc = 30
dc = get_sum(10, 20)  # x = 10, y = 20
print("dc:", dc)  # 30
dc1 = get_sum(10)  # x = 10, y = 100
print("dc1:", dc1)  # 110
# if dc % 2 == 0:
#     print("偶數")
# else:
#     print("奇數")
 
#預設引數
#注意:具有預設值的引數後面不能跟沒有預設值的引數
def get_sum(a=20,b=5,c=10):
    he = a + b+ c
    return he
 
dc = get_sum(1,2,3) #a=1 b=2 c=3
print("dc:",dc) # 6
dc1 = get_sum(1,2)  # a=1 b=2 c=10
print("dc1:",dc1) # 13
dc2 = get_sum(1)  # a=1 b=5 c=10
print("dc2:",dc2) # 16
dc3 = get_sum()
print("dc3:",dc3) # 35

 修改菲波那切數列

def new_fib(n=8):
    list01 = [0,1]  #定義列表,指定初始值
    for dc in range(n-2):
        list01.append(list01[-1]+list01[-2])
    return list01
 
dc = new_fib()   #不加引數預設是8
dc1 = new_fib(10)
print("dc:",dc)
print("dc1:",dc1)

生成隨機密碼:

#練習:生成隨機密碼
#建立 randpass.py 指令碼,要求如下:
#編寫一個能生成8位元隨機密碼的程式
#使用 random 的 choice 函數隨機取出字元
#由使用者決定密碼長度
import random
def new_password():
    n = int(input("密碼長度:"))
    password = ""
    all = "0123456789zxcvbnmlkjhgfdsaqwertyuiopPOIUYTREWQASDFGHJKLMNBVCXZ" # 0-9 a-z A-Z
    random.choice(all)
    for i in range(n):
        dc = random.choice(all)
        password += dc
    # print("passwd:",password)
    return password
# 呼叫函數,才能執行函數內部邏輯
dc = new_password()
print("dc:",dc)

#練習:生成隨機密碼
#建立 randpass.py 指令碼,要求如下:
#編寫一個能生成8位元隨機密碼的程式
#使用 random 的 choice 函數隨機取出字元
#由使用者決定密碼長度
import random,string
def new_password():
    n = int(input("密碼長度:"))
    password = ""
    all = string.ascii_letters + string.digits
    random.choice(all)
    for i in range(n):
        dc = random.choice(all)
        password += dc
    # print("passwd:",password)
    return password
# 呼叫函數,才能執行函數內部邏輯
dc = new_password()
print("dc:",dc)

模組基礎

定義模組

基本概念

  • 模組是從邏輯上組織python程式碼的形式
  • 當程式碼量變得相當大的時候,最好把程式碼分成一些有組織的程式碼段,前提是保證它們的 彼此互動
  • 這些程式碼片段相互間有一定的聯絡,可能是一個包含資料成員和方法的類,也可能是一組相關但彼此獨立的操作函數

匯入模組 (import)

  • 使用 import 匯入模組
  • 模組屬性通過 “模組名.屬性” 的方法呼叫
  • 如果僅需要模組中的某些屬性,也可以單獨匯入

為什麼需要匯入模組?

可以提升開發效率,簡化程式碼

正確使用

# test.py,將 file_copy.py 放在同級目錄下
# 需求:要將/etc/passwd複製到/tmp/passwd
src_path = "/etc/passwd"
dst_path = "/tmp/passwd"
# 如何複製?
# 呼叫已有模組中的方法
#    - 很推薦,簡單粗暴不動腦
#    - 直接使用 file_copy.py的方法即可
 
# 匯入方法一:直接匯入模組
import file_copy  # 要注意路徑問題
file_copy.copy(src_path, dst_path)
 
# 匯入方法二:只匯入 file_copy 模組的 copy 方法
from file_copy import copy  # 如果相同時匯入多個模組 from file_copy import *
copy(src_path, dst_path)
 
# 匯入方法四:匯入模組起別名 as
import file_copy as fc
fc.copy(src_path, dst_path)

常用的匯入模組的方法

  • 一行指匯入一個模組,可以匯入多行, 例如:import random
  • 只匯入模組中的某些方法,例如:from random import choice, randint

模組載入 (load)

  • 一個模組只被 載入一次,無論它被匯入多少次
  • 只載入一次可以 阻止多重匯入時,程式碼被多次執行
  • 如果兩個檔案相互匯入,防止了無限的相互載入
  • 模組載入時,頂層程式碼會自動執行,所以只將函數放入模組的頂層是最好的程式設計習慣

模組特性及案例

模組特性

模組在被匯入時,會先完整的執行一次模組中的 所有程式

案例

# foo.py
print(__name__)
 
# bar.py
import foo  # 匯入foo.py,會將 foo.py 中的程式碼完成的執行一次,所以會執行 foo 中的 print(__name__)

結果:

# foo.py   ->   __main__   當模組檔案直接執行時,__name__的值為‘__main__’
# bar.py   ->   foo        當模組被另一個檔案匯入時,__name__的值就是該模組的名字

所以我們以後在 Python 模組中執行程式碼的標準格式:

def test():
    ......
if __name__ == "__main__":
    test()

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!


IT145.com E-mail:sddin#qq.com