python內(nèi)建函數(shù)運行,Python內(nèi)建函數(shù)

python內(nèi)建函數(shù)

其實安裝python包會自帶一個有問號標示“?”的"Python Manuals"可以仔細閱讀一下,也可作幫助文檔的。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,松嶺企業(yè)網(wǎng)站建設,松嶺品牌網(wǎng)站建設,網(wǎng)站定制,松嶺網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,松嶺網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

介紹Python的內(nèi)建函數(shù)和異常.許多內(nèi)建函數(shù)的細節(jié)及特性可以在這里找到.

內(nèi)建函數(shù)

本節(jié)介紹的函數(shù)在解釋器中總是可用的,他們被包含在 __builtin__ 模塊里.另外每個模塊的 __builtins__ 屬性經(jīng)常指的是這個模塊(除了當在restricted execution環(huán)境下運行時).

_(下劃線)

默認情況下,變量 _ 用于在交互模式下表示最近一個表達式的運行結果.

參閱 sys.displayhook (118)

__import__(name [, globals [, locals [, fromlist]]])

import語句通過調(diào)用這個函數(shù)來導入模塊. name是包含模塊名字的字符串, globals是一個可選的定義全局名稱空間的字典, locals是定義局部名稱空間的字典, fromlist是from語句目標的列表.例如, import spam語句會調(diào)用__import__('spam', globals(), locals(), []) ,而from spam import foo 語句會調(diào)用 __import__('spam', globals(), locals(), ['foo']). 如果模塊名在包名字之后(如foo.bar)而且fromlist為空時,就返回對應的模塊對象.如果fromlist不為空,則只會返回最頂級的包.

這個函數(shù)是一個低等級的模塊載入接口.它并不執(zhí)行import語句的所有步驟(通常情況下局部名稱空間并不會隨模塊中包含對象的名稱引用的改變而改變.這個函數(shù)可以由用戶來重新定義,這樣為import語句加入新的行為.默認的執(zhí)行并不會檢查locals參數(shù),而globals只用于決定包的內(nèi)容(這些參數(shù)可以使 __import__()能夠完整地訪問全局和局部名稱空間)

abs(x)

返回x的絕對值

apply(func [, args [, keywords]])

對可調(diào)用對象func執(zhí)行函數(shù)調(diào)用. args是一個包含固定位置參數(shù)的元組, keywords是包含關鍵參數(shù)的字典. apply()函數(shù)也可以寫做func(*args ,**keywords ).

buffer(sequence [, offset [, size]])

創(chuàng)建一個新的緩沖器對象.緩沖器通常是一個序列(如字符串)的字節(jié)導向序列.緩沖器和字符串在許多地方是相同的,但是它不支持字符串方法,而且也不能使用string模塊的函數(shù).

callable(object)

當object為可調(diào)用對象時返回True,否則返回False

chr(i)

將一個0到255的整數(shù)轉(zhuǎn)換為一個字符.

cmp(x,y)

比較x和y. x y返回負數(shù); x== y返回零; x y返回整數(shù).它可以比較任意兩個對象并返回結果,即使有時候?qū)ο蟮谋容^豪無意義(例如比較文件對象).在某些環(huán)境下,這樣的比較會引發(fā)異常.

coerce(x,y)

將x和y值轉(zhuǎn)換為同一個數(shù)值類型并作為一個元組返回.(第三章,類型和對象)

compile(string, filename, kind)

使用exec()或eval()將字符串編譯為代碼對象. filename is a string containing the name of the file in which the string was defined. kind為'exec'時代表一個表達式的序列, 'eval'代表一個表達式, 'single'代表一個運行語句.

complex(real [, imag])

創(chuàng)建一個復數(shù)

delattr(object, attr)

刪除對象的一個屬性, attr是一個字符串.與 del object.attr相同

dir([object])

返回包含屬性名稱的列表.它們來自對象的 __dict__, __methods__,以及 __members__ 屬性.如果沒有傳遞給它參數(shù),則會返回當前的local symbol table

divmod(a,b)

返回一個包含商和余數(shù)的元組.對于整數(shù),將返回(a / b , a % b ),對于浮點數(shù),將返回(math.floor(a / b ), a % b )

eval(expr [, globals [, locals]])

計算一個表達式的值. expr是一個字符串或由compile()創(chuàng)建的一個代碼對象. globals和locals為操作定義的全局和局部名稱空間,當省略時,表達式將在調(diào)用時的名稱空間計算.

execfile(filename [, globals [, locals]])

運行文件filename中的語句. globals和locals定義了文件運行的全局和局部名稱空間,當省略時,文件將在調(diào)用時的名稱空間運行.這個函數(shù)不能在一個函數(shù)主體里使用,因為它與內(nèi)嵌范圍不相容.

filter(function, list)

使用func()函數(shù)來過濾s中的元素.使func返回值為false的元素被丟棄,其它的存入filter函數(shù)返回的列表中.如果function是None,則list中值為False的元素就被刪除.

float(x)

將x轉(zhuǎn)換為浮點數(shù)

getattr(object, name [, default])

返回一個對象的屬性. name是一個字符串. default是一個可選的值,代表當沒有這個屬性時返回的值. 與 object.name 結果相同

globals()

返回一個與全局名稱空間對應的字典

hasattr(object, name)

返回object是否有name屬性,布爾值

hash(object)

返回一個對象的整數(shù)哈希值(如果可能).兩個相等對象的哈希值是相同的.模塊沒有定義一個哈希值.

hex(x)

將一個整數(shù)或長整數(shù)轉(zhuǎn)換為一個十六進制的字符串

id(object)

返回一個對象的整數(shù)id

input([prompt])

相當于eval(raw_input(prompt ))

int(x [, base])

將一個數(shù)字或字符串轉(zhuǎn)換為整數(shù). 可選參數(shù)base代表從字符串轉(zhuǎn)換時的基礎/根據(jù)

intern(string)

Checks to see whether string is contained in an internal table of strings. If found, a copy of the internal string is returned. If not, string is added to the internal table and returned. This function is primarily used to get better performance in operations involving dictionary lookups. Interned strings are never garbage-collected. Not applicable to Unicode strings.

isinstance(object, classobj)

檢查object是否是classobj的事例或子類.也可用于檢查類型

issubclass(class1, class2)

檢查class1是否是class2的子類(派生類)

注意: issubclass(A , A )返回True

len(s)

返回序列s中包含的條目數(shù)目

list(s)

返回一個包含序列s中條目的新列表

locals()

返回一個與調(diào)用時局部名稱空間相對應的字典

long(x [, base])

將一個數(shù)字或字符串轉(zhuǎn)換為長整數(shù),可選參數(shù)base代表從字符串轉(zhuǎn)換時的基礎/根據(jù)

map(function, list, ...)

將序列l(wèi)ist中的每個元素傳遞給function函數(shù)做參數(shù),函數(shù)的返回值組成列表并返回.如果提供給多個列表,則函數(shù)應包含有多個參數(shù),每個參數(shù)從不同的列表獲得.如果函數(shù)為None,則默認為 identity function(?身份函數(shù)).如果None映射到多個列表,則返回一個包含元組的列表,元組的每個元素分別來自各個列表.如果有必要,短的列表將使用None來擴充到與最長列表長度相等. map可以使用list comprehensions 來代替.例如map(function , alist ),可以使用[function (x) for x in alist ]來代替

參閱 zip (105).

max(s [, args, ...])

單個參數(shù)時,返回序列s中的最大值.多個參數(shù)時,返回值最大的參數(shù)

min(s [, args, ...])

單個參數(shù)時,返回序列s中的最小值.多個參數(shù)時,返回值最小的參數(shù)

oct(x)

將一個整數(shù)或者長整數(shù)轉(zhuǎn)換為八進制字符串

open(filename [, mode [, bufsize]])

打開文件filename并返回一個文件對象(第十章,運行環(huán)境). mode代表文件打開的模式. 'r' 表示讀, 'w' 表示寫, 'a' 表示在文件末尾添加內(nèi)容. 還有一種更新模式,你只要在讀寫模式后增加一個'+'就可以使用這種模式,如'r+' 或 'w+'.當一個文件以更新模式打開,你就可以對這個文件進行讀寫操作.只要在任何讀取操作之前刷新所有的輸出緩沖就不會有問題.如果一個文件以 'w+' 模式打開,它的長度就度截為 0.當mode省略時,將會使用'w'模式.bufsize參數(shù)指定了緩沖行為, 0代表無緩沖,1代表行緩沖,其他正數(shù)代表一個大約的字節(jié)緩沖器大小,負數(shù)代表使用系統(tǒng)默認緩沖器大小(也是默認行為)

ord(c)

返回單個字符c的整數(shù)順序值.普通字符返回[0,255]中的一個值,Unicode字符返回 [0,65535]中的一個值

pow(x, y [, z])

返回x ** y ,如果z存在返回(x ** y ) % z

range([start,] stop [, step])

返回一個從start到stop的整數(shù)序列, step代表步進,默認值為1. start默認值為0.負數(shù)的step可以創(chuàng)建一個遞減的整數(shù)序列

參閱xrange (105)

raw_input([prompt])

從標準輸入(sys.stdin)中讀取一行,并把它作為字符串返回.如果提供了prompt,它將首先打印到標準輸出(sys.stdout).當讀取到一個EOF時,就會引發(fā)一個EOFError異常.如果readline模塊被導入,那么這個函數(shù)會使用它來提供更高級的功能

reduce(func, seq [, initializer])

函數(shù)從一個序列收集信息,然后只返回一個值(例如求和,最大值,等).它首先以序列的前兩個元素調(diào)用函數(shù),再將返回值和第三個參數(shù)作為參數(shù)調(diào)用函數(shù),依次執(zhí)行下去,返回最終的值. func函數(shù)有且只有兩個參數(shù).在seq為空時,將使用初始值initializer.

reload(module)

重新導入一個已經(jīng)導入的模塊. module必須是一個已經(jīng)存在的模塊對象.一般情況下并不鼓勵使用這個函數(shù),除了在調(diào)試的時候.

當一個模塊重導入時,定義它的全局名稱空間的字典依然存在.Thus, definitions in the old module that aren’t part of the newly reloaded module are retained.模塊可以利用這個來檢查他們是否已經(jīng)被導入.

重導入一個使用C編寫的模塊通常是不合法的

If any other modules have imported this module by using the from statement, they’ll continue to use the definitions in the previously imported module. This problem can be avoided by either reissuing the from statement after a module has been reloaded or using fully qualified names such as module.name .

如果有使用以前模塊中類創(chuàng)建的實例,它們將繼續(xù)使用以前的模塊

repr(object)

返回一個對象的標準字符串表示.與向后的引號 `object` 相同.大多數(shù)情況下,返回的字符串可以使用eval()來再次創(chuàng)建這個對象.

round(x [, n])

Returns the result of rounding the floating-point number x to the closest multiple of 10 to the power minus n . If n is omitted, it defaults to 0. If two multiples are equally close, rounding is done away from 0 (例如, 0.5 is rounded to 1.0 and -0.5 is rounded to -1.0).

setattr(object, name, value)

設置一個對象的屬性. name是一個字符串. 相當于object.name = value .

slice([start,] stop [, step])

返回一個代表指定數(shù)列中一個整數(shù)的切片對象.切片對象也可以有擴展切片操作語句來產(chǎn)生.(第三章,序列和映射方法)

str(object)

返回表示對象的可打印形式的字符串.與print語句產(chǎn)生的字符串相同.

tuple(s)

從序列s中創(chuàng)建一個元組.如果s已經(jīng)是一個元組,則返回s

type(object)

返回object的類型,它是一個types模塊中定義type類型

參閱isinstance (102)

unichr(i)

將一個0到65535的整數(shù)轉(zhuǎn)換為一個Unicode字符

unicode(string [, encoding [, errors]])

將string轉(zhuǎn)換為Unicode字符串. encoding指定了string的數(shù)據(jù)編碼,它被省略時,將使用sys.getdefaultencoding(). errors指定編碼錯誤處理方式.('strict', 'ignore', 或 'replace' .參閱第三章和第九章中有關Unicode內(nèi)容)

vars([object])

返回object的 symbol table (通常在object的__dict__屬性).如果沒有給它提供參數(shù),則返回對應當前局部名稱空間的字典.

xrange([start,] stop [, step])

和range函數(shù)相似,但返回的是一個XRangeType對象.它生成一個迭代器,就是只有用那個數(shù)時才臨時通過計算提供值,而不是全部儲存它們.這樣在處理大的數(shù)列時能節(jié)省大量的內(nèi)存.

zip(s1 [, s2 [,..]])

用來將幾個序列組合成一個包含元組的序列,序列中的每個元素t[i ] = (s1[i ], s2[i ], ..., sn[i ]).結果與最短序列的長度相等.

python、什么是內(nèi)建函數(shù)?

python內(nèi)建函數(shù)總結

1. abs(x)

abs()函數(shù)返回數(shù)字(可為普通型、長整型或浮點型)的絕對值。如果給出復數(shù),返回值就是該復數(shù)的模。例如:

print abs(-2,4)

2.4

print abs(4+2j)

4.472135955

2. apply(function,args[,keywords])

apply()函數(shù)將args參數(shù)應用到function上。function參數(shù)必須是可調(diào)用對象(函數(shù)、方法或其他可調(diào)用對象)。args參數(shù)必須以

序列形式給出。列表在應用之前被轉(zhuǎn)換為元組。function對象在被調(diào)用時,將args列表的內(nèi)容分別作為獨立的參數(shù)看待。例如:

apply(add,(1,3,4))

等價于

add(1,3,4)

在以列表或元組定義了一列參數(shù),且需要將此列表參數(shù)分別作為個個獨立參數(shù)使用的情況下,必須使用apply()函數(shù)。在要把變長參數(shù)列應用到已函數(shù)上時,apply()函數(shù)非常有用。

可選項keywords參數(shù)應是個字典,字典的關鍵字是字符串。這些字符串在apply()函數(shù)的參數(shù)列末尾處給出,它們將被用作關鍵字參數(shù)。

3. buffer(object[,offset[,size]])

如果object對象支持緩存調(diào)用接口buffer()函數(shù)就為object對象創(chuàng)建一個新緩存。這樣的對象包括字符串、數(shù)組和緩存。該新緩存通過使用從

offset參數(shù)值開始知道該對象末尾的存儲片段或從offset參數(shù)值開始直到size參數(shù)給出的尺寸為長度的存儲片段來引用object對象。如果沒

給出任何選項參數(shù),緩存區(qū)域就覆蓋整個序列,最終得到的緩存對象是object對象數(shù)據(jù)的只讀拷貝。

緩存對象用于給某個對象類型創(chuàng)建一個更友好的接口。比如,字符串對象類型通用緩存對象而變得可用,允許逐個字節(jié)地訪問字符串中的信息。

4. callable(object)

callable()函數(shù)在object對象是可調(diào)用對象的情況下,返回真(true);否則假(false),可調(diào)用對象包括函數(shù)、方法、代碼對象、類(在調(diào)用時返回新的實例)和已經(jīng)定義‘調(diào)用’方法的類實例

5. chr(i)

chr()函數(shù)返回與ASCII碼i相匹配的一個單一字符串,如下例所示:

print chr(72)+chr(101)+chr(108)+chr(111)

hello

chr()函數(shù)是ord()函數(shù)的反函數(shù),其中ord()函數(shù)將字符串轉(zhuǎn)換回ASCII整數(shù)碼,參數(shù)i的取值應在0~255范圍內(nèi)。如果參數(shù)i的取值在此范圍之外,將引發(fā)ValueError異常。

6. cmp(x,y)

cmp()函數(shù)比較x和y這兩個對象,且根據(jù)比較結果返回一個整數(shù)。如果xy,則返回正數(shù)。請注意,此函數(shù)特別用來比較數(shù)值大小,而不是任何引用關系,因而有下面的結果:

a=99

b=int('99')

cmp(a,b)

7. coerce(x,y)

coerce()函數(shù)返回一個元組,該元組由兩個數(shù)值型參數(shù)組成。此函數(shù)將兩個數(shù)值型參數(shù)轉(zhuǎn)換為同一類型數(shù)字,其轉(zhuǎn)換規(guī)則與算術轉(zhuǎn)換規(guī)則一樣。一下是兩個例子:

a=1

b=1.2

coerce(a,b)

(1.0,1.2)

a=1+2j

b=4.3e10

coerce(a,b)

((1+2j),(43000000000+0j))

8 compile(string,filename,kind)

compile()函數(shù)將string編譯為代碼對象,編譯生成的代碼對象接下來被exec語句執(zhí)行,接著能利用eval()函數(shù)對其進行求值。

filename參數(shù)應是代碼從其中讀出的文件名。如果內(nèi)部生成文件名,filename參數(shù)值應是相應的標識符。kind參數(shù)指定string參數(shù)中所含代碼的類別。

舉例如下:

a=compile(‘print “Hello World”’,’’,’single’)

exec(a)

Hello World

eval(a)

Hello World

9. complex(real,[image])

Complex()函數(shù)返回一個復數(shù),其實部為real參數(shù)值。如果給出image參數(shù)的值,則虛部就為image;如果默認image參數(shù),則虛部為0j。

10. delattr(object,name)

delattr()函數(shù)在object對象許可時,刪除object對象的name屬性,此函數(shù)等價于如下語句:

del object.attr

而delattr()函數(shù)允許利用編程方法定義來定義object和name參數(shù),并不是在代碼中顯示指定。

Python中冷門但非常好用的內(nèi)置函數(shù)

Python中有許多內(nèi)置函數(shù),不像print、len那么廣為人知,但它們的功能卻異常強大,用好了可以大大提高代碼效率,同時提升代碼的簡潔度,增強可閱讀性

Counter

collections在python官方文檔中的解釋是High-performance container datatypes,直接的中文翻譯解釋高性能容量數(shù)據(jù)類型。這個模塊實現(xiàn)了特定目標的容器,以提供Python標準內(nèi)建容器 dict , list , set , 和 tuple 的替代選擇。在python3.10.1中它總共包含以下幾種數(shù)據(jù)類型:

容器名簡介

namedtuple() 創(chuàng)建命名元組子類的工廠函數(shù)

deque 類似列表(list)的容器,實現(xiàn)了在兩端快速添加(append)和彈出(pop)

ChainMap 類似字典(dict)的容器類,將多個映射集合到一個視圖里面

Counter 字典的子類,提供了可哈希對象的計數(shù)功能

OrderedDict 字典的子類,保存了他們被添加的順序

defaultdict 字典的子類,提供了一個工廠函數(shù),為字典查詢提供一個默認值

UserDict 封裝了字典對象,簡化了字典子類化

UserList 封裝了列表對象,簡化了列表子類化

UserString 封裝了字符串對象,簡化了字符串子類化

其中Counter中文意思是計數(shù)器,也就是我們常用于統(tǒng)計的一種數(shù)據(jù)類型,在使用Counter之后可以讓我們的代碼更加簡單易讀。Counter類繼承dict類,所以它能使用dict類里面的方法

舉例

#統(tǒng)計詞頻

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

result = {}

for fruit in fruits:

if not result.get(fruit):

result[fruit] = 1

else:

result[fruit] += 1

print(result)

#{'apple': 2, 'peach': 3, 'lemon': 1}下面我們看用Counter怎么實現(xiàn):

from collections import Counter

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

c = Counter(fruits)

print(dict(c))

#{'apple': 2, 'peach': 3, 'lemon': 1}顯然代碼更加簡單了,也更容易閱讀和維護了。

elements()

返回一個迭代器,其中每個元素將重復出現(xiàn)計數(shù)值所指定次。元素會按首次出現(xiàn)的順序返回。如果一個元素的計數(shù)值小于1,elements()將會忽略它。

c = Counter(a=4, b=2, c=0, d=-2)

sorted(c.elements())

['a', 'a', 'a', 'a', 'b', 'b']most_common([n])

返回一個列表,其中包含n個最常見的元素及出現(xiàn)次數(shù),按常見程度由高到低排序。如果n被省略或為None,most_common()將返回計數(shù)器中的所有元素。計數(shù)值相等的元素按首次出現(xiàn)的順序排序:

Counter('abracadabra').most_common(3)

[('a', 5), ('b', 2), ('r', 2)]這兩個方法是Counter中最常用的方法,其他方法可以參考 python3.10.1官方文檔

實戰(zhàn)

Leetcode 1002.查找共用字符

給你一個字符串數(shù)組words,請你找出所有在words的每個字符串中都出現(xiàn)的共用字符(包括重復字符),并以數(shù)組形式返回。你可以按任意順序返回答案。

輸入:words = ["bella", "label", "roller"]

輸出:["e", "l", "l"]

輸入:words = ["cool", "lock", "cook"]

輸出:["c", "o"]看到統(tǒng)計字符,典型的可以用Counter完美解決。這道題是找出字符串列表里面每個元素都包含的字符,首先可以用Counter計算出每個元素每個字符出現(xiàn)的次數(shù),依次取交集最后得出所有元素共同存在的字符,然后利用elements輸出共用字符出現(xiàn)的次數(shù)

class Solution:

def commonChars(self, words: List[str]) - List[str]:

from collections import Counter

ans = Counter(words[0])

for i in words[1:]:

ans = Counter(i)

return list(ans.elements())提交一下,發(fā)現(xiàn)83個測試用例耗時48ms,速度還是不錯的

sorted

在處理數(shù)據(jù)過程中,我們經(jīng)常會用到排序操作,比如將列表、字典、元組里面的元素正/倒排序。這時候就需要用到sorted(),它可以對任何可迭代對象進行排序,并返回列表

對列表升序操作:

a = sorted([2, 4, 3, 7, 1, 9])

print(a)

# 輸出:[1, 2, 3, 4, 7, 9]對元組倒序操作:

sorted((4,1,9,6),reverse=True)

print(a)

# 輸出:[9, 6, 4, 1]使用參數(shù):key,根據(jù)自定義規(guī)則,按字符串長度來排序:

fruits = ['apple', 'watermelon', 'pear', 'banana']

a = sorted(fruits, key = lambda x : len(x))

print(a)

# 輸出:['pear', 'apple', 'banana', 'watermelon']all

all() 函數(shù)用于判斷給定的可迭代參數(shù)iterable中的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。元素除了是 0、空、None、False外都算True。注意:空元組、空列表返回值為True。

all(['a', 'b', 'c', 'd']) # 列表list,元素都不為空或0

True

all(['a', 'b', '', 'd']) # 列表list,存在一個為空的元素

False

all([0, 1,2, 3]) # 列表list,存在一個為0的元素

False

all(('a', 'b', 'c', 'd')) # 元組tuple,元素都不為空或0

True

all(('a', 'b', '', 'd')) # 元組tuple,存在一個為空的元素

False

all((0, 1, 2, 3)) # 元組tuple,存在一個為0的元素

False

all([]) # 空列表

True

all(()) # 空元組

Trueany函數(shù)正好和all函數(shù)相反:判斷一個tuple或者list是否全為空,0,F(xiàn)alse。如果全為空,0,F(xiàn)alse,則返回False;如果不全為空,則返回True。

F-strings

在python3.6.2版本中,PEP 498提出一種新型字符串格式化機制,被稱為 “字符串插值” 或者更常見的一種稱呼是F-strings,F(xiàn)-strings提供了一種明確且方便的方式將python表達式嵌入到字符串中來進行格式化:

s1='Hello'

s2='World'

print(f'{s1} {s2}!')

# Hello World!在F-strings中我們也可以執(zhí)行函數(shù):

def power(x):

return x*x

x=4

print(f'{x} * {x} = {power(x)}')

# 4 * 4 = 16而且F-strings的運行速度很快,比傳統(tǒng)的%-string和str.format()這兩種格式化方法都快得多,書寫起來也更加簡單。

本文主要講解了python幾種冷門但好用的函數(shù),更多內(nèi)容以后會陸陸續(xù)續(xù)更新~

Python基礎之常見內(nèi)建函數(shù)

map() 函數(shù)接受兩個參數(shù),一個是函數(shù),一個是可迭代對象(Iterable), map 將傳入的函數(shù)依次作用到可迭代對象的每一個元素,并把結果作為迭代器(Iterator)返回。

舉例說明,有一個函數(shù) f(x)=x^2 ,要把這個函數(shù)作用到一個list [1,2,3,4,5,6,7,8,9] 上:

運用簡單的循環(huán)可以實現(xiàn):

運用高階函數(shù) map() :

結果 r 是一個迭代器,迭代器是惰性序列,通過 list() 函數(shù)讓它把整個序列都計算出來并返回一個 list 。

如果要把這個list所有數(shù)字轉(zhuǎn)為字符串利用 map() 就簡單了:

小練習:利用 map() 函數(shù),把用戶輸入的不規(guī)范的英文名字變?yōu)槭鬃帜复髮懫渌懙囊?guī)范名字。輸入 ['adam', 'LISA', 'barT'] ,輸出 ['Adam', 'Lisa', 'Bart']

reduce() 函數(shù)也是接受兩個參數(shù),一個是函數(shù),一個是可迭代對象, reduce 將傳入的函數(shù)作用到可迭代對象的每個元素的結果做累計計算。然后將最終結果返回。

效果就是: reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

舉例說明,將序列 [1,2,3,4,5] 變換成整數(shù) 12345 :

小練習:編寫一個 prod() 函數(shù),可以接受一個 list 并利用 reduce 求積:

map() 和 reduce() 綜合練習:編寫 str2float 函數(shù),把字符串 '123.456' 轉(zhuǎn)換成浮點型 123.456

filter() 函數(shù)用于過濾序列, filter() 也接受一個函數(shù)和一個序列, filter() 把傳入的函數(shù)依次作用于每個元素,然后根據(jù)返回值是 True 還是 False 決定保留還是丟棄該元素。

舉例說明,刪除list中的偶數(shù):

小練習:用 filter() 求素數(shù)

定義一個篩選函數(shù):

定義一個生成器不斷返回下一個素數(shù):

打印100以內(nèi)素數(shù):

python內(nèi)置的 sorted() 函數(shù)可以對list進行排序:

sorted() 函數(shù)也是一個高階函數(shù),還可以接受一個 key 函數(shù)來實現(xiàn)自定義排序:

key 指定的函數(shù)將作用于list的每一個元素上,并根據(jù) key 函數(shù)返回的結果進行排序.

默認情況下,對字符串排序,是按照ASCII的大小比較的,由于'Z' 'a',結果,大寫字母Z會排在小寫字母a的前面。如果想忽略大小寫可都轉(zhuǎn)換成小寫來比較:

要進行反向排序,不必改動key函數(shù),可以傳入第三個參數(shù) reverse=True :

小練習:假設我們用一組tuple表示學生名字和成績: L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] 。用sorted()對上述列表分別按c成績從高到低排序:

運用匿名函數(shù)更簡潔:

Python中字典的內(nèi)建函數(shù)用法是什么?

點擊上方 "Python人工智能技術" 關注,星標或者置頂

22點24分準時推送,第一時間送達

后臺回復“大禮包”,送你特別福利

編輯:樂樂 | 來自:pypypypy

上一篇:

正文

大家好,我是Pythn人工智能技術。

內(nèi)置函數(shù)就是Python給你提供的,拿來直接用的函數(shù),比如print.,input等。

截止到python版本3.6.2 ,python一共提供了68個內(nèi)置函數(shù),具體如下

abs() dict() help() min() setattr()

all() dir() hex() next() slice()

any() divmod() id() object() sorted()

ascii() enumerate() input() oct() staticmethod()

bin() eval() int() open() str()

bool() exec() isinstance() ord() sum()

bytearray() ?lter() issubclass() pow() super()

bytes() ?oat() iter() print() tuple()

callable() format() len() property() type()

chr() frozenset() list() range() vars()

classmethod() getattr() locals() repr() zip()

compile() globals() map() reversed() __import__()

complex() hasattr() max() round()

delattr() hash() memoryview() set()

本文將這68個內(nèi)置函數(shù)綜合整理為12大類,正在學習Python基礎的讀者一定不要錯過,建議收藏學習!

和數(shù)字相關 1. 數(shù)據(jù)類型

bool : 布爾型(True,False)

int : 整型(整數(shù))

float : 浮點型(小數(shù))

complex : 復數(shù)

2. 進制轉(zhuǎn)換

bin() 將給的參數(shù)轉(zhuǎn)換成二進制

otc() 將給的參數(shù)轉(zhuǎn)換成八進制

hex() 將給的參數(shù)轉(zhuǎn)換成十六進制

print(bin(10)) # 二進制:0b1010

print(hex(10)) # 十六進制:0xa

print(oct(10)) # 八進制:0o12

3. 數(shù)學運算

abs() 返回絕對值

divmode() 返回商和余數(shù)

round() 四舍五入

pow(a, b) 求a的b次冪, 如果有三個參數(shù). 則求完次冪后對第三個數(shù)取余

sum() 求和

min() 求最小值

max() 求最大值

print(abs(-2)) # 絕對值:2

print(divmod(20,3)) # 求商和余數(shù):(6,2)

print(round(4.50)) # 五舍六入:4

print(round(4.51)) #5

print(pow(10,2,3)) # 如果給了第三個參數(shù). 表示最后取余:1

print(sum([1,2,3,4,5,6,7,8,9,10])) # 求和:55

print(min(5,3,9,12,7,2)) #求最小值:2

print(max(7,3,15,9,4,13)) #求最大值:15

和數(shù)據(jù)結構相關 1. 序列

(1)列表和元組

list() 將一個可迭代對象轉(zhuǎn)換成列表

tuple() 將一個可迭代對象轉(zhuǎn)換成元組

print(list((1,2,3,4,5,6))) #[1, 2, 3, 4, 5, 6]

print(tuple([1,2,3,4,5,6])) #(1, 2, 3, 4, 5, 6)

(2)相關內(nèi)置函數(shù)

reversed() 將一個序列翻轉(zhuǎn), 返回翻轉(zhuǎn)序列的迭代器

slice() 列表的切片

lst = "你好啊"

it = reversed(lst) # 不會改變原列表. 返回一個迭代器, 設計上的一個規(guī)則

print(list(it)) #['啊', '好', '你']

lst = [1, 2, 3, 4, 5, 6, 7]

print(lst[1:3:1]) #[2,3]

s = slice(1, 3, 1) # 切片用的

print(lst[s]) #[2,3]

(3)字符串

str() 將數(shù)據(jù)轉(zhuǎn)化成字符串

print(str(123)+'456') #123456

format() 與具體數(shù)據(jù)相關, 用于計算各種小數(shù), 精算等.

s = "hello world!"

print(format(s, "^20")) #劇中

print(format(s, "20")) #左對齊

print(format(s, "20")) #右對齊

# hello world!

# hello world!

# hello world!

print(format(3, 'b' )) # 二進制:11

print(format(97, 'c' )) # 轉(zhuǎn)換成unicode字符:a

print(format(11, 'd' )) # ?進制:11

print(format(11, 'o' )) # 八進制:13

print(format(11, 'x' )) # 十六進制(?寫字母):b

print(format(11, 'X' )) # 十六進制(大寫字母):B

print(format(11, 'n' )) # 和d?樣:11

print(format(11)) # 和d?樣:11

print(format(123456789, 'e' )) # 科學計數(shù)法. 默認保留6位小數(shù):1.234568e+08

print(format(123456789, '0.2e' )) # 科學計數(shù)法. 保留2位小數(shù)(小寫):1.23e+08

print(format(123456789, '0.2E' )) # 科學計數(shù)法. 保留2位小數(shù)(大寫):1.23E+08

print(format(1.23456789, 'f' )) # 小數(shù)點計數(shù)法. 保留6位小數(shù):1.234568

print(format(1.23456789, '0.2f' )) # 小數(shù)點計數(shù)法. 保留2位小數(shù):1.23

print(format(1.23456789, '0.10f')) # 小數(shù)點計數(shù)法. 保留10位小數(shù):1.2345678900

print(format(1.23456789e+3, 'F')) # 小數(shù)點計數(shù)法. 很大的時候輸出INF:1234.567890

bytes() 把字符串轉(zhuǎn)化成bytes類型

bs = bytes("今天吃飯了嗎", encoding="utf-8")

print(bs) #b'\xe4\xbb\x8a\xe5\xa4\xa9\xe5\x90\x83\xe9\xa5\xad\xe4\xba\x86\xe5\x90\x97'

bytearray() 返回一個新字節(jié)數(shù)組. 這個數(shù)字的元素是可變的, 并且每個元素的值得范圍是[0,256)

ret = bytearray("alex" ,encoding ='utf-8')

print(ret[0]) #97

print(ret) #bytearray(b'alex')

ret[0] = 65 #把65的位置A賦值給ret[0]

print(str(ret)) #bytearray(b'Alex')

ord() 輸入字符找?guī)ё址幋a的位置

chr() 輸入位置數(shù)字找出對應的字符

ascii() 是ascii碼中的返回該值 不是就返回u

print(ord('a')) # 字母a在編碼表中的碼位:97

print(ord('中')) # '中'字在編碼表中的位置:20013

print(chr(65)) # 已知碼位,求字符是什么:A

print(chr(19999)) #丟

for i in range(65536): #打印出0到65535的字符

print(chr(i), end=" ")

print(ascii("@")) #'@'

repr() 返回一個對象的string形式

s = "今天\n吃了%s頓\t飯" % 3

print(s)#今天# 吃了3頓 飯

print(repr(s)) # 原樣輸出,過濾掉轉(zhuǎn)義字符 \n \t \r 不管百分號%

#'今天\n吃了3頓\t飯'

2. 數(shù)據(jù)集合

字典:dict 創(chuàng)建一個字典

集合:set 創(chuàng)建一個集合

frozenset() 創(chuàng)建一個凍結的集合,凍結的集合不能進行添加和刪除操作。

3. 相關內(nèi)置函數(shù)

len() 返回一個對象中的元素的個數(shù)

sorted() 對可迭代對象進行排序操作 (lamda)

語法:sorted(Iterable, key=函數(shù)(排序規(guī)則), reverse=False)

Iterable: 可迭代對象

key: 排序規(guī)則(排序函數(shù)), 在sorted內(nèi)部會將可迭代對象中的每一個元素傳遞給這個函數(shù)的參數(shù). 根據(jù)函數(shù)運算的結果進行排序

reverse: 是否是倒敘. True: 倒敘, False: 正序

lst = [5,7,6,12,1,13,9,18,5]

lst.sort() # sort是list里面的一個方法

print(lst) #[1, 5, 5, 6, 7, 9, 12, 13, 18]

ll = sorted(lst) # 內(nèi)置函數(shù). 返回給你一個新列表 新列表是被排序的

print(ll) #[1, 5, 5, 6, 7, 9, 12, 13, 18]

l2 = sorted(lst,reverse=True) #倒序

print(l2) #[18, 13, 12, 9, 7, 6, 5, 5, 1]

#根據(jù)字符串長度給列表排序

lst = ['one', 'two', 'three', 'four', 'five', 'six']

def f(s):

return len(s)

l1 = sorted(lst, key=f, )

print(l1) #['one', 'two', 'six', 'four', 'five', 'three']

enumerate() 獲取集合的枚舉對象

lst = ['one','two','three','four','five']

for index, el in enumerate(lst,1): # 把索引和元素一起獲取,索引默認從0開始. 可以更改

print(index)

print(el)

# 1

# one

# 2

# two

# 3

# three

# 4

# four

# 5

# five

all() 可迭代對象中全部是True, 結果才是True

any() 可迭代對象中有一個是True, 結果就是True

print(all([1,'hello',True,9])) #True

print(any([0,0,0,False,1,'good'])) #True

zip() 函數(shù)用于將可迭代的對象作為參數(shù), 將對象中對應的元素打包成一個元組, 然后返回由這些元組組成的列表. 如果各個迭代器的元素個數(shù)不一致, 則返回列表長度與最短的對象相同

lst1 = [1, 2, 3, 4, 5, 6]

lst2 = ['醉鄉(xiāng)民謠', '驢得水', '放牛班的春天', '美麗人生', '辯護人', '被嫌棄的松子的一生']

lst3 = ['美國', '中國', '法國', '意大利', '韓國', '日本']

print(zip(lst1, lst1, lst3)) #

for el in zip(lst1, lst2, lst3):

print(el)

# (1, '醉鄉(xiāng)民謠', '美國')

# (2, '驢得水', '中國')

# (3, '放牛班的春天', '法國')

# (4, '美麗人生', '意大利')

# (5, '辯護人', '韓國')

# (6, '被嫌棄的松子的一生', '日本')

fiter() 過濾 (lamda)

語法:fiter(function. Iterable)

function: 用來篩選的函數(shù). 在?lter中會自動的把iterable中的元素傳遞給function. 然后根據(jù)function返回的True或者False來判斷是否保留留此項數(shù)據(jù) , Iterable: 可迭代對象

搜索公眾號頂級架構師后臺回復“面試”,送你一份驚喜禮包。

def func(i): # 判斷奇數(shù)

return i % 2 == 1

lst = [1,2,3,4,5,6,7,8,9]

l1 = filter(func, lst) #l1是迭代器

print(l1) #

print(list(l1)) #[1, 3, 5, 7, 9]

map() 會根據(jù)提供的函數(shù)對指定序列列做映射(lamda)

語法 : map(function, iterable)

可以對可迭代對象中的每一個元素進行映射. 分別去執(zhí)行 function

def f(i): return i

lst = [1,2,3,4,5,6,7,]

it = map(f, lst) # 把可迭代對象中的每一個元素傳遞給前面的函數(shù)進行處理. 處理的結果會返回成迭代器print(list(it)) #[1, 2, 3, 4, 5, 6, 7]

和作用域相關

locals() 返回當前作用域中的名字

globals() 返回全局作用域中的名字

def func():

a = 10

print(locals()) # 當前作用域中的內(nèi)容

print(globals()) # 全局作用域中的內(nèi)容

print("今天內(nèi)容很多")

func()

# {'a': 10}

# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__':

# _frozen_importlib_external.SourceFileLoader object at 0x0000026F8D566080,

# '__spec__': None, '__annotations__': {}, '__builtins__':

# (built-in), '__file__': 'D:/pycharm/練習/week03/new14.py', '__cached__': None,

# 'func': }

# 今天內(nèi)容很多

和迭代器生成器相關

range() 生成數(shù)據(jù)

next() 迭代器向下執(zhí)行一次, 內(nèi)部實際使?用了__ next__()?方法返回迭代器的下一個項目

iter() 獲取迭代器, 內(nèi)部實際使用的是__ iter__()?方法來獲取迭代器

for i in range(15,-1,-5):

print(i)

# 15

# 10

# 5

# 0

lst = [1,2,3,4,5]

it = iter(lst) # __iter__()獲得迭代器

print(it.__next__()) #1

print(next(it)) #2 __next__()

print(next(it)) #3

print(next(it)) #4

字符串類型代碼的執(zhí)行

eval() 執(zhí)行字符串類型的代碼. 并返回最終結果

exec() 執(zhí)行字符串類型的代碼

compile() 將字符串類型的代碼編碼. 代碼對象能夠通過exec語句來執(zhí)行或者eval()進行求值

s1 = input("請輸入a+b:") #輸入:8+9

print(eval(s1)) # 17 可以動態(tài)的執(zhí)行代碼. 代碼必須有返回值

s2 = "for i in range(5): print(i)"

a = exec(s2) # exec 執(zhí)行代碼不返回任何內(nèi)容

# 0

# 1

# 2

# 3

# 4

print(a) #None

# 動態(tài)執(zhí)行代碼

exec("""

def func():

print(" 我是周杰倫")

""" )

func() #我是周杰倫

code1 = "for i in range(3): print(i)"

com = compile(code1, "", mode="exec") # compile并不會執(zhí)行你的代碼.只是編譯

exec(com) # 執(zhí)行編譯的結果

# 0

# 1

# 2

code2 = "5+6+7"

com2 = compile(code2, "", mode="eval")

print(eval(com2)) # 18

code3 = "name = input('請輸入你的名字:')" #輸入:hello

com3 = compile(code3, "", mode="single")

exec(com3)

print(name) #hello

輸入輸出

print() : 打印輸出

input() : 獲取用戶輸出的內(nèi)容

print("hello", "world", sep="*", end="@") # sep:打印出的內(nèi)容用什么連接,end:以什么為結尾

#hello*world@

內(nèi)存相關

hash() : 獲取到對象的哈希值(int, str, bool, tuple). hash算法:(1) 目的是唯一性 (2) dict 查找效率非常高, hash表.用空間換的時間 比較耗費內(nèi)存

s = 'alex'print(hash(s)) #-168324845050430382lst = [1, 2, 3, 4, 5]print(hash(lst)) #報錯,列表是不可哈希的 id() : 獲取到對象的內(nèi)存地址s = 'alex'print(id(s)) #2278345368944

文件操作相關

open() : 用于打開一個文件, 創(chuàng)建一個文件句柄

f = open('file',mode='r',encoding='utf-8')

f.read()

f.close()

模塊相關

__ import__() : 用于動態(tài)加載類和函數(shù)

# 讓用戶輸入一個要導入的模塊

import os

name = input("請輸入你要導入的模塊:")

__import__(name) # 可以動態(tài)導入模塊

幫 助

help() : 函數(shù)用于查看函數(shù)或模塊用途的詳細說明

print(help(str)) #查看字符串的用途

調(diào)用相關

callable() : 用于檢查一個對象是否是可調(diào)用的. 如果返回True, object有可能調(diào)用失敗, 但如果返回False. 那調(diào)用絕對不會成功

a = 10

print(callable(a)) #False 變量a不能被調(diào)用

def f():

print("hello")

print(callable(f)) # True 函數(shù)是可以被調(diào)用的

查看內(nèi)置屬性

dir() : 查看對象的內(nèi)置屬性, 訪問的是對象中的__dir__()方法

print(dir(tuple)) #查看元組的方法

你還有什么想要補充的嗎?

免責聲明:本文內(nèi)容來源于網(wǎng)絡,文章版權歸原作者所有,意在傳播相關技術知識行業(yè)趨勢,供大家學習交流,若涉及作品版權問題,請聯(lián)系刪除或授權事宜。

技術君個人微信

添加技術君個人微信即送一份驚喜大禮包

→ 技術資料共享

→ 技術交流社群

--END--

往日熱文:

Python程序員深度學習的“四大名著”:

這四本書著實很不錯!我們都知道現(xiàn)在機器學習、深度學習的資料太多了,面對海量資源,往往陷入到“無從下手”的困惑出境。而且并非所有的書籍都是優(yōu)質(zhì)資源,浪費大量的時間是得不償失的。給大家推薦這幾本好書并做簡單介紹。

獲得方式:

2.后臺回復關鍵詞:名著

在Python中定義Main函數(shù)

目錄

許多編程語言都有一個特殊的函數(shù),當操作系統(tǒng)開始運行程序時會自動執(zhí)行該函數(shù)。這個函數(shù)通常被命名為main(),并且依據(jù)語言標準具有特定的返回類型和參數(shù)。另一方面,Python解釋器從文件頂部開始執(zhí)行腳本,并且沒有自動執(zhí)行的特殊函數(shù)。

盡管如此,為程序的執(zhí)行定義一個起始點有助于理解程序是如何運行的。Python程序員提出了幾種方式對此進行實現(xiàn)。

本文結束時,您將了解以下內(nèi)容:

Python中的基本main()函數(shù)

一些Python腳本中,包含一個函數(shù)定義和一個條件語句,如下所示:

此代碼中,包含一個main()函數(shù),在程序執(zhí)行時打印Hello World!。此外,還包含一個條件(或if)語句,用于檢查__name__的值并將其與字符串"__main__"進行比較。當if語句為True時,Python解釋器將執(zhí)行main()函數(shù)。更多關于Python條件語句的信息可以由此獲得。

這種代碼模式在Python文件中非常常見,它將作為腳本執(zhí)行并導入另一個模塊。為了幫助理解這段代碼的執(zhí)行方式,首先需要了解Python解釋器如何根據(jù)代碼的執(zhí)行方式設置__name__。

Python中的執(zhí)行模式

Python解釋器執(zhí)行代碼有兩種方式:

更多內(nèi)容可參考如何運行Python腳本。無論采用哪種方式,Python都會定義一個名為__name__的特殊變量,該變量包含一個字符串,其值取決于代碼的使用方式。

本文將如下示例文件保存為execution_methods.py,以 探索 代碼如何根據(jù)上下文改變行為:

在此文件中,定義了三個對print()函數(shù)的調(diào)用。前兩個打印一些介紹性短語。第三個print()會先打印短語The value __name__ is,之后將使用Python內(nèi)置的repr()函數(shù)打印出__name__變量。

在Python中,repr()函數(shù)將對象轉(zhuǎn)化為供解釋器讀取的形式。上述示例通過使用repr()函數(shù)來強調(diào)__name__的值為字符串。更多關于repr()的內(nèi)容可參考Python文檔。

在本文中,您將隨處可見文件(file),模塊(module)和腳本(script)這三個字眼。實際上,三者之間并無太大的差別。不過,在強調(diào)代碼目的時,還是存在細微的差異:

“如何運行Python腳本”一文也討論了三者的差別。

基于命令行執(zhí)行

在這類方法中,Python腳本將通過命令行來執(zhí)行。

執(zhí)行腳本時,無法與Python解釋器正在執(zhí)行的代碼交互。關于如何通過命令行執(zhí)行代碼的詳細信息對本文而言并不重要,但您可以通過展開下框閱讀更多有關Windows,Linux和macOS之間命令行差異的內(nèi)容。

命令行環(huán)境

不同的操作系統(tǒng)在使用命令行執(zhí)行代碼時存在細微的差異。

在Linux和macOS中,通常使用如下命令:

美元符號($)之前的內(nèi)容可能有所不同,具體取決于您的用戶名和計算機名稱。您鍵入的命令位于$之后。在Linux或macOS上,Python3的可執(zhí)行文件名為python3,因此可以通過輸入python3 script_name.py來運行python腳本。

在Windows上,命令提示符通常如下所示:

根據(jù)您的用戶名,之前的內(nèi)容可能會有所不同,您輸入的命令位于之后。在Windows上,Python3的可執(zhí)行文件通常為python。因此可以通過輸入python script_name.py來運行python腳本。

無論哪種操作系統(tǒng),本文的Python腳本的輸出結果都是相同的。因此本文以Linux和macOS為例。

使用命令行執(zhí)行execution_methods.py,如下所示:

在這個示例中,__name__具有值'__main__',其中引號(')表明該值為字符串類型。

請記住,在Python中,使用單引號(')和雙引號(")定義的字符串沒有區(qū)別。更多關于字符串的內(nèi)容請參考Python的基本數(shù)據(jù)類型。

如果在腳本中包含"shebang行"并直接執(zhí)行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,將會獲取相同的結果。

您還可以通過向命令行添加-m參數(shù)的方法實現(xiàn)以模塊的方式執(zhí)行。通常情況下,推薦如下方式pip: python3 -m pip install package_name。

添加-m參數(shù)將會運行包中__main__.py的代碼。更多關于__main__.py文件的內(nèi)容可參考如何將開源Python包發(fā)布到PyPI中。

在三種情況中,__name__都具有相同的值:字符串'__main__'。

技術細節(jié):Python文檔中具體定義了__name__何時取值為'__main__'。

當通過標準輸入,腳本或者交互提示中讀取數(shù)據(jù)時,模塊的__name__將取值為'__main__'。(來源)

__name__與__doc__,__package__和其他屬性一起存儲在模塊的全局命名空間。更多關于屬性的信息可參考Python數(shù)據(jù)模型文檔,特別是關于模塊和包的信息,請參閱Python Import文檔。

導入模塊或解釋器

接下來是Python解釋器執(zhí)行代碼的第二種方式:導入。在開發(fā)模塊或腳本時,可以使用import關鍵字導入他人已經(jīng)構建的模塊。

在導入過程中,Python執(zhí)行指定模塊中定義的語句(但僅在第一次導入模塊時)。要演示導入execution_methods.py文件的結果,需要啟動Python解釋器,然后導入execution_methods.py文件:

在此代碼輸出中,Python解釋器執(zhí)行了三次print()函數(shù)調(diào)用。前兩行由于沒有變量,在輸出方面與在命令行上作為腳本執(zhí)行時完全相同。但是第三個輸出存在差異。

當Python解釋器導入代碼時,__name__的值與要導入的模塊的名稱相同。您可以通過第三行的輸出了解這一點。__name__的值為'execution_methods',是Python導入的.py文件。

注意如果您在沒有退出Python時再次導入模塊,將不會有輸出。

注意:更多關于導入在Python中如何工作的內(nèi)容請參考官方文檔和Python中的絕對和相對導入。

Main函數(shù)的最佳實踐

既然您已經(jīng)了解兩種執(zhí)行方式上的差異,那么掌握一些最佳實踐方案還是很有用的。它們將適用于編寫作為腳本運行的代碼或者在另一個模塊導入的代碼。

如下是四種實踐方式:

將大部分代碼放入函數(shù)或類中

請記住,Python解釋器在導入模塊時會執(zhí)行模塊中的所有代碼。有時如果想要實現(xiàn)用戶可控的代碼,會導致一些副作用,例如:

在這種情況下,想要實現(xiàn)用戶控制觸發(fā)此代碼的執(zhí)行,而不是讓Python解釋器在導入模塊時執(zhí)行代碼。

因此,最佳方法是將大部分代碼包含在函數(shù)或類中。這是因為當Python解釋器遇到def或class關鍵字時,它只存儲這些定義供以后使用,并且在用戶通知之前不會實際執(zhí)行。

將如下代碼保存在best_practices.py以證明這個想法:

在此代碼中,首先從time模塊中導入sleep()。

在這個示例中,參數(shù)以秒的形式傳入sleep()函數(shù)中,解釋器將暫停一段時間再運行。隨后,使用print()函數(shù)打印關于代碼描述的語句。

之后,定義一個process_data()函數(shù),執(zhí)行如下五項操作:

在命令行中執(zhí)行

當你將此文件作為腳本用命令行執(zhí)行時會發(fā)生什么呢?

Python解釋器將執(zhí)行函數(shù)定義之外的from time import sleep和print(),之后將創(chuàng)建函數(shù)process_data()。然后,腳本將退出而不做任何進一步的操作,因為腳本沒有任何執(zhí)行process_data()的代碼。

如下是這段腳本的執(zhí)行結果:

我們在這里看到的輸出是第一個print()的結果。注意,從time導入和定義process_data()函數(shù)不產(chǎn)生結果。具體來說,調(diào)用定義在process_data()內(nèi)部的print()不會打印結果。

導入模塊或解釋器執(zhí)行

在會話(或其他模塊)中導入此文件時,Python解釋器將執(zhí)行相同的步驟。

Python解釋器導入文件后,您可以使用已導入模塊中定義的任何變量,類或函數(shù)。為了證明這一點,我們將使用可交互的Python解釋器。啟動解釋器,然后鍵入import best_practices:

導入best_practices.py后唯一的輸出來自process_data()函數(shù)外定義的print()。導入模塊或解釋器執(zhí)行與基于命令行執(zhí)行類似。

使用__name__控制代碼的執(zhí)行

如何實現(xiàn)基于命令行而不使用Python解釋器導入文件來執(zhí)行呢?

您可以使用__name__來決定執(zhí)行上下文,并且當__name__等于"__main__"時才執(zhí)行process_data()。在best_practices.py文件中添加如下代碼:

這段代碼添加了一個條件語句來檢驗__name__的值。當值為"__main__"時,條件為True。記住當__name__變量的特殊值為"__main__"時意味著Python解釋器會執(zhí)行腳本而不是將其導入。

條件語塊內(nèi)添加了四行代碼(第12,13,14和15行):

現(xiàn)在,在命令行中運行best_practices.py,并觀察輸出的變化:

首先,輸出顯示了process_data()函數(shù)外的print()的調(diào)用結果。

之后,data的值被打印。因為當Python解釋器將文件作為腳本執(zhí)行時,變量__name__具有值"__main__",因此條件語句被計算為True。

接下來,腳本將調(diào)用process_data()并傳入data進行修改。當process_data執(zhí)行時,將輸出一些狀態(tài)信息。最終,將輸出modified_data的值。

現(xiàn)在您可以驗證從解釋器(或其他模塊)導入best_practices.py后發(fā)生的事情了。如下示例演示了這種情況:

注意,當前結果與將條件語句添加到文件末尾之前相同。因為此時__name__變量的值為"best_practices",因此條件語句結果為False,Python將不執(zhí)行process_data()。

創(chuàng)建名為main()的函數(shù)來包含要運行的代碼

現(xiàn)在,您可以編寫作為腳本由從命令行執(zhí)行并導入且沒有副作用的Python代碼。接下來,您將學習如何編寫代碼并使其他程序員能輕松地理解其含義。

許多語言,如C,C++,Java以及其他的一些語言,都會定義一個叫做main()的函數(shù),當編譯程序時,操作系統(tǒng)會自動調(diào)用該函數(shù)。此函數(shù)通常被稱為入口點(entry point),因為它是程序進入執(zhí)行的起始位置。

相比之下,Python沒有一個特殊的函數(shù)作為腳本的入口點。實際上在Python中可以將入口點定義成任何名稱。

盡管Python不要求將函數(shù)命名為main(),但是最佳的做法是將入口點函數(shù)命名為main()。這樣方便其他程序員定位程序的起點。

此外,main()函數(shù)應該包含Python解釋器執(zhí)行文件時要運行的任何代碼。這比將代碼放入條件語塊中更好,因為用戶可以在導入模塊時重復使用main()函數(shù)。

修改best_practices.py文件如下所示:

在這個示例中,定義了一個main()函數(shù),它包含了上面的條件語句塊。之后修改條件語塊執(zhí)行main()。如果您將此代碼作為腳本運行或?qū)?,將獲得與上一節(jié)相同的輸出。

在main()中調(diào)用其他函數(shù)

另一種常見的實現(xiàn)方式是在main()中調(diào)用其他函數(shù),而不是直接將代碼寫入main()。這樣做的好處在于可以實現(xiàn)將幾個獨立運行的子任務整合。

例如,某個腳本有如下功能:

如果在單獨的函數(shù)中各自實現(xiàn)這些子任務,您(或其他用戶)可以很容易地實現(xiàn)代碼重用。之后您可以在main()函數(shù)中創(chuàng)建默認的工作流。

您可以根據(jù)自己的情況選擇是否使用此方案。將任務拆分為多個函數(shù)會使重用更容易,但會增加他人理解代碼的難度。

修改best_practices.py文件如下所示:

在此示例代碼中,文件的前10行具有與之前相同的內(nèi)容。第12行的第二個函數(shù)創(chuàng)建并返回一些示例數(shù)據(jù),第17行的第三個函數(shù)模擬將修改后的數(shù)據(jù)寫入數(shù)據(jù)庫。

第21行定義了main()函數(shù)。在此示例中,對main()做出修改,它將調(diào)用數(shù)據(jù)讀取,數(shù)據(jù)處理以及數(shù)據(jù)寫入等功能。

首先,從read_data_from_web()中創(chuàng)建data。將data作為參數(shù)傳入process_data(),之后將返回modified_data。最后,將modified_data傳入write_data_to_database()。

腳本的最后兩行是條件語塊用于驗證__name__,并且如果if語句為True,則執(zhí)行main()。

在命令行中運行如下所示:

根據(jù)執(zhí)行結果,Python解釋器在執(zhí)行main()函數(shù)時,將依次執(zhí)行read_data_from_web(),process_data()以及write_data_to_database()。當然,您也可以導入best_practices.py文件并重用process_data()作為不同的數(shù)據(jù)輸入源,如下所示:

在此示例中,導入了best_practices并且將其簡寫為bp。

導入過程會導致Python解釋器執(zhí)行best_practices.py的全部代碼,因此輸出顯示解釋文件用途的信息。

然后,從文件中存儲數(shù)據(jù)而不是從Web中讀取數(shù)據(jù)。之后,可以重用best_practices.py文件中的process_data()和write_data_to_database()函數(shù)。在此情況下,可以利用代碼重寫來取代在main()函數(shù)中實現(xiàn)全部的代碼邏輯。

實踐總結

以下是Python中main()函數(shù)的四個關鍵最佳實踐:

結論

恭喜!您現(xiàn)在已經(jīng)了解如何創(chuàng)建Python main()函數(shù)了。

本文介紹了如下內(nèi)容:

現(xiàn)在,您可以開始編寫一些非常棒的關于Python main()函數(shù)代碼啦!

當前標題:python內(nèi)建函數(shù)運行,Python內(nèi)建函數(shù)
文章分享:http://muchs.cn/article18/hcgdgp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站做網(wǎng)站、搜索引擎優(yōu)化、網(wǎng)站設計、移動網(wǎng)站建設靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)