Python基礎(chǔ)學(xué)習(xí)之函數(shù)和代碼復(fù)用詳解
Python函數(shù)和代碼復(fù)用
什么是函數(shù):
函數(shù)是一段具有特定功能的,可重用的語句組,通過函數(shù)名來表示和調(diào)用。經(jīng)過定義,一組語句等于一個函數(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ù)在定義時可以指定默認(rèn)值,當(dāng)函數(shù)被調(diào)用時,如果沒人傳入對應(yīng)的參數(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ù)形參對應(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.可變對象與不可變對象的參數(shù)傳遞
在函數(shù)調(diào)用過程中,進(jìn)行參的傳遞:
- 如果是不可變對象,函數(shù)體的修改不會影響實(shí)參的值
- 若果是可變對象,函數(shù)體的改變會影響到實(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)行參的傳遞:
如果是不可變對象,函數(shù)體的修改不會影響實(shí)參的值
若果是可變對象,函數(shù)體的改變會影響到實(shí)參的值
'''
def fun(arg1, arg2):
print('arg1=', arg1)
print('arg2=', arg2)
arg1 = 100 # arg1 的修改為100不會影響n1的值
arg2.append(200) # are2 的修改會影響到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ù)定義處的形參,n1,n2是函數(shù)調(diào)用處的實(shí)參, 實(shí)參和形參的名稱可以不一致
print(a) # 10
print(b) # [10, 20, 200]
print(x) # (100, [10, 20, 200])

4.個數(shù)可變的位置、關(guān)鍵字參數(shù)
個數(shù)可變的位置參數(shù): *arges
參數(shù)定義時,可能無法事先確定傳遞的位置實(shí)參的個數(shù),使用可變的位置參數(shù)
個數(shù)可變的關(guān)鍵字形參:**kwargs
參數(shù)定義時,可能無法事先確定傳遞的位置實(shí)參的個數(shù),使用可變的位置參數(shù)
在一個函數(shù)的定義過程中,既有個數(shù)可變的
*arges位置形參,又有個數(shù)可變的**kwargs關(guān)鍵字形參,要求把位置形參放在前面
# -*- coding: utf-8 -*-
# @File : demo.py
# @author: Flyme awei
# @email : Flymeawei@163.com
# @Time : 2022/8/14 17:02
# 個數(shù)可變的位置參數(shù) *arges
# 參數(shù)定義時,可能無法事先確定傳遞的位置時參的個數(shù),使用可變的位置參數(shù)
def fun(*args): # 函數(shù)定義時,可變的位置參數(shù)
print(args) # 返回值為元組
# print(args[0]) 返回元組的第1個對象
fun(10) # (10, )
fun(10, 20) # (10, 20)
fun(11, 22, 33) # (11, 22, 33)
# 個數(shù)可變的關(guān)鍵字形參
# 參數(shù)定義時,可能無法事先確定傳遞的位置是參的個數(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
以上程序報錯,個數(shù)可變的的位置參數(shù)值能有一個
def fun2(**kwargs)
pass
個數(shù)可變的關(guān)鍵字參數(shù)也只能有一個
'''
# 在一個函數(shù)的定義過程中,既有個數(shù)可變的位置形參,又有個數(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ù)傳遞,稱為位置傳參
lst = [11, 22, 33]
fun(*lst) # 函數(shù)調(diào)用,將列表中的每個元素都轉(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)用時,將字典中的鍵值對都轉(zhuǎn)換為關(guān)鍵字實(shí)參傳遞
6.函數(shù)參數(shù)總結(jié)(二)
def fun(a, b=10): # a是形式參數(shù)
print('b=', b)
def fun2(*args): # 個數(shù)可變的位置形參
print(args)
def fun3(**kwargs): # 個數(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) # 前面兩個進(jìn)行位置實(shí)參傳遞,后面兩個采用關(guān)鍵字實(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ù)中的任何部分,同時可以將0個、1個或多個函數(shù)運(yùn)算的結(jié)果返回給函數(shù)被調(diào)用處的變量。
函數(shù)的返回值
- 如果沒有返回值(函數(shù)執(zhí)行完畢后,不需要給調(diào)用處提供數(shù)據(jù)),
return可以省略不寫- 若果返回值為
1個,直接返回類型原類型- 如果返回值為
多個,返回結(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個,直接返回類型原類型
(2)如果返回值為多個,返回結(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 # 沒有返回值,可以省略 如果返回值為多個,返回結(jié)果為元組
lst1 = [12, 34, 45, 57, 67, 78, 89]
print(lst1)
# 函數(shù)調(diào)用
print(type(fun(lst1)))
'''函數(shù)定義時,是否需要返回值,視情況而定'''

五、變量的作用域
變量的作用域:程序代碼能訪問該變量的區(qū)域
局部變量:在函數(shù)內(nèi)定義并使用的變量,只在函數(shù)內(nèi)部有效,局部變量使用global聲明,這個變量就會變成全局變量全局變量:函數(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聲明,這個變量就會變成全局變量
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ù)用有另一個好處,當(dāng)更新函數(shù)功能時,所有被調(diào)用處的功能都被更新。
程序由一系列代碼組成,如果代碼是順序但無組織的,不僅不利于閱讀和理解,也很難進(jìn)行升級和維護(hù)。當(dāng)程序長度在百行以上,如果不劃分模塊,程序的可讀性就已經(jīng)很糟糕了。解決這一問題最好的方法是將一個程序分割成短小的程序段,每一段程序完成一個小的功能。使用函數(shù)對合理劃分為功能模塊,并基于模塊設(shè)計程序是一種常用方法,被稱為“
模塊化設(shè)計”。
模塊化設(shè)計是指函數(shù)的封裝功能將程序劃分成主程序、子程序和子程序間關(guān)系的表達(dá)。模塊化設(shè)計是使用函數(shù)設(shè)計的思考方法, 以功能塊為基本單位,一般有兩個基本要求:
緊耦合:盡可能合理劃分功能塊,功能塊內(nèi)部耦合緊密;松耦合:模塊間關(guān)系盡可能簡單,功能塊之間耦合度低。
使用函數(shù)只是模塊化設(shè)計的必要非充分條件,根據(jù)計算需求合理劃分函數(shù)十分重要。一般來說,完成特定功能或被經(jīng)常復(fù)用的一組語句應(yīng)該采用函數(shù)來封裝,并盡可能減少函數(shù)間參數(shù)和返回值的數(shù)量。
七、遞歸函數(shù)
1.什么是遞歸函數(shù)
如果在一個函數(shù)的函數(shù)體內(nèi)調(diào)用了該函數(shù)本身,這個函數(shù)就稱為遞歸函數(shù)。
2.遞歸的組成部分
遞歸調(diào)用與遞歸終止條件。
3.遞歸的調(diào)用過程
每遞歸調(diào)用一次函數(shù),都會在棧內(nèi)存分配一個棧幀,每執(zhí)行完一次函數(shù),都會釋放相應(yīng)的空間。
4.遞歸的優(yōu)缺點(diǎn)
缺點(diǎn):
占用內(nèi)存多,效率低下;
優(yōu)點(diǎn):思路和代碼簡單。
使用遞歸函數(shù)計算階乘
# 1.使用遞歸函數(shù)計算階乘
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定義個數(shù)可變的位置形參**kwargs定義個數(shù)可變的關(guān)鍵字形參變量=值定義默認(rèn)值形參- 函數(shù)調(diào)用的實(shí)參:
位置實(shí)參,關(guān)鍵字實(shí)參 - 變量的作用域:
局部變量,全局變量
到此這篇關(guān)于Python基礎(chǔ)學(xué)習(xí)之函數(shù)和代碼復(fù)用的文章就介紹到這了,更多相關(guān)Python函數(shù)和代碼復(fù)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決python2.7 查詢mysql時出現(xiàn)中文亂碼
這篇文章主要介紹了python操作mysql中文顯示亂碼的解決方法,是Python數(shù)據(jù)庫程序設(shè)計中經(jīng)常會遇到的問題,非常具有實(shí)用價值,需要的朋友可以參考下2016-10-10
Python中使用實(shí)現(xiàn)輸出哈沙德數(shù)的多種方法小結(jié)
哈沙德數(shù)(Harshad?Number),又稱Niven數(shù),是指一個自然數(shù),它可以被它的各位數(shù)字之和整除,本文將探討如何使用多種不同的方法來判斷一個數(shù)字是否是哈沙德數(shù),感興趣的可以了解下2024-01-01
基于python的socket實(shí)現(xiàn)單機(jī)五子棋到雙人對戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了基于python的socket實(shí)現(xiàn)單機(jī)五子棋到雙人對戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
Python fire模塊(最簡化命令行生成工具)的使用教程詳解
Python Fire是谷歌開源的一個第三方庫,用于從任何Python對象自動生成命令行接口(CLI),可用于如快速拓展成命令行等形式。本文將通過實(shí)例為大家詳細(xì)說說fire模塊的使用,感興趣的可以了解一下2022-10-10
Django中使用celery完成異步任務(wù)的示例代碼
本篇文章主要介紹了Django中使用celery完成異步任務(wù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Python爬蟲實(shí)現(xiàn)的根據(jù)分類爬取豆瓣電影信息功能示例
這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)的根據(jù)分類爬取豆瓣電影信息功能,結(jié)合完整實(shí)例形式分析了Python針對電影信息分類抓取的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-09-09

