python的內(nèi)建函數(shù)即是python自帶的函數(shù),這種函數(shù)不需要定義,并且不同的內(nèi)建函數(shù)具有不同的功能,可以直接使用。
創(chuàng)新互聯(lián)建站專注于梅河口企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城建設(shè)。梅河口網(wǎng)站建設(shè)公司,為梅河口等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
以下是部分內(nèi)建函數(shù)用法及說明
1、abs(),返回數(shù)字的絕對值。
2、all(),如果集合中所有元素是true或集合為空集合,返回True。
3、any(),如果集合中有一項元素是true,返回True;空集合為False
4、ascii(), 返回一個表示對象的字符串。
5、bin(),將整數(shù)轉(zhuǎn)換為前綴為“0b”的二進制字符串。
6、bool(),返回一個布爾值,即True或者之一False。
7、bytearray(),返回一個新的字節(jié)數(shù)組。
8、callable(對象)判斷對象參數(shù)是否可被調(diào)用(可被調(diào)用指的是對象能否使用()括號的方法調(diào)用)
9、chr(),返回表示Unicode代碼點為整數(shù)i的字符的字符串。與ord()函數(shù)相反。
推薦學(xué)習《python教程》
10、classmethod,將方法轉(zhuǎn)換為類方法。
11、compile,將源代碼編譯為代碼或AST對象。代碼對象可以由exec()或執(zhí)行eval()。 source可以是普通字符串,字節(jié)字符串或AST對象。
12、dic(),創(chuàng)建一個字典
13、divmod(a,b),將兩個數(shù)作為參數(shù),并在使用整數(shù)除法時返回由商和余數(shù)組成的一對數(shù)
14、enumerate(iterable,start = 0)
enumerate是枚舉、列舉的意思
對于一個可迭代的(iterable)/可遍歷的對象(如列表、字符串),enumerate將其組成一個索引序列,利用它可以同時獲得索引和值
enumerate多用于在for循環(huán)中得到計數(shù)
15、eval,將一個字符串變?yōu)樽值?/p>
16、exec(object [, globals[, locals]])exec語句用來執(zhí)行儲存在字符串或文件中的Python語句
17、filter(功能,可迭代)
filter函數(shù)用于過濾序列
filter()把傳入的函數(shù)依次作用于每個元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。
==================================
將列表傳遞給函數(shù)后,函數(shù)就能直接訪問其內(nèi)容
假設(shè)有一個用戶列表,要問候其中的每位用戶
將列表傳遞給函數(shù)后,函數(shù)就可對其進行修改,在函數(shù)中對這個列表所做的任何修改都是永久性的
一家為用戶提交的設(shè)計制作3D打印模型的公司,需要打印的設(shè)計存儲在一個列表中,打印后轉(zhuǎn)移到另一個列表中。
有時候需要禁止函數(shù)修改列表,為解決這個問題,可想向函數(shù)傳遞列表的副本而不是元件;這樣函數(shù)所做的任何修改都只影響副本,不影響元件
有時候,預(yù)先布置的函數(shù)需要接受多少個實參,python允許函數(shù)從調(diào)用語句中手機任意數(shù)量的實參
一個制作披薩的寒素,它需要接受很多配料,但無法確定顧客要多少種配料,下面函數(shù)只有一個形參*toppings,不管調(diào)用語句提供了多少實參,這個形參都將他們統(tǒng)統(tǒng)收入囊中
如果要讓函數(shù)接受不同類型的實參,必須在函數(shù)定義中將接納任意數(shù)量實參的形參放在最后
python先匹配位置實參和關(guān)鍵字實參,再將余下的實參收集到最后一個形參中
如果前邊的函數(shù)還需要一個表示披薩尺寸的實參,必須將該形參放在*toppings的前面
有時候,需要接受任意數(shù)量的實參,但預(yù)先不知道傳遞給函數(shù)的會是射門楊的信息,再這種情況下,可將函數(shù)編寫成能夠接受任意數(shù)量的鍵-值對,調(diào)用語句提供了多少就接受多少
創(chuàng)建用戶簡介:你知道你將收到有關(guān)用戶的信息,但不確定會是什么樣的信息,在下面示例中,build_profile()接受名和姓,同時還接受任意數(shù)量的關(guān)鍵字實參
這個方法是python線程中使用的。
對于可重入鎖,必須用acquire()獲得鎖
會導(dǎo)致系統(tǒng)位置錯誤。
在多任務(wù)系統(tǒng)下,中斷可能在任務(wù)執(zhí)行的任何時間發(fā)生,如果一個函數(shù)的執(zhí)行期間被中斷后,到重新恢復(fù)到斷點進行執(zhí)行的過程中,函數(shù)所依賴的環(huán)境沒有發(fā)生改變,那么這個函數(shù)就是可重入的,否則就不可重入。
在多任務(wù)系統(tǒng)下,中斷可能在任務(wù)執(zhí)行的任何時間發(fā)生,如果一個函數(shù)的執(zhí)行期間被中斷后,到重新恢復(fù)到斷點進行執(zhí)行的過程中,函數(shù)所依賴的環(huán)境沒有發(fā)生改變,那么這個函數(shù)就是可重入的,否則就不可重入。
這里是自己寫下關(guān)于 Python 跟進程相關(guān)的 threading 模塊的一點筆記,跟有些跟 Linux 調(diào)用挺像的,有共通之處。
直接傳入
繼承 Thread 重寫 run 方法
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
group 線程組,未實現(xiàn)
start() 線程就緒
join([timeout]) 阻塞其他線程,直到調(diào)用這方法的進程結(jié)束或時間到達
RuntimeError: cannot join thread before it is started
get/setName(name) 獲取/設(shè)置線程名。
isAlive() 返回線程是否在運行。
is/setDaemon(bool): 獲取/設(shè)置是后臺線程(默認前臺線程(False))。(在start之前設(shè)置)
The entire Python program exits when no alive non-daemon threads are left.
沒有非后臺進程運行,Python 就退出。
主線程執(zhí)行完畢后,后臺線程不管是成功與否,主線程均停止
t.start()
t.join()
start() 后 join() 會順序執(zhí)行,失去線程意義
Lock屬于全局,Rlock屬于線程(R的意思是可重入,線程用Lock的話會死鎖,來看例子)
acquire(blocking=True, timeout=-1) 申請鎖,返回申請的結(jié)果
release() 釋放鎖,沒返回結(jié)果
可以在構(gòu)造時傳入rlock lock實例,不然自己生成一個。
acquire([timeout])/release(): 與lock rlock 相同
wait([timeout]): 調(diào)用這個方法將使線程進入等待池,并釋放鎖。調(diào)用方法前線程必須已獲得鎖定,否則將拋出異常。
notify(): 調(diào)用這個方法將從等待池挑選一個線程并通知,收到通知的線程將自動調(diào)用acquire()嘗試獲得鎖定(進入鎖定池);其他線程仍然在等待池中。調(diào)用這個方法不會釋放鎖定。調(diào)用方法前線程必須已獲得鎖定,否則將拋出異常。
notifyAll(): 調(diào)用這個方法將通知等待池中所有的線程,這些線程都將進入鎖定池嘗試獲得鎖定。調(diào)用這個方法不會釋放鎖定。使用前線程必須已獲得鎖定,否則將拋出異常。
threading.Semaphore(value=1)
acquire(blocking=True, timeout=None)
資源數(shù)大于0,減一并返回,等于0時等待,blocking為False不阻塞進程
返回值是申請結(jié)果
release()
資源數(shù)加1
事件內(nèi)置了一個初始為False的標志
is_set() 返回內(nèi)置標志的狀態(tài)
set() 設(shè)為True
clear() 設(shè)為False
wait(timeout=None) 阻塞線程并等待,為真時返回。返回值只會在等待超時時為False,其他情況為True
threading.Timer(interval, function, args=None, kwargs=None)
第一個參數(shù)是時間間隔,單位是秒,整數(shù)或者浮點數(shù),負數(shù)不會報錯直接執(zhí)行不等待
可以用cancel() 取消
threading.Barrier(parties, action=None, timeout=None)
調(diào)用的進程數(shù)目達到第一個設(shè)置的參數(shù)就喚醒全部進程
wait(timeout=None)
reset() 重置,等待中的進程收到 BrokenBarrierError 錯誤
Python 函數(shù)
函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)。
定義一個函數(shù)
你可以定義一個由自己想要功能的函數(shù),以下是簡單的規(guī)則:
函數(shù)代碼塊以?def?關(guān)鍵詞開頭,后接函數(shù)標識符名稱和圓括號()。
任何傳入?yún)?shù)和自變量必須放在圓括號中間。圓括號之間可以用于定義參數(shù)。
函數(shù)的第一行語句可以選擇性地使用文檔字符串—用于存放函數(shù)說明。
函數(shù)內(nèi)容以冒號起始,并且縮進。
return [表達式]?結(jié)束函數(shù),選擇性地返回一個值給調(diào)用方。不帶表達式的return相當于返回 None。
語法
def functionname( parameters ): ? "函數(shù)_文檔字符串"
function_suite
return [expression]
默認情況下,參數(shù)值和參數(shù)名稱是按函數(shù)聲明中定義的順序匹配起來的。
實例
以下為一個簡單的Python函數(shù),它將一個字符串作為傳入?yún)?shù),再打印到標準顯示設(shè)備上。
實例(Python 2.0+)
def printme( str ): ? "打印傳入的字符串到標準顯示設(shè)備上"
print str
return
函數(shù)調(diào)用
定義一個函數(shù)只給了函數(shù)一個名稱,指定了函數(shù)里包含的參數(shù),和代碼塊結(jié)構(gòu)。
這個函數(shù)的基本結(jié)構(gòu)完成以后,你可以通過另一個函數(shù)調(diào)用執(zhí)行,也可以直接從Python提示符執(zhí)行。
如下實例調(diào)用了printme()函數(shù):
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 定義函數(shù)def printme( str ): ? "打印任何傳入的字符串"
print str
return
# 調(diào)用函數(shù)printme("我要調(diào)用用戶自定義函數(shù)!")printme("再次調(diào)用同一函數(shù)")
以上實例輸出結(jié)果:
我要調(diào)用用戶自定義函數(shù)!再次調(diào)用同一函數(shù)
參數(shù)傳遞
在 python 中,類型屬于對象,變量是沒有類型的:
a=[1,2,3]
a="Runoob"
以上代碼中,[1,2,3]?是 List 類型,"Runoob"?是 String 類型,而變量 a 是沒有類型,她僅僅是一個對象的引用(一個指針),可以是 List 類型對象,也可以指向 String 類型對象。
可更改(mutable)與不可更改(immutable)對象
在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。
不可變類型:變量賦值?a=5?后再賦值?a=10,這里實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當于新生成了a。
可變類型:變量賦值?la=[1,2,3,4]?后再賦值?la[2]=5?則是將 list la 的第三個元素值更改,本身la沒有動,只是其內(nèi)部的一部分值被修改了。
python 函數(shù)的參數(shù)傳遞:
不可變類型:類似 c++ 的值傳遞,如 整數(shù)、字符串、元組。如fun(a),傳遞的只是a的值,沒有影響a對象本身。比如在 fun(a)內(nèi)部修改 a 的值,只是修改另一個復(fù)制的對象,不會影響 a 本身。
可變類型:類似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改后fun外部的la也會受影響
python 中一切都是對象,嚴格意義我們不能說值傳遞還是引用傳遞,我們應(yīng)該說傳不可變對象和傳可變對象。
python 傳不可變對象實例
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
def ChangeInt( a ): ? ?a = 10
b = 2ChangeInt(b)print b # 結(jié)果是 2
實例中有 int 對象 2,指向它的變量是 b,在傳遞給 ChangeInt 函數(shù)時,按傳值的方式復(fù)制了變量 b,a 和 b 都指向了同一個 Int 對象,在 a=10 時,則新生成一個 int 值對象 10,并讓 a 指向它。
傳可變對象實例
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 可寫函數(shù)說明def changeme( mylist ): ? "修改傳入的列表"
mylist.append([1,2,3,4])
print "函數(shù)內(nèi)取值: ", mylist
return
# 調(diào)用changeme函數(shù)mylist = [10,20,30]changeme( mylist )print "函數(shù)外取值: ", mylist
實例中傳入函數(shù)的和在末尾添加新內(nèi)容的對象用的是同一個引用,故輸出結(jié)果如下:
函數(shù)內(nèi)取值: ?[10, 20, 30, [1, 2, 3, 4]]函數(shù)外取值: ?[10, 20, 30, [1, 2, 3, 4]]
參數(shù)
以下是調(diào)用函數(shù)時可使用的正式參數(shù)類型:
必備參數(shù)
關(guān)鍵字參數(shù)
默認參數(shù)
不定長參數(shù)
必備參數(shù)
必備參數(shù)須以正確的順序傳入函數(shù)。調(diào)用時的數(shù)量必須和聲明時的一樣。
調(diào)用printme()函數(shù),你必須傳入一個參數(shù),不然會出現(xiàn)語法錯誤:
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
#可寫函數(shù)說明def printme( str ): ? "打印任何傳入的字符串"
print str
return
#調(diào)用printme函數(shù)printme()
以上實例輸出結(jié)果:
Traceback (most recent call last):
File "test.py", line 11, in module
printme()TypeError: printme() takes exactly 1 argument (0 given)
關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)和函數(shù)調(diào)用關(guān)系緊密,函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值。
使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時參數(shù)的順序與聲明時不一致,因為 Python 解釋器能夠用參數(shù)名匹配參數(shù)值。
以下實例在函數(shù) printme() 調(diào)用時使用參數(shù)名:
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
#可寫函數(shù)說明def printme( str ): ? "打印任何傳入的字符串"
print str
return
#調(diào)用printme函數(shù)printme( str = "My string")
以上實例輸出結(jié)果:
My string
下例能將關(guān)鍵字參數(shù)順序不重要展示得更清楚:
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
#可寫函數(shù)說明def printinfo( name, age ): ? "打印任何傳入的字符串"
print "Name: ", name
print "Age ", age
return
#調(diào)用printinfo函數(shù)printinfo( age=50, name="miki" )
以上實例輸出結(jié)果:
Name: ?mikiAge ?50
默認參數(shù)
調(diào)用函數(shù)時,默認參數(shù)的值如果沒有傳入,則被認為是默認值。下例會打印默認的age,如果age沒有被傳入:
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
#可寫函數(shù)說明def printinfo( name, age = 35 ): ? "打印任何傳入的字符串"
print "Name: ", name
print "Age ", age
return
#調(diào)用printinfo函數(shù)printinfo( age=50, name="miki" )printinfo( name="miki" )
以上實例輸出結(jié)果:
Name: ?mikiAge ?50Name: ?mikiAge ?35
不定長參數(shù)
你可能需要一個函數(shù)能處理比當初聲明時更多的參數(shù)。這些參數(shù)叫做不定長參數(shù),和上述2種參數(shù)不同,聲明時不會命名。基本語法如下:
def functionname([formal_args,] *var_args_tuple ): ? "函數(shù)_文檔字符串"
function_suite
return [expression]
加了星號(*)的變量名會存放所有未命名的變量參數(shù)。不定長參數(shù)實例如下:
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 可寫函數(shù)說明def printinfo( arg1, *vartuple ): ? "打印任何傳入的參數(shù)"
print "輸出: "
print arg1
for var in vartuple: ? ? ?print var
return
# 調(diào)用printinfo 函數(shù)printinfo( 10 )printinfo( 70, 60, 50 )
以上實例輸出結(jié)果:
輸出:10輸出:706050
匿名函數(shù)
python 使用 lambda 來創(chuàng)建匿名函數(shù)。
lambda只是一個表達式,函數(shù)體比def簡單很多。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
lambda函數(shù)擁有自己的命名空間,且不能訪問自有參數(shù)列表之外或全局命名空間里的參數(shù)。
雖然lambda函數(shù)看起來只能寫一行,卻不等同于C或C++的內(nèi)聯(lián)函數(shù),后者的目的是調(diào)用小函數(shù)時不占用棧內(nèi)存從而增加運行效率。
語法
lambda函數(shù)的語法只包含一個語句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
如下實例:
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 可寫函數(shù)說明sum = lambda arg1, arg2: arg1 + arg2
# 調(diào)用sum函數(shù)print "相加后的值為 : ", sum( 10, 20 )print "相加后的值為 : ", sum( 20, 20 )
以上實例輸出結(jié)果:
相加后的值為 : ?30相加后的值為 : ?40
return 語句
return語句[表達式]退出函數(shù),選擇性地向調(diào)用方返回一個表達式。不帶參數(shù)值的return語句返回None。之前的例子都沒有示范如何返回數(shù)值,下例便告訴你怎么做:
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
# 可寫函數(shù)說明def sum( arg1, arg2 ): ? # 返回2個參數(shù)的和."
total = arg1 + arg2
print "函數(shù)內(nèi) : ", total
return total
# 調(diào)用sum函數(shù)total = sum( 10, 20 )
以上實例輸出結(jié)果:
函數(shù)內(nèi) : ?30
變量作用域
一個程序的所有的變量并不是在哪個位置都可以訪問的。訪問權(quán)限決定于這個變量是在哪里賦值的。
變量的作用域決定了在哪一部分程序你可以訪問哪個特定的變量名稱。兩種最基本的變量作用域如下:
全局變量
局部變量
全局變量和局部變量
定義在函數(shù)內(nèi)部的變量擁有一個局部作用域,定義在函數(shù)外的擁有全局作用域。
局部變量只能在其被聲明的函數(shù)內(nèi)部訪問,而全局變量可以在整個程序范圍內(nèi)訪問。調(diào)用函數(shù)時,所有在函數(shù)內(nèi)聲明的變量名稱都將被加入到作用域中。如下實例:
實例(Python 2.0+)
#!/usr/bin/python# -*- coding: UTF-8 -*-
total = 0 # 這是一個全局變量# 可寫函數(shù)說明def sum( arg1, arg2 ): ? #返回2個參數(shù)的和."
total = arg1 + arg2 # total在這里是局部變量.
print "函數(shù)內(nèi)是局部變量 : ", total
return total
#調(diào)用sum函數(shù)sum( 10, 20 )print "函數(shù)外是全局變量 : ", total
以上實例輸出結(jié)果:
函數(shù)內(nèi)是局部變量 : ?30函數(shù)外是全局變量 : ?0