已有字符串形式的函數(shù)名稱,那么如何調(diào)用這個(gè)函數(shù)呢?
創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、疏勒網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為疏勒等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
通過調(diào)用內(nèi)置函數(shù)locals()和globals()返回的字典對(duì)象,就可以可以獲得名稱與對(duì)象的映射關(guān)系。其中,locals()僅在全局范圍內(nèi)調(diào)用時(shí)可以獲得函數(shù)對(duì)象。 我們來看以下的例子。
需要注意的是,使用上述方法通過字符串調(diào)用函數(shù)時(shí),為了系統(tǒng)的安全,防止執(zhí)行任意函數(shù),需要對(duì)函數(shù)名做一些處理,也就是使用統(tǒng)一的前綴為這些函數(shù)命名。例如在上述例子中,使用前綴cmd_+函數(shù)名的形式定義函數(shù)(cmd_help,cmd_sum)。
在傳入函數(shù)名字符串時(shí),只傳入函數(shù)名的后半部分(如"help","sum"),由程序添加前綴后組成完整的函數(shù)名,再調(diào)用該函數(shù)。
對(duì)于類的成員函數(shù),則可以使用getattr()獲得類成員函數(shù)。
上述代碼通過字符串調(diào)用了類成員函數(shù),與前一段代碼執(zhí)行的結(jié)果相同。
此外,還可以使用字典將字符串與函數(shù)對(duì)應(yīng)起來調(diào)用,缺點(diǎn)就是每增加一個(gè)函數(shù)需要相應(yīng)在字典對(duì)象中添加相應(yīng)的鍵值,增加代碼維護(hù)工作量。
以上代碼在Python 3.6以上運(yùn)行通過。
python常見的內(nèi)置函數(shù)有:
1. abs()函數(shù)返回?cái)?shù)字的絕對(duì)值。
2. all() 函數(shù)用于判斷給定的參數(shù)中的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。元素除了是 0、空、None、False 外都算 True;空元組、空列表返回值為True。
3. any() 函數(shù)用于判斷給定的參數(shù)是否全部為False,是則返回False,如果有一個(gè)為True,則返回True。 元素除了是 0、空、False外都算 TRUE。
4. bin()函數(shù)返回一個(gè)整數(shù)int或者長整數(shù)long int的二進(jìn)制表示。
5. bool() 函數(shù)用于將給定參數(shù)轉(zhuǎn)換為布爾類型,如果參數(shù)不為空或不為0,返回True;參數(shù)為0或沒有參數(shù),返回False。
6. bytearray()方法返回一個(gè)新字節(jié)數(shù)組。這個(gè)數(shù)組里的元素是可變的,并且每個(gè)元素的值范圍: 0 = x 256(即0-255)。即bytearray()是可修改的二進(jìn)制字節(jié)格式。
7. callable()函數(shù)用于檢查一個(gè)對(duì)象是否可調(diào)用的。對(duì)于函數(shù)、方法、lambda函式、類以及實(shí)現(xiàn)了 __call__ 方法的類實(shí)例, 它都返回 True。(可以加括號(hào)的都可以調(diào)用)
8. chr()函數(shù)用一個(gè)范圍在range(256)內(nèi)(即0~255)的整數(shù)作參數(shù),返回一個(gè)對(duì)應(yīng)的ASCII數(shù)值。
9. dict()函數(shù)用來將元組/列表轉(zhuǎn)換為字典格式。
10. dir()函數(shù)不帶參數(shù)時(shí),返回當(dāng)前范圍內(nèi)的變量、方法和定義的類型列表;帶參數(shù)時(shí),返回參數(shù)的屬性、方法列表。
擴(kuò)展資料:
如何查看python3.6的內(nèi)置函數(shù)?
1、首先先打開python自帶的集成開發(fā)環(huán)境IDLE;
2、然后我們直接輸入"dir(__builtins__)",需要注意的是builtins左右的下劃線都是兩個(gè);
3、回車之后我們就可以看到python所有的內(nèi)置函數(shù);
4、接下來我們學(xué)習(xí)第二種查看python內(nèi)置函數(shù)的方法,我們直接在IDLE中輸入"import builtins",然后輸入"dir(builtins)";
5、然后回車,同樣的這個(gè)方法也可以得到所有的python內(nèi)置的函數(shù);
6、這里我們可以使用python內(nèi)置函數(shù)len()來查看python內(nèi)置函數(shù)的個(gè)數(shù),這里我們直接輸入"len(dir(builtins))";
7、回車之后我們可以看到系統(tǒng)返回值153,說明我們現(xiàn)在這個(gè)版本中有153個(gè)內(nèi)置函數(shù);
8、最后我們介紹一個(gè)比較有用的內(nèi)置函數(shù)"help",python內(nèi)置函數(shù)有一百多個(gè),我們當(dāng)然不能記住所有的函數(shù),這里python提供了一個(gè)"help"函數(shù),我們來看一個(gè)例子一起來體會(huì)一下help函數(shù)的用法,這里我們直接輸入"help(len)",然后回車,會(huì)看到系統(tǒng)給我們對(duì)于內(nèi)置函數(shù)"len"的解釋,當(dāng)然對(duì)于其他函數(shù)可能會(huì)有更加詳細(xì)的解釋以及用法提示。
這要看導(dǎo)入包的方式
如果是這樣導(dǎo)入“import math”,則函數(shù)都要加包的前綴
如果是這樣導(dǎo)入“import matplotlib.pyplot as plt”,則該包內(nèi)的函數(shù)加plt前綴即可
如果是這樣導(dǎo)入 “from math import *”這樣就把包里面所有東西都導(dǎo)入了,這樣使用函數(shù)時(shí)無需加前綴
有2個(gè)標(biāo)準(zhǔn)庫函數(shù)可以完成你說的要求,建議用eval()
eval() 和exec()
區(qū)別是eval()有返回值
def test1():
print "Test1 Excuted!"
return True
ret = eval ("test1()")
print ret
結(jié)果如下
Test1 Excuted!
True
而exec()只執(zhí)行,并無返回值。
def test2():
print "Test2 Excuted!"
return True
exec("test2()")
結(jié)果如下
Test2 Excuted!
當(dāng)函數(shù)要接受元組或者字典參數(shù)時(shí),它分別使用 * 和 ** 前綴。
在變量前 加 ,則輸入的函數(shù)參數(shù)會(huì)作為一個(gè)元組存在args中, 多余的參數(shù) *也會(huì)存在args中,如:
如果使用******前綴,輸入的參數(shù)會(huì)被存放在字典中, 多余的參數(shù) 也會(huì)存在kwargs中,kwargs為一個(gè)字典
剛學(xué)用Python的時(shí)候,特別是看一些庫的源碼時(shí),經(jīng)常會(huì)看到func(*args, **kwargs)這樣的函數(shù)定義,這個(gè)*和**讓人有點(diǎn)費(fèi)解。其實(shí)只要把函數(shù)參數(shù)定義搞清楚了,就不難理解了。
先說說函數(shù)定義,我們都知道,下面的代碼定義了一個(gè)函數(shù)funcA
def funcA():
pass
顯然,函數(shù)funcA沒有參數(shù)(同時(shí)啥也不干:D)。
下面這個(gè)函數(shù)funcB就有兩個(gè)參數(shù)了,
def funcB(a, b):
print a
print b
調(diào)用的時(shí)候,我們需要使用函數(shù)名,加上圓括號(hào)擴(kuò)起來的參數(shù)列表,比如 funcB(100, 99),執(zhí)行結(jié)果是:
100
99
很明顯,參數(shù)的順序和個(gè)數(shù)要和函數(shù)定義中一致,如果執(zhí)行funcB(100),Python會(huì)報(bào)錯(cuò)的:
TypeError: funcB() takes exactly 2 arguments (1 given)
我們可以在函數(shù)定義中使用參數(shù)默認(rèn)值,比如
def funcC(a, b=0):
print a
print b
在函數(shù)funcC的定義中,參數(shù)b有默認(rèn)值,是一個(gè)可選參數(shù),如果我們調(diào)用funcC(100),b會(huì)自動(dòng)賦值為0。
OK,目前為止,我們要定義一個(gè)函數(shù)的時(shí)候,必須要預(yù)先定義這個(gè)函數(shù)需要多少個(gè)參數(shù)(或者說可以接受多少個(gè)參數(shù))。一般情況下這是沒問題的,但是也有在定義函數(shù)的時(shí)候,不能知道參數(shù)個(gè)數(shù)的情況(想一想C語言里的printf函數(shù)),在Python里,帶*的參數(shù)就是用來接受可變數(shù)量參數(shù)的。看一個(gè)例子
def funcD(a, b, *c):
print a
print b
print "length of c is: %d " % len(c)
print c
調(diào)用funcD(1, 2, 3, 4, 5, 6)結(jié)果是
1
2
length of c is: 4
(3, 4, 5, 6)
我們看到,前面兩個(gè)參數(shù)被a、b接受了,剩下的4個(gè)參數(shù),全部被c接受了,c在這里是一個(gè)tuple。我們?cè)谡{(diào)用funcD的時(shí)候,至少要傳遞2個(gè)參數(shù),2個(gè)以上的參數(shù),都放到c里了,如果只有兩個(gè)參數(shù),那么c就是一個(gè)empty tuple。
好了,一顆星我們弄清楚了,下面輪到兩顆星。
上面的例子里,調(diào)用函數(shù)的時(shí)候,傳遞的參數(shù)都是根據(jù)位置來跟函數(shù)定義里的參數(shù)表匹配的,比如funcB(100, 99)和funcB(99, 100)的執(zhí)行結(jié)果是不一樣的。在Python里,還支持一種用關(guān)鍵字參數(shù)(keyword argument)調(diào)用函數(shù)的辦法,也就是在調(diào)用函數(shù)的時(shí)候,明確指定參數(shù)值付給那個(gè)形參。比如還是上面的funcB(a, b),我們通過這兩種方式調(diào)用
funcB(a=100, b=99)
和
funcB(b=99, a=100)
結(jié)果跟funcB(100, 99)都是一樣的,因?yàn)槲覀冊(cè)谑褂藐P(guān)鍵字參數(shù)調(diào)用的時(shí)候,指定了把100賦值給a,99賦值給b。也就是說,關(guān)鍵字參數(shù)可以讓我們?cè)谡{(diào)用函數(shù)的時(shí)候打亂參數(shù)傳遞的順序!
另外,在函數(shù)調(diào)用中,可以混合使用基于位置匹配的參數(shù)和關(guān)鍵字參數(shù),前題是先給出固定位置的參數(shù),比如
def funcE(a, b, c):
print a
print b
print c
調(diào)用funcE(100, 99, 98)和調(diào)用funcE(100, c=98, b=99)的結(jié)果是一樣的。
好了,經(jīng)過以上鋪墊,兩顆星總算可以出場了:
如果一個(gè)函數(shù)定義中的最后一個(gè)形參有 ** (雙星號(hào))前綴,所有正常形參之外的其他的關(guān)鍵字參數(shù)都將被放置在一個(gè)字典中傳遞給函數(shù),比如:
def funcF(a, **b):
print a
for x in b:
print x + ": " + str(b[x])
調(diào)用funcF(100, c='你好', b=200),執(zhí)行結(jié)果
100
c: 你好
b: 200
大家可以看到,b是一個(gè)dict對(duì)象實(shí)例,它接受了關(guān)鍵字參數(shù)b和c。
本文名稱:python前綴和函數(shù) Python的后綴
網(wǎng)頁路徑:http://muchs.cn/article14/hgiide.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、ChatGPT、品牌網(wǎng)站建設(shè)、商城網(wǎng)站、微信公眾號(hào)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)