欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python函數(shù)和模塊的使用詳情

 更新時(shí)間:2022年04月26日 08:32:58   作者:人在^O^旅途  
這篇文章主要介紹了Python函數(shù)和模塊的使用詳情,文章基于python的相關(guān)資料展開主題的具體介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

一、定義函數(shù)

在Python中可以使用def關(guān)鍵字來定義函數(shù),命名規(guī)則跟變量的命名規(guī)則是一致的。在函數(shù)名后面的圓括號(hào)中可以放置傳遞給函數(shù)的參數(shù),而函數(shù)執(zhí)行完成后我們可以通過return關(guān)鍵字來返回一個(gè)值。

定義代碼如下:

def fac(num):
? ? """求階乘"""
? ? result = 1
? ? for n in range(1, num + 1):
? ? ? ? result *= n
? ? #返回值
? ? return result

二、函數(shù)的參數(shù)

在Python中,函數(shù)的參數(shù)可以有默認(rèn)值,也支持使用可變參數(shù),所以Python并不需要像其他語(yǔ)言一樣支持函數(shù)的重載,因?yàn)槲覀冊(cè)诙x一個(gè)函數(shù)的時(shí)候可以讓它有多種不同的使用方式,

下面是兩個(gè)小例子:

from random import randint
?
?
def roll_dice(n=2):
? ? """搖色子"""
? ? total = 0
? ? for _ in range(n):
? ? ? ? total += randint(1, 6)
? ? return total
?
?
def add(a=0, b=0, c=0):
? ? """三個(gè)數(shù)相加"""
? ? return a + 2 * b + 3 * c
?
?
# 如果沒有指定參數(shù)那么使用默認(rèn)值搖兩顆色子
print(roll_dice())
# 搖三顆色子
print(roll_dice(3))
#函數(shù)重載,沒有指定函數(shù)變量時(shí),參數(shù)按照順序傳值
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 傳遞參數(shù)時(shí)可以不按照設(shè)定的順序進(jìn)行傳遞
print(add(c=50, a=100, b=200))
# 或者可以不傳
print(add(c=50, b=200))
?
if __name__ == '__main__':
? ? pass

沒有傳入對(duì)應(yīng)參數(shù)的值時(shí)將使用該參數(shù)的默認(rèn)值。

不確定參數(shù)個(gè)數(shù)的時(shí)候,我們可以使用可變參數(shù),代碼如下所示:

# 在參數(shù)名前面的*表示args是一個(gè)可變參數(shù)
def add(*args):
? ? total = 0
? ? for val in args:
? ? ? ? total += val
? ? return total
?
?
# 在調(diào)用add函數(shù)時(shí)可以傳入0個(gè)或多個(gè)參數(shù)
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))

三、用模塊管理函數(shù)

由于Python沒有函數(shù)重載的概念,那么后面的定義函數(shù)會(huì)覆蓋之前的定義,也就意味著兩個(gè)函數(shù)同名函數(shù)實(shí)際上只有一個(gè)是存在的。

def foo():
? ? print('hello, world!')
?
?
def foo():
? ? print('goodbye, world!')
?
?
# 下面的代碼會(huì)輸出什么呢?
foo()
?
if __name__ == '__main__':
? ? pass
?
#實(shí)際輸出
goodbye, world!

多人協(xié)作進(jìn)行團(tuán)隊(duì)開發(fā)的時(shí)候,團(tuán)隊(duì)中可能有多個(gè)程序員都定義了名為foo的函數(shù),那么怎么解決這種命名沖突呢?

重點(diǎn)如何避免函數(shù)覆蓋!!!

在Python中每個(gè).py文件就代表了一個(gè)模塊(module),我們?cè)诓煌哪K中可以有同名的函數(shù),在使用函數(shù)的時(shí)候我們通過import關(guān)鍵字導(dǎo)入指定的模塊就可以區(qū)分到底要使用的是哪個(gè)模塊中的foo函數(shù),

代碼如下所示:

module1.py
?
def foo():
? ? print('hello, world!')
?
module2.py
?
def foo():
? ? print('goodbye, world!')

導(dǎo)入模塊:

test.py
?
import module1 as m1
import module2 as m2
?
m1.foo()
m2.foo()

注意:但是如果將代碼寫成了下面的樣子,那么程序中調(diào)用的是最后導(dǎo)入的那個(gè)foo,因?yàn)楹髮?dǎo)入的foo覆蓋了之前導(dǎo)入的foo。

from module1 import foo
from module2 import foo
?
# 輸出goodbye, world!,使用的是后導(dǎo)入的模塊
foo()

需要說明的是,如果我們導(dǎo)入的模塊除了定義函數(shù)之外還有可以執(zhí)行代碼,那么Python解釋器在導(dǎo)入這個(gè)模塊時(shí)就會(huì)執(zhí)行這些代碼,事實(shí)上我們不想執(zhí)行這些代碼,那我們將可執(zhí)行代碼放入如下所示的條件中,這樣的話除非直接運(yùn)行該模塊,if條件下的這些代碼是不會(huì)執(zhí)行的,因?yàn)橹挥兄苯訄?zhí)行的模塊的名字才是"__main__"。

def foo():
? ? pass
?
def bar():
? ? pass
?
# __name__是Python中一個(gè)隱含的變量它代表了模塊的名字
# 只有被Python解釋器直接執(zhí)行的模塊的名字才是__main__
if __name__ == '__main__':
? ? print('call foo()')
? ? foo()
? ? print('call bar()')
? ? bar()
import module3
# 導(dǎo)入module3時(shí) 不會(huì)執(zhí)行模塊中if條件成立時(shí)的代碼 因?yàn)槟K的名字是module3而不是__main__

四、變量的作用域 

def foo():
? ? b = 'hello'
?
? ? # Python中可以在函數(shù)內(nèi)部再定義函數(shù)
? ? def bar():
? ? ? ? c = True
? ? ? ? print(a)
? ? ? ? print(b)
? ? ? ? print(c)
?
? ? bar()
? ? # print(c) ?# NameError: name 'c' is not defined
?
?
if __name__ == '__main__':
? ? a = 100
? ? # print(b) ?# NameError: name 'b' is not defined
? ? foo()

打印結(jié)果:

100
hello
True

上面的代碼能夠順利的執(zhí)行并且打印出100、hello和True,但我們注意到了,在bar函數(shù)的內(nèi)部并沒有定義a和b兩個(gè)變量,那么a和b是從哪里來的。

我們?cè)谏厦娲a的if分支中定義了一個(gè)變量a,這是一個(gè)全局變量(global variable),屬于全局作用域,因?yàn)樗鼪]有定義在任何一個(gè)函數(shù)中。

在上面的foo函數(shù)中我們定義了變量b,這是一個(gè)定義在函數(shù)中的局部變量(local variable),屬于局部作用域,在foo函數(shù)的外部并不能訪問到它;但對(duì)于foo函數(shù)內(nèi)部的bar函數(shù)來說,變量b屬于嵌套作用域,在bar函數(shù)中我們是可以訪問到它的。

bar函數(shù)中的變量c屬于局部作用域,在bar函數(shù)之外是無法訪問的。

Python查找變量順序:

“局部作用域”-》“嵌套作用域”-》“全局作用域”和“內(nèi)置作用域”的順序進(jìn)行搜索。

內(nèi)置作用域:Python內(nèi)置的那些標(biāo)識(shí)符,我們之前用過的input、print、int等都屬于內(nèi)置作用域。

我們希望通過函數(shù)調(diào)用修改全局變量a的值,但實(shí)際上下面的代碼是做不到的。

代碼如下:

def foo():
? ? a = 200
? ? print(a) ?# 200
?
?
if __name__ == '__main__':
? ? #這里變量值不能修改函數(shù)局部變量的值
? ? a = 100
? ? foo()
? ? print(a) ?# 100

在調(diào)用foo函數(shù)后,我們發(fā)現(xiàn)a的值仍然是100,這是因?yàn)楫?dāng)我們?cè)诤瘮?shù)foo中寫a = 200的時(shí)候,是重新定義了一個(gè)名字為a的局部變量,它跟全局作用域的a并不是同一個(gè)變量。

因?yàn)榫植孔饔糜蛑杏辛俗约旱淖兞縜,因此foo函數(shù)不再搜索全局作用域中的a。如果我們希望在foo函數(shù)中修改全局作用域中的a,

代碼如下所示:

def foo():
? ? global a
? ? a = 200
? ? print(a) ?# 200
?
?
if __name__ == '__main__':
? ? a = 100
? ? foo()
? ? print(a) ?# 200

可以使用global關(guān)鍵字來指示foo函數(shù)中的變量a來自于全局作用域。

注:

在實(shí)際開發(fā)中,我們應(yīng)該盡量減少對(duì)全局變量的使用,因?yàn)槿肿兞康淖饔糜蚝陀绊戇^于廣泛,可能會(huì)發(fā)生意料之外的修改和使用。

除此之外全局變量比局部變量擁有更長(zhǎng)的生命周期,可能導(dǎo)致對(duì)象占用的內(nèi)存長(zhǎng)時(shí)間無法被垃圾回收

到此這篇關(guān)于Python函數(shù)和模塊的使用詳情的文章就介紹到這了,更多相關(guān)Python函數(shù)模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python itsdangerous模塊的具體使用方法

    python itsdangerous模塊的具體使用方法

    這篇文章主要介紹了python itsdangerous模塊的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python 錯(cuò)誤和異常代碼詳解

    Python 錯(cuò)誤和異常代碼詳解

    這篇文章主要介紹了Python 錯(cuò)誤和異常代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python讀寫及備份oracle數(shù)據(jù)庫(kù)操作示例

    Python讀寫及備份oracle數(shù)據(jù)庫(kù)操作示例

    這篇文章主要介紹了Python讀寫及備份oracle數(shù)據(jù)庫(kù)操作,結(jié)合實(shí)例形式分析了Python針對(duì)Oracle數(shù)據(jù)庫(kù)操作的相關(guān)庫(kù)安裝,以及使用cx_Oracle與pandas庫(kù)進(jìn)行Oracle數(shù)據(jù)庫(kù)的查詢、插入、備份等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-05-05
  • Python數(shù)據(jù)分析從入門到進(jìn)階之分類算法全面教程

    Python數(shù)據(jù)分析從入門到進(jìn)階之分類算法全面教程

    數(shù)據(jù)分析是處理和解釋數(shù)據(jù)以發(fā)現(xiàn)有用信息和洞察的過程,其中,分類算法是數(shù)據(jù)分析領(lǐng)域的一個(gè)重要組成部分,它用于將數(shù)據(jù)分為不同的類別或組,本文將介紹分類算法的基本概念和進(jìn)階技巧,以及如何在Python中應(yīng)用這些算法,包括示例代碼和實(shí)際案例
    2023-11-11
  • Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問題的解決

    Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問題的解決

    這篇文章主要給大家介紹了關(guān)于Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • python如何向一個(gè)dataframe中新加一行

    python如何向一個(gè)dataframe中新加一行

    這篇文章主要介紹了python如何向一個(gè)dataframe中新加一行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • django 常用orm操作詳解

    django 常用orm操作詳解

    下面小編就為大家?guī)硪黄猟jango 常用orm操作詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Python利用operator模塊實(shí)現(xiàn)對(duì)象的多級(jí)排序詳解

    Python利用operator模塊實(shí)現(xiàn)對(duì)象的多級(jí)排序詳解

    python中的operator模塊提供了一系列的函數(shù)操作。下面這篇文章主要給大家介紹了在Python中利用operator模塊實(shí)現(xiàn)對(duì)象的多級(jí)排序的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類器

    python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類器

    這篇文章主要介紹了python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 詳解python的內(nèi)存分配機(jī)制

    詳解python的內(nèi)存分配機(jī)制

    Python的內(nèi)存分配機(jī)制是小白們最需要理解的概念之一。創(chuàng)建對(duì)象(變量、函數(shù)、對(duì)象等)后,CPython會(huì)在內(nèi)存中為其分配地址。Python有一個(gè)id()函數(shù),它可以返回對(duì)象的“身份”,也就是內(nèi)存地址。它實(shí)際上是一個(gè)唯一的整數(shù)。
    2021-05-05

最新評(píng)論