Python中有哪些關(guān)鍵字及關(guān)鍵字的用法
Python有哪些關(guān)鍵字
Python常用的關(guān)鍵字
and, del, from, not, while, as, elif, global, or, with, assert, else, if, pass, yield, break, except, import, print, class, exec, in, raise, contiue, finally, is, return, def, for, lambda, try
1.and , or
and , or 為邏輯關(guān)系用語,Python具有短路邏輯,F(xiàn)alse and 返回 False
不執(zhí)行后面的語句, True or 直接返回True,不執(zhí)行后面的語句
2.del
刪除變量
if __name__=='__main__': a=1 # 對象 1 被 變量a引用,對象1的引用計數(shù)器為1 b=a # 對象1 被變量b引用,對象1的引用計數(shù)器加1 c=a #1對象1 被變量c引用,對象1的引用計數(shù)器加1 del a #刪除變量a,解除a對1的引用 del b #刪除變量b,解除b對1的引用 #print a #運行此句出錯,name 'a' is not defined,說明 del 刪除變量a print(c) #最終變量c仍然引用1 print (c)
而列表本身包含的是變量,例:
list = [1,2,3] # 包含list[0],list[1],list[2] # 并不包含數(shù)字1,2,3
所以
if __name__=='__main__': li=[1,2,3,4,5] #列表本身不包含數(shù)據(jù)1,2,3,4,5,而是包含變量:li[0] li[1] li[2] li[3] li[4] first=li[0] #拷貝列表,也不會有數(shù)據(jù)對象的復(fù)制,而是創(chuàng)建新的變量引用 del li[0] # 列表本身包含的是變量,del 刪除的是變量。 print (li) #輸出[2, 3, 4, 5] print(first) #輸出 1
3.from
from引用模塊時會用到,例:
from sys import argv # 從sys中導(dǎo)入argv from sys import * # 將sys中所有東西都導(dǎo)入 import sys # 導(dǎo)入sys,當需要sys中內(nèi)容時,需sys.argv而from sys import * #不用每次都重復(fù)輸入'sys.'
4.golbal
golbal為全局變量,但當單個函數(shù)中出現(xiàn)同一變量名時,在單個函數(shù)中為局部變量
golbal q q = 66 print ("q=", q) #q = 66 def function(): q = 3 print ('q =',q) function() # q = 3 print ('q =',q) # q = 66
5.with
with被用來處理異常
- 不用with 處理文件異常
file = open("/tmp/foo.txt") try: data = file.read() finally: file.close()
- 用with
with open("/tmp/foo.txt") as file: data = file.read()
緊跟with后面的語句被求值后,返回對象的enter()方法被調(diào)用,這個方法的返回值將被賦值給as后面的變量,此處為file
當with后面的代碼塊全部被執(zhí)行完后,將調(diào)用前面返回對象的exit()方法
#with 的工作 class Sample: def __enter__(self): print ("In __enter__()") return "Foo" def __exit__(self, type, value, trace): print ("In __exit__()") def get_sample(): return Sample() with get_sample() as sample: print ("sample:", sample) #1. __enter__()方法被執(zhí)行 #2. __enter__()方法返回的值 - 這個例子中是"Foo",賦值給變量'sample' #3. 執(zhí)行代碼塊,打印變量"sample"的值為 "Foo" #4. __exit__()方法被調(diào)用
with真正強大之處是它可以處理異常。
可能你已經(jīng)注意到Sample類的__exit__
方法有三個參數(shù)- val, type 和 trace。
這些參數(shù)在異常處理中相當有用。
class Sample: def __enter__(self): return self def __exit__(self, type, value, trace): print ("type:", type) print ("value:",value) print ("trace:",trace) def do_something(self): bar = 1/0 return bar + 10 with Sample() as sample: sample.do_something()
實際上,在with后面的代碼塊拋出任何異常時,exit()方法被執(zhí)行。
正如例子所示,異常拋出時,與之關(guān)聯(lián)的type,value和stack trace傳給exit()方法,
因此拋出的ZeroDivisionError異常被打印出來了。
開發(fā)庫時,清理資源,關(guān)閉文件等等操作,都可以放在exit方法當中。
6.while, for…in…
均為循環(huán)語句,使用while時要注意成立條件,防止陷入死循環(huán)
for in 遍歷
7.assert
斷言,聲明其布爾值必須為真的判定,如果發(fā)生異常就說明表達示為假。
可以理解assert斷言語句為raise-if-not,用來測試表示式,其返回值為假,就會觸發(fā)異常。
assert 1==1 assert 1 == 2# 會報錯 Asserterror assert expression , 'arguments' #assert 表達式 [, 參數(shù)]用來解釋斷言并更好知道哪里錯了
8.pass
pass是空語句,為了保證程序結(jié)構(gòu)的完整性,
pass不做任何事情,一般用作 占位語句
當你編寫程序部分內(nèi)容還沒想好,可用pass語句占位
def no_idea(): pass #實例 for letter in 'python': if letter == 'h': pass print (u'這是pass塊') print (u'當前字母:', letter) print ('bye,bye')
9.yield
yield的意思是生產(chǎn),返回了一個生成器對象,每個生成器只能使用一次
def h(): print ('To be brave') yield 5 h()
看到某個函數(shù)包含了yield,這意味著這個函數(shù)已經(jīng)是一個Generator
調(diào)用h()函數(shù)后,print 語句并未執(zhí)行,執(zhí)行yield用.next()方法
def h(): print 'Wen Chuan' yield 5 print 'Fighting!' c = h() # >>>c.next()# 在IDE 中不用print c.next(),直接c.next()。 # next()語句將恢復(fù)Generator執(zhí)行,并直到下一個yield表達式處 # Wen Chuan # 5 # 當再次運行c.next()時由于沒有yield了報錯 # >>>c.next() # Fighting # Traceback (most recent call last): # File "/home/evergreen/Codes/yidld.py", line 11, in <module> # c.next() # StopIteration
一個帶有 yield的函數(shù)就是一個generation,他和普通函數(shù)不同,生成一個generator看起來像函數(shù)調(diào)用,但不會執(zhí)行任何函數(shù)代碼,直到對其調(diào)用.next()(在 for 循環(huán)中會自動調(diào)用 next())才開始執(zhí)行
雖然執(zhí)行流程仍按函數(shù)的流程執(zhí)行,但每執(zhí)行到一個 yield 語句就會中斷,并返回一個迭代值,下次執(zhí)行時從 yield 的下一個語句繼續(xù)執(zhí)行??雌饋砭秃孟褚粋€函數(shù)在正常執(zhí)行的過程中被 yield 中斷了數(shù)次,每次中斷都會通過 yield 返回當前的迭代值。
#使用isgeneratorfunction判斷一個函數(shù)是否是一個特殊的generator 函數(shù) from inspect import isgeneratorfunction isgeneratorfunction(h) # True
send() 與next()
def h(): print 'Wen Chuan', m = yield 5 # Fighting! print m d = yield 12 print 'We are together!' c = h() m = c.next() #m 獲取了yield 5 的參數(shù)值 5 d = c.send('Fighting!') #d 獲取了yield 12 的參數(shù)值12 print 'We will never forget the date', m, '.', d
send()可以傳遞yield表達式的值進去,而next()不能傳遞特定的值,只能傳遞None進去。
因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的
注意?。?!第一次調(diào)用時,請使用next()語句或是send(None),不能使用send發(fā)送一個非None的值,否則會出錯的,因為沒有yield語句來接收這個值
10.break 與 contiue
Python break語句用來終止循環(huán),用在while和for循環(huán)中?。≈苯犹?整個 循環(huán)
嵌套循環(huán),break語句將停止執(zhí)行最深層的循環(huán),并開始執(zhí)行下一行代碼
for letter in 'python':# 第一個例子 if letter == 'h' break print (u'當期字母:',letter) #輸出到'p''y''t' var= 10 # 第二個例子 while var > 0: print (u'當期字母:',var ) var = var -1 if var == 5 break #輸出到6 print ('bye')
break是跳出整個循環(huán),continue是跳出當前循環(huán)
#例1 for letter in 'pyhton': if letter == 'h': continue print (u'當前字母:', letter) #打印出 pyton #例2 var = 10 while var > 0: var -= 1 if var == 5: continue print (u'當前字母:', var) #結(jié)果 98764321
11.try except finally
try: <語句> #運行別的代碼 except <名字>: <語句> #如果在try部份引發(fā)了'name'異常 except <名字>,<數(shù)據(jù)>: <語句> #如果引發(fā)了'name'異常,獲得附加的數(shù)據(jù) else: <語句> #如果沒有異常發(fā)生
如果當try后的語句執(zhí)行時發(fā)生異常,python就跳回到try并執(zhí)行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發(fā)新的異常)。
如果在try后的語句里發(fā)生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結(jié)束程序,并打印缺省的出錯信息)。
如果在try子句執(zhí)行時沒有發(fā)生異常,python將執(zhí)行else語句后的語句(如果有else的話),然后控制流通過整個try語句。
try: try: raise NameError except TypeError: print ('as') except NameError: print ('e')
e,try后語句raise觸發(fā)異常,except沒有匹配字句,被拋到上層try匹配,print 'e'
try: 1/0 except Exception , e: print e #以上傳統(tǒng)的異常處理,加入!!!traceback后會打印出詳細的錯誤信息 import traceback try: 1/0 except Exception: traceback.print_exc()
try: <語句> finally: <語句> #退出try時總會執(zhí)行 raise try: 1 / 0 except Exception as e: '''異常的父類,可以捕獲所有的異常''' print "0不能被除" else: '''保護不拋出異常的代碼''' print "沒有異常" finally: print "最后總是要執(zhí)行我"
12.raise
觸發(fā)異常
raise [Exception[,args[,traceback]]]
語句中Exception是異常的類型(例如,NameError)參數(shù)是一個異常參數(shù)值。
該參數(shù)是可選的,如果不提供,異常的參數(shù)是”None”。
最后一個參數(shù)是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。
def mye( level ): if level < 1: raise Exception("Invalid level!", level)
raise 觸發(fā)異常后,后面的代碼就不會再執(zhí)行
try: s = None if s is None: print ("s 是空對象") raise NameError #如果引發(fā)NameError異常,后面的代碼將不能執(zhí)行 print (len(s) #這句不會執(zhí)行,但是后面的except還是會走到 except TypeError: print ("空對象沒有長度") #由于錯誤類型并不是TypeError,不執(zhí)行print try: s = None if s is None: print (u"s 是空對象") raise NameError('name is wrong','is') #如果引發(fā)NameError異常,后面的代碼將不能執(zhí)行 print (len(s)) #這句不會執(zhí)行,但是后面的except還是會走到 except NameError,argvment: print (u"空對象沒有長度",argvment) ''' 學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:489111204 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' s = None if s is None: raise NameError print ('is here?') #如果不使用try......except這種形式,那么直接拋出異常,不會執(zhí)行到這里 def mye( level ): if level < 1: raise Exception("Invalid level!", level) # 觸發(fā)異常后,后面的代碼就不會再執(zhí)行 try: mye(0) # 觸發(fā)異常 except "Invalid level!": print (1) else: print (2)
die函數(shù),打印錯誤信息
def die(error_massage): raise Exception(error_massage) a = 'wer' if a == None: print ('None') else: die()
13.exec–eval–execfile
exec 用來執(zhí)行儲存在字符串或文件中的Python語句
exec是一條語句將字符串str當成有效的python代碼來執(zhí)行
eval與execfile是pytho內(nèi)置函數(shù)
eval(str[globals[locals]])函數(shù)將字符串str當成有效的python表達式來求值,并提供返回計算值
exec 'print"hello world"' exec 'a=100' # 執(zhí)行后 a = 100 print (a) #100 eval('3+5')# 8 b = eval('5+6')#eval 返回計算值 print (b + 1) #12
execfile(filename)函數(shù)可以用來執(zhí)行文件
execfile(r'F:\learn\ex1.py') # 若你位于文件所在目錄直接執(zhí)行 execfile(r'ex1.py')
from os.path import exists
exists(file)將文件名字符串作為參數(shù),如果文件存在返回True,否則返回False
14.return
return 是函數(shù)返回值
def fun(): print ('asd') # fun() 函數(shù)沒有顯示return,默認返回None def fan(a): return a #有返回值
15.lambda—filter—map—reduce—
lambda 只是一個表達式,定義了一個匿名函數(shù),起到函數(shù)速寫的作用
由于lambda只是一個表達式,它可以直接作為python 列表或python 字典的成員,比如
info = [lambda a:a**3 , lambda b:b**3]
g = lambda x:x+1 g(1) #2 等價于 lambda x:x+1(1) g(3) #4 #其中 x 為入口參數(shù),x+1 為函數(shù)體 #用的函數(shù)來同樣表示 def g(x): return x+1 #lambda 也可以用在函數(shù)中 def action(x): return lambda y:x+y a = action(3)# a是action函數(shù)的返回值, a(22) # 24 ,a(22) ,調(diào)用了action返回的lambda表達式 # 上面函數(shù)也可直接寫成下式 b = lambda x:lambda y:x+y a = b(3) a(2) # 也可直接 (b(3))(2) # lambda 可以一個、多個參數(shù) g = lambda x:x*2 #one print (g(3)) m = lambda x,y,z: (x-y)*z # mutiple print (m(3,1,2)) #lambda 并不會帶來程序運行效率的提高,只會使代碼更簡潔。 #如果可以使用for...in...if來完成的,堅決不用lambda。 #如果使用lambda,lambda內(nèi)不要包含循環(huán),如果有,我寧愿定義函數(shù)來完成, #使代碼獲得可重用性和更好的可讀性。 # lambda 是為了減少單行函數(shù)的定義而存在的。 # --filter(function or None, sequence) -> list, tuple, or string # function是一個謂詞函數(shù),接受一個參數(shù),返回布爾值True或False。 # filter函數(shù)會對序列參數(shù)sequence中的每個元素調(diào)用function函數(shù), # 最后返回執(zhí)行結(jié)果為True的 # 返回值的類型和參數(shù)sequence(list, tuple, string)的類型相同 foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] print (filter(lambda x: x % 3 == 0, foo))# filter 是 過濾/篩選 函數(shù) print([x for x in foo if x % 3==0]) #[18, 9, 24, 12, 27] 篩選foo中能被3整除的
map(function, sequence)
對sequence中的item 依次執(zhí)行 function,將執(zhí)行結(jié)果組成list返回
單個參數(shù)
str = ['a', 'b','c', 'd'] def fun2(s): return s + ".txt" ret = map(fun2, str) print (ret) # ['a.txt', 'b.txt', 'c.txt', 'd.txt']
多個參數(shù),要求函數(shù)接受多個參數(shù)
def add(x,y): return x+y print (map(add,range(5),range(5))) #[0,2,4,6,8] foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] print (map(lambda x: x * 2 + 10, foo)) #[14, 46, 28, 54, 44, 58, 26, 34, 64]
reduce(function, sequence, starting_value)
對sequence中的item順序迭代調(diào)用function,如果有starting_value,
還可以作為初始值調(diào)用,例如可以用來對List求和
def add1(x,y): return x+y print reduce(add1,range(1,100)) # 4950 注:1+2+...+99 print reduce(add1,range(1,100),20) # 4970 注:1+2+...+99+20,20為初始值
到此這篇關(guān)于Python中有哪些關(guān)鍵字及關(guān)鍵字的用法的文章就介紹到這了,更多相關(guān)python關(guān)鍵字用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用mysqldb連接數(shù)據(jù)庫操作方法示例詳解
這篇文章主要介紹了python mysqldb使用方法,大家參考使用2013-12-12