網(wǎng)站首頁 編程語言 正文
Python函數(shù)和代碼復(fù)用
什么是函數(shù):
??函數(shù)是一段具有特定功能的,可重用的語句組,通過函數(shù)名來表示和調(diào)用。經(jīng)過定義,一組語句等于一個(gè)函數(shù),在需要使用這組語句的地方,直接調(diào)用函數(shù)名稱即可。因此,函數(shù)包括兩部分:函數(shù)的定義和函數(shù)的調(diào)用。
為什么要使用函數(shù):
- 代碼復(fù)用
- 影藏實(shí)現(xiàn)細(xì)節(jié)
- 提高可維護(hù)性
- 提高可讀性便于調(diào)試
- 降低編程難度
一、函數(shù)的定義
語法格式:
def ?函數(shù)名 ([參數(shù)列表]):
? ? 函數(shù)體
? ? return 返回值列表?
例:
# -*- coding: utf-8 -*- # @File : demo.py # @author: Flyme awei # @email : Flymeawei@163.com # @Time : 2022/8/14 17:02 def calc(a, b): # 函數(shù)定義 c = a + b return c
二、函數(shù)的調(diào)用
函數(shù)的定義也叫函數(shù)“聲明”,定義后的函數(shù)不能直接運(yùn)行,需要經(jīng)過“調(diào)用”才能得到運(yùn)行。
語法格式:
函數(shù)名(實(shí)際賦值參數(shù)列表)
# 函數(shù)創(chuàng)建 def calc(a, b): # 函數(shù)定義 c = a + b return c ''' 函數(shù)調(diào)用: 函數(shù)名(實(shí)際參數(shù)列表)''' d = calc(10, 20) # 函數(shù)調(diào)用 print(d) # 30
三、函數(shù)的參數(shù)傳遞
函數(shù)的參數(shù)在定義時(shí)可以指定默認(rèn)值,當(dāng)函數(shù)被調(diào)用時(shí),如果沒人傳入對(duì)應(yīng)的參數(shù)時(shí),則使用函數(shù)定義時(shí)的默認(rèn)值替代。
語法格式
def ?函數(shù)名(非可選參數(shù)列表,可選參數(shù)列表=默認(rèn)值):
? ? 函數(shù)體
? ? return 返回值列表?
1.形式參數(shù)與實(shí)際參數(shù)
- 函數(shù)定義處的參數(shù)稱為形式參數(shù)
- 函數(shù)調(diào)用處的參數(shù)稱為實(shí)際參數(shù)
2.位置傳參與關(guān)鍵字傳參
# -*- coding: utf-8 -*- # @File : demo.py # @author: Flyme awei # @email : Flymeawei@163.com # @Time : 2022/8/14 17:02 # 函數(shù)的參數(shù)傳遞 ''' 1.位置傳參 根據(jù)形參對(duì)應(yīng)的位置進(jìn)行參數(shù)傳遞 2.關(guān)鍵字實(shí)參 根據(jù)形參名稱進(jìn)行參數(shù)傳遞 ''' def calc(a, b): # a b 為函數(shù)定義當(dāng)處的形式參數(shù) c = a + b return c calc(10, 20) # 10 20 為函數(shù)調(diào)用處的實(shí)際參數(shù) # 位置實(shí)參 print(calc(10, 20)) # =左側(cè)的變量的名稱稱為關(guān)鍵字參數(shù) print(calc(b=10, a=20))
3.可變對(duì)象與不可變對(duì)象的參數(shù)傳遞
在函數(shù)調(diào)用過程中,進(jìn)行參的傳遞:
- 如果是不可變對(duì)象,函數(shù)體的修改不會(huì)影響實(shí)參的值
- 若果是可變對(duì)象,函數(shù)體的改變會(huì)影響到實(shí)參的值
# -*- coding: utf-8 -*- # @File : demo.py # @author: Flyme awei # @email : Flymeawei@163.com # @Time : 2022/8/14 17:02 ''' 在函數(shù)調(diào)用過程中,進(jìn)行參的傳遞: 如果是不可變對(duì)象,函數(shù)體的修改不會(huì)影響實(shí)參的值 若果是可變對(duì)象,函數(shù)體的改變會(huì)影響到實(shí)參的值 ''' def fun(arg1, arg2): print('arg1=', arg1) print('arg2=', arg2) arg1 = 100 # arg1 的修改為100不會(huì)影響n1的值 arg2.append(200) # are2 的修改會(huì)影響到n2的值 print('arg1=', arg1) # 100 print('arg2=', arg2) # [10, 20, 200] return arg1, arg2 a = 10 b = [10, 20] print('a', a) # 10 print('b', b) # [10, 20] x = fun(a, b) # 位置傳參 arg1,arg2時(shí)是函數(shù)定義處的形參,n1,n2是函數(shù)調(diào)用處的實(shí)參, 實(shí)參和形參的名稱可以不一致 print(a) # 10 print(b) # [10, 20, 200] print(x) # (100, [10, 20, 200])
4.個(gè)數(shù)可變的位置、關(guān)鍵字參數(shù)
個(gè)數(shù)可變的位置參數(shù): *arges
參數(shù)定義時(shí),可能無法事先確定傳遞的位置實(shí)參的個(gè)數(shù),使用可變的位置參數(shù)
個(gè)數(shù)可變的關(guān)鍵字形參:**kwargs
參數(shù)定義時(shí),可能無法事先確定傳遞的位置實(shí)參的個(gè)數(shù),使用可變的位置參數(shù)
在一個(gè)函數(shù)的定義過程中,既有個(gè)數(shù)可變的?
*arges
位置形參,又有個(gè)數(shù)可變的**kwargs
關(guān)鍵字形參,要求把位置形參
放在前面
# -*- coding: utf-8 -*- # @File : demo.py # @author: Flyme awei # @email : Flymeawei@163.com # @Time : 2022/8/14 17:02 # 個(gè)數(shù)可變的位置參數(shù) *arges # 參數(shù)定義時(shí),可能無法事先確定傳遞的位置時(shí)參的個(gè)數(shù),使用可變的位置參數(shù) def fun(*args): # 函數(shù)定義時(shí),可變的位置參數(shù) print(args) # 返回值為元組 # print(args[0]) 返回元組的第1個(gè)對(duì)象 fun(10) # (10, ) fun(10, 20) # (10, 20) fun(11, 22, 33) # (11, 22, 33) # 個(gè)數(shù)可變的關(guān)鍵字形參 # 參數(shù)定義時(shí),可能無法事先確定傳遞的位置是參的個(gè)數(shù),使用可變的位置參數(shù) def fun(**kwargs): print(kwargs) # 返回值是 字典 fun(a=10) # {'a': 10} fun(a=10, b=20, c=30) # {'a': 10, 'b': 20, 'c': 30} ''' def fun2(*args,*a) pass 以上程序報(bào)錯(cuò),個(gè)數(shù)可變的的位置參數(shù)值能有一個(gè) def fun2(**kwargs) pass 個(gè)數(shù)可變的關(guān)鍵字參數(shù)也只能有一個(gè) ''' # 在一個(gè)函數(shù)的定義過程中,既有個(gè)數(shù)可變的位置形參,又有個(gè)數(shù)可變的關(guān)鍵字形參,要求把位置形參放在前面 def fun(*args, **kwargs): pass
5.函數(shù)參數(shù)總結(jié)(一)
# -*- coding: utf-8 -*- # @File : demo.py # @author: Flyme awei # @email : Flymeawei@163.com # @Time : 2022/8/14 17:02 def fun(a, b, c): # a,b,c在函數(shù)定義處,所以是形式參數(shù) print('a=', a) print('b=', b) print('c=', c) # 函數(shù)調(diào)用 fun(10, 20, 30) # 函數(shù)調(diào)用時(shí)的參數(shù)傳遞,稱為位置傳參 lst = [11, 22, 33] fun(*lst) # 函數(shù)調(diào)用,將列表中的每個(gè)元素都轉(zhuǎn)換為位置實(shí)參傳遞 fun(a=100, b=200, c=300) # 函數(shù)調(diào)用,所以是關(guān)鍵字實(shí)參 dic = {'a': 111, 'b': 222, 'c': 333} print(fun(**dic)) # 函數(shù)調(diào)用時(shí),將字典中的鍵值對(duì)都轉(zhuǎn)換為關(guān)鍵字實(shí)參傳遞
6.函數(shù)參數(shù)總結(jié)(二)
def fun(a, b=10): # a是形式參數(shù) print('b=', b) def fun2(*args): # 個(gè)數(shù)可變的位置形參 print(args) def fun3(**kwargs): # 個(gè)數(shù)可變的關(guān)鍵字形參 print(kwargs) # 函數(shù)調(diào)用 fun(10) fun(10, 20) fun2(10, 20, 30) fun3(a=10, b=20) print('--------------------------') def fun4(a, b, *, c, d): # 需求 c,d 只能采用關(guān)鍵字實(shí)參傳遞 print('a=', a) print('b=', b) print('c=', c) print('d=', d) # fun4(10, 20, 30, 40) # 位置實(shí)參傳遞 fun4(a=10, b=20, c=30, d=40) # 關(guān)鍵字實(shí)參傳遞 print('--------------------------') fun4(10, 20, c=30, d=40) # 前面兩個(gè)進(jìn)行位置實(shí)參傳遞,后面兩個(gè)采用關(guān)鍵字實(shí)參傳遞 ''' 函數(shù)定義時(shí)的形參順序問題''' def fun5(a, b, *, c, d, **kwargs): pass def fun6(*args, **kwargs): pass def fun7(a, b=10, *args, **kwargs): pass
四、函數(shù)的返回值
??
return
語句用來結(jié)束函數(shù)并將程序返回到函數(shù)調(diào)用的位置繼續(xù)執(zhí)行。return
語句可以出現(xiàn)在函數(shù)中的任何部分,同時(shí)可以將0
個(gè)、1
個(gè)或多個(gè)函數(shù)運(yùn)算的結(jié)果返回給函數(shù)被調(diào)用處的變量。
函數(shù)的返回值
- 如果沒有返回值(函數(shù)執(zhí)行完畢后,不需要給調(diào)用處提供數(shù)據(jù)),
return
可以省略
不寫- 若果返回值為
1
個(gè),直接返回類型原類型
- 如果返回值為
多
個(gè),返回結(jié)果為元組
# -*- coding: utf-8 -*- # @File : demo.py # @author: Flyme awei # @email : Flymeawei@163.com # @Time : 2022/8/14 17:02 ''' 函數(shù)的返回值: (1)如果沒有返回值(函數(shù)執(zhí)行完畢后,不需要給調(diào)用處提供數(shù)據(jù)),return可以省略不寫 (2)若果返回值為1個(gè),直接返回類型原類型 (2)如果返回值為多個(gè),返回結(jié)果為元組 ''' def fun(lst): odd = [] even = [] for i in lst: if i % 2: odd.append(i) else: even.append(i) print(odd, even) return odd, even # 沒有返回值,可以省略 如果返回值為多個(gè),返回結(jié)果為元組 lst1 = [12, 34, 45, 57, 67, 78, 89] print(lst1) # 函數(shù)調(diào)用 print(type(fun(lst1))) '''函數(shù)定義時(shí),是否需要返回值,視情況而定'''
五、變量的作用域
變量的作用域:程序代碼能訪問該變量的區(qū)域
-
局部變量
:在函數(shù)內(nèi)定義并使用的變量,只在函數(shù)內(nèi)部有效,局部變量使用global
聲明,這個(gè)變量就會(huì)變成全局變量 -
全局變量
:函數(shù)體外定義的變量,可作用于函數(shù)內(nèi)外
# -*- coding: utf-8 -*- # @File : demo.py # @author: Flyme awei # @email : Flymeawei@163.com # @Time : 2022/8/14 17:02 # 變量的作用域:程序代碼能訪問該變量的區(qū)域 ''' 1.局部變量 在函數(shù)內(nèi)定義并使用的變量,只在函數(shù)內(nèi)部有效,局部變量使用global聲明,這個(gè)變量就會(huì)變成全局變量 2.全局變量 函數(shù)體外定義的變量,可作用于函數(shù)內(nèi)外 ''' def fun(a, b): c = a+b # c,在函數(shù)內(nèi)定義的變稱為局部變量 a,b為函數(shù)的形參,作用范圍也在在函數(shù)內(nèi)部,相當(dāng)于局部變量 print(c) name = '阿偉' # 函數(shù)外部定義的變量,全局變量,函數(shù)體內(nèi)外都可以使用 print(name) # 阿偉 def fun2(self): print(name) # 函數(shù)調(diào)用 fun2(name) # 阿偉 def fun3(): # 函數(shù)定義 global age # 函數(shù)內(nèi)部定義的變量,局部變量 使用global聲明,變量就變?yōu)槿肿兞? print(age) # 20 age = 20 fun3() # 函數(shù)調(diào)用 print(age) # 20
六、代碼復(fù)用
??函數(shù)是程序的一種基本抽象方式,它將一系列代碼組織起來通過命名供其他程序使用。
函數(shù)封裝
的直接好處是代碼復(fù)用,任何其他代碼只要輸入?yún)?shù)即可調(diào)用函數(shù),從而避免相同功能的代碼在被調(diào)用處重復(fù)編寫。代碼復(fù)用有另一個(gè)好處,當(dāng)更新函數(shù)功能時(shí),所有被調(diào)用處的功能都被更新。
??程序由一系列代碼組成,如果代碼是順序但無組織的,不僅不利于閱讀和理解,也很難進(jìn)行升級(jí)和維護(hù)。當(dāng)程序長(zhǎng)度在百行以上,如果不劃分模塊,程序的可讀性就已經(jīng)很糟糕了。解決這一問題最好的方法是將一個(gè)程序分割成短小的程序段,每一段程序完成一個(gè)小的功能。使用函數(shù)對(duì)合理劃分為功能模塊,并基于模塊設(shè)計(jì)程序是一種常用方法,被稱為“
模塊化設(shè)計(jì)
”。
??模塊化設(shè)計(jì)是指函數(shù)的封裝功能將程序劃分成主程序、子程序和子程序間關(guān)系的表達(dá)。模塊化設(shè)計(jì)是使用函數(shù)設(shè)計(jì)的思考方法, 以功能塊為基本單位,一般有兩個(gè)基本要求:
緊耦合
:盡可能合理劃分功能塊,功能塊內(nèi)部耦合緊密;松耦合
:模塊間關(guān)系盡可能簡(jiǎn)單,功能塊之間耦合度低。
?? 使用函數(shù)只是模塊化設(shè)計(jì)的必要非充分條件,根據(jù)計(jì)算需求合理劃分函數(shù)十分重要。一般來說,完成特定功能或被經(jīng)常復(fù)用的一組語句應(yīng)該采用函數(shù)來封裝,并盡可能減少函數(shù)間參數(shù)和返回值的數(shù)量。
七、遞歸函數(shù)
1.什么是遞歸函數(shù)
如果在一個(gè)函數(shù)的函數(shù)體內(nèi)調(diào)用了該函數(shù)本身,這個(gè)函數(shù)就稱為遞歸函數(shù)。
2.遞歸的組成部分
遞歸調(diào)用
與遞歸終止條件
。
3.遞歸的調(diào)用過程
每遞歸調(diào)用一次函數(shù),都會(huì)在棧內(nèi)存分配一個(gè)棧幀,每執(zhí)行完一次函數(shù),都會(huì)釋放相應(yīng)的空間。
4.遞歸的優(yōu)缺點(diǎn)
缺點(diǎn):
占用內(nèi)存多,效率低下
;
優(yōu)點(diǎn):思路和代碼簡(jiǎn)單
。
使用遞歸函數(shù)計(jì)算階乘
# 1.使用遞歸函數(shù)計(jì)算階乘 def fun(n): # 階乘函數(shù) if n == 1: return 1 elif n == 2: return 2 else: return n * fun(n-1) print(fun(6)) # 720
斐波那契數(shù)列
# 2.斐波那契數(shù)列 1 1 2 3 5 8 13 ... def fib(n): # 斐波那契函數(shù) if n == 1: return 1 elif n == 2: return 1 else: return fib(n - 1) + fib(n - 2) # 求斐波那契數(shù)列的第 n 項(xiàng) print(fib(6), end=' ') # 8
八、總結(jié)
- 函數(shù)使用
def
定義 -
*args
定義個(gè)數(shù)可變的位置形參 -
**kwargs
定義個(gè)數(shù)可變的關(guān)鍵字形參 -
變量=值
定義默認(rèn)值形參 - 函數(shù)調(diào)用的實(shí)參:
位置實(shí)參
,關(guān)鍵字實(shí)參
- 變量的作用域:
局部變量
,全局變量
原文鏈接:https://blog.csdn.net/m0_68744965/article/details/126336332
相關(guān)推薦
- 2022-03-30 C#算法之整數(shù)反轉(zhuǎn)_C#教程
- 2023-05-07 Pygame顯示文字的實(shí)現(xiàn)示例_python
- 2022-06-25 python格式化輸出實(shí)例(居中、靠右及靠左對(duì)齊)_python
- 2022-07-26 Python的基本數(shù)據(jù)類型
- 2022-08-21 caffe的python接口deploy生成caffemodel分類新的圖片_python
- 2022-07-22 Mybatis為實(shí)體類自定義別名的兩種方式
- 2023-01-13 C語言實(shí)現(xiàn)繪制貝塞爾曲線的函數(shù)_C 語言
- 2023-01-23 Python+Qt身體特征識(shí)別人數(shù)統(tǒng)計(jì)源碼窗體程序(使用步驟)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支