Python解釋器內(nèi)置了許多函數(shù),這意味著我們無需定義,始終可以它們。下面按照函數(shù)的字母順序,討論一些常用的內(nèi)建函數(shù)。
10年積累的網(wǎng)站設(shè)計制作、做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有萬安免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
eval()
eval()函數(shù)解析傳給它的表達式,并在程序中運行Python表達式(代碼)。舉個例子:
x?=?1
eval("x?+?1")??#?注意:"x?+?1"是字符串
2
eval("4??9")
True
eval("'py'?*?3")
'pypypy'
eval("10?**?2")
100
eval()函數(shù)不僅僅能運行簡單表達式,還能調(diào)用函數(shù),使用方法等等:
eval("abs(-11)")????????#?計算-11的絕對值
11
eval('"hello".upper()')???#?把字符串'hello'全變成大寫字母
'HELLO'
import?os
eval('os.getcwd()')???????#?獲取當前的工作目錄
'/home/thepythonguru'
但是需要注意的是eval()僅適用于表達式,嘗試傳遞語句會導(dǎo)致語法錯誤:
eval('a?=?1')????????????????????#?賦值語句
Traceback?(most?recent?call?last):
File?"",?line?1,?in
File?"",?line?1
a?=?1
^
SyntaxError:?invalid?syntax
eval('import?re')?????????????#?導(dǎo)入語句
Traceback?(most?recent?call?last):
File?"",?line?1,?in
File?"",?line?1
import?re
^
SyntaxError:?invalid?syntax
此外,使用eval()語句應(yīng)該十分小心,永遠不要將不受信任的源直接傳遞給eval()。 因為惡意用戶很容易對您的系統(tǒng)造成破壞。 例如:
eval(input())??#?eval()將執(zhí)行用戶輸入的代碼
用戶輸入以下代碼就能從系統(tǒng)中刪除所有文件:
os.system("RM?-RF?/")
#?上面輸入相當于執(zhí)行:
eval('os.system("RM?-RF?/")')
filter()
"filter"的意思是“過濾”,filter()函數(shù)需要兩個參數(shù):一個函數(shù)對象和一個可迭代對象。函數(shù)對象需要返回一個布爾值,并為可迭代的每個元素調(diào)用。 filter()函數(shù)僅返回那些通過函數(shù)對象返回值為true的元素。解釋有一些抽象,看一個例子:
a?=?[1,?2,?3,?4,?5,?6]
filter(lambda?x?:?x?%?2?==?0,?a)????????#?過濾出所有偶數(shù),結(jié)果返回一個filter對象
filter?object?at?0x1036dc048
list(filter(lambda?x?:?x?%?2?==?0,?a))??#?可以使用list()函數(shù)使fileter對象變成列表,方便查看結(jié)果
[2,?4,?6]
下面是另外一個例子:
dict_a?=?[{'name':?'python',?'points':?10},?{'name':?'java',?'points':?8}]
filter(lambda?x?:?x['name']?==?'python',?dict_a)??#?過濾出列表中鍵'name'為值'python'的字典
filter?object?at?0x1036de128
tuple(filter(lambda?x?:?x['name']?==?'python',?dict_a))??#?使用tuple()函數(shù)使結(jié)果變成字典
({'name':?'python',?'points':?10},)
float()
float()的參數(shù)是一個數(shù)字或者字符串,它返回一個浮點數(shù)。如果參數(shù)是字符串,則字符串中應(yīng)該包含一個數(shù)字,并可以在數(shù)字前加入一個 '-' 符號,代表負數(shù)。參數(shù)也可以是表示NaN(非數(shù)字)或正無窮大的字符串。如果沒有任何參數(shù)的話,將返回0.0。
float('+1.23')?????????#?1.23
1.23
float('???-12345\n')???#?-12345
-12345.0
float('1e-003')????????#?0.001
0.001
float('+1E6')??????????#?10的6次冪
1000000.0
float('-Infinity')?????#?無窮小
-inf
float('-inf')?+?100?????#?負無窮小加100仍等于負無窮小
-inf
float('inf')???????????#?無窮大
inf
float('NaN')???????????#?NaN,代表非數(shù)字
nan
關(guān)于Python的基礎(chǔ)問題可以看下這個網(wǎng)頁的視頻教程,網(wǎng)頁鏈接,希望我的回答能幫到你。
在Python中,lambda函數(shù)是一個簡單的匿名函數(shù)。該函數(shù)沒有函數(shù)名,它可以有多個參數(shù),但函數(shù)只由一個表達式構(gòu)成。
lambda函數(shù)具體的格式如下:
lambda 參數(shù) : 表達式
其中, lambda 是關(guān)鍵字, 參數(shù) 是函數(shù)的參數(shù),可以有0至多個。冒號后面是表達式,也是該函數(shù)中的唯一的表達式,lambda函數(shù)會返回該表達式的返回值。
我們來看一個具體的例子。
在上述代碼中,number1, number2是lambda函數(shù)的參數(shù),number1**2+number**2是函數(shù)的表達式,該函數(shù)返回number1, number2兩個數(shù)的平方和。
上述代碼創(chuàng)建了一個lambda函數(shù)后將其賦值給變量sum_square, 在print函數(shù)中通過sum_square來調(diào)用這個lambda函數(shù)。
上述的lambda函數(shù)完全可用標準的函數(shù)來實現(xiàn),我們可以將上述代碼改寫成下面的代碼。
在代碼中,定義了函數(shù)sum_square,該函數(shù)包含兩個參數(shù),并執(zhí)行一條語句并將該語句的執(zhí)行結(jié)果作為函數(shù)返回值。通過上述代碼可以幫助我們更直觀地理解lambda函數(shù)。
lambda函數(shù)的可讀性較差,那么為什么要有這樣奇怪的匿名函數(shù)呢?這個要從lambda的使用場合說起。我們來看下面的代碼。
上述代碼定義了一個數(shù)值列表,調(diào)用python的內(nèi)置函數(shù)filter來生成一個新的迭代器。 filter函數(shù)的第一個參數(shù)為一個函數(shù),用于決定過濾的方法;第二個參數(shù)為一個可迭代的對象如列表、集合等。filter函數(shù)返回一個新的迭代器, 用于獲得滿足第一個函數(shù)為真的所有元素。在上述代碼中,我們給filter傳遞的第一個參數(shù)是一個匿名函數(shù):lambda number:number%3==0, 該函數(shù)在一個數(shù)整除3時為True,否則為False. filter函數(shù)會創(chuàng)建一個新的迭代器,通過調(diào)用上述匿名函數(shù)來判斷該元素是否滿足條件,得到所有3的倍數(shù)的數(shù)。
當然,上述代碼也可以使用正常的函數(shù)方式來實現(xiàn),如下所示:
我們可以看到,所有匿名函數(shù)的功能都可以通過標準函數(shù)來實現(xiàn)。匿名函數(shù)常在調(diào)用其它函數(shù)(如filter, map等)時作為參數(shù)使用。使用匿名函數(shù)可以使代碼更為精簡。匿名函數(shù)主要用于完成簡單的任務(wù),如果匿名函數(shù)過于復(fù)雜,會導(dǎo)致可讀性較差,調(diào)試起來也比較困難,因此,強烈不建議使用lambda寫天書般的代碼??傊鶕?jù)實際情況決定是否使用匿名函數(shù)。
定義一個列表a=[1,2,3,4]
filter(lambda x:x%2==0,a)
結(jié)果就是[2, 4]
filter第一個參數(shù)是函數(shù),第二個參數(shù)是序列