標籤:關閉 運行 引用 print assert 預設 列印 傳回值 exec
-Python常用的關鍵字 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 為邏輯關係用語,Python具有短路邏輯,False and 返回 False 不執行後面的語句, True or 直接返回True,不執行後面的語句 -2.del 刪除變數if __name__==‘__main__‘: a=1 # 對象 1 被 變數a引用,對象1的引用計數器為1 b=a # 對象1 被變數b引用,對象1的引用計數器加1 c=a #1對象1 被變數c引用,對象1的引用計數器加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]# 並不包含數字1,2,3所以if __name__==‘__main__‘: li=[1,2,3,4,5] #列表本身不包含資料1,2,3,4,5,而是包含變數:li[0] li[1] li[2] li[3] li[4] first=li[0] #拷貝列表,也不會有資料對象的複製,而是建立新的變數引用 del li[0] # 列表本身包含的是變數,del 刪除的是變數。 print li #輸出[2, 3, 4, 5] print(first) #輸出 13.from from引用模組時會用到,例:from sys import argv# 從sys中匯入argvfrom sys import *# 將sys中所有東西都匯入import sys # 匯入sys,當需要sys中內容時,需sys.argv而from sys import *#不用每次都重複輸入‘sys.‘4.golbal golbal為全域變數,但當單個函數中出現同一變數名時,在單個函數中為局部變數golbal qq = 66print "q=", q #q = 66def function(): q = 3 print ‘q =‘,qfunction() # q = 3print ‘q =‘,q # q = 665.with with被用來處理異常# 不用with 處理檔案異常file = open("/tmp/foo.txt")try: data = file.read()finally: file.close()# 用withwith open("/tmp/foo.txt") as file: data = file.read()緊跟with後面的語句被求值後,返回對象的enter()方法被調用,這個方法的傳回值將被賦值給as後面的變數,此處為file 當with後面的代碼塊全部被執行完後,將調用前面返回對象的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__()方法被執行#2. __enter__()方法返回的值 - 這個例子中是"Foo",賦值給變數‘sample‘#3. 執行代碼塊,列印變數"sample"的值為 "Foo"#4. __exit__()方法被調用#with真正強大之處是它可以處理異常。#可能你已經注意到Sample類的__exit__方法有三個參數- val, type 和 trace。 #這些參數在異常處理中相當有用。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 + 10with Sample() as sample: sample.do_something()實際上,在with後面的代碼塊拋出任何異常時,exit()方法被執行。 正如例子所示,異常拋出時,與之關聯的type,value和stack trace傳給exit()方法, 因此拋出的ZeroDivisionError異常被列印出來了。 開發庫時,清理資源,關閉檔案等等操作,都可以放在exit方法當中。-6.while, for…in… 均為迴圈語句,使用while時要注意成立條件,防止陷入死迴圈 for in 遍曆-7.assert 斷言,聲明其布爾值必須為真的判定,如果發生異常就說明表達示為假。 可以理解assertAssert 陳述式為raise-if-not,用來測試表示式,其傳回值為假,就會觸發異常。assert 1==1assert 1 == 2# 會報錯 Asserterrorassert expression , ‘arguments‘#assert 運算式 [, 參數]用來解釋斷言並更好知道哪裡錯了8.pass pass是空語句,為了保證程式結構的完整性, pass不做任何事情,一般用作 佔位語句 當你編寫程式部分內容還沒想好,可用pass語句佔位def no_idea(): pass#執行個體for letter in ‘python‘: if letter == ‘h‘: pass print u‘這是pass塊‘ print u‘當前字母:‘, letterprint ‘bye,bye‘ -9.yield yield的意思是生產,返回了一個產生器對象,每個產生器只能使用一次def h(): print ‘To be brave‘ yield 5h() #看到某個函數包含了yield,這意味著這個函數已經是一個Generator#調用h()函數後,print 語句並未執行,執行yield用.next()方法def h(): print ‘Wen Chuan‘ yield 5 print ‘Fighting!‘c = h()# >>>c.next()# 在IDE 中不用print c.next(),直接c.next()。# next()語句將恢複Generator執行,並直到下一個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的函數就是一個generation,他和普通函數不同,產生一個generator看起來像函數調用,但不會執行任何函數代碼,直到對其調用.next()(在 for 迴圈中會自動調用 next())才開始執行 雖然執行流程仍按函數的流程執行,但每執行到一個 yield 語句就會中斷,並返回一個迭代值,下次執行時從 yield 的下一個語句繼續執行。看起來就好像一個函數在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的迭代值。#使用isgeneratorfunction判斷一個函數是否是一個特殊的generator 函數from inspect import isgeneratorfunction isgeneratorfunction(h) # Truesend() 與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 的參數值 5d = c.send(‘Fighting!‘) #d 擷取了yield 12 的參數值12print ‘We will never forget the date‘, m, ‘.‘, d#send()可以傳遞yield運算式的值進去,而next()不能傳遞特定的值,只能傳遞None進去。#因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的#注意!!!第一次調用時,請使用next()語句或是send(None),不能使用send發送一個非None的值,否則會出錯的,因為沒有yield語句來接收這個值-10.break 與 contiue Python break語句用來終止迴圈,用在while和for迴圈中!!直接跳出 整個 迴圈 嵌套迴圈,break語句將停止執行最深層的迴圈,並開始執行下一行代碼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是跳出整個迴圈,continue是跳出當前迴圈#例1for letter in ‘pyhton‘: if letter == ‘h‘: continue print u‘當前字母:‘, letter#列印出 pyton#例2var = 10while var > 0: var -= 1 if var == 5: continue print u‘當前字母:‘, var#結果 98764321-11.try except finallytry:<語句> #運行別的代碼except <名字>:<語句> #如果在try部份引發了‘name‘異常except <名字>,<資料>:<語句> #如果引發了‘name‘異常,獲得附加的資料else:<語句> #如果沒有異常發生如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流程就通過整個try語句(除非在處理異常時又引發新的異常)。 如果在try後的語句裡發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程式的最上層(這樣將結束程式,並列印預設的出錯資訊)。 如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流程通過整個try語句。try: try: raise NameError except TypeError: print ‘as‘except NameError: print ‘e‘# e,try後語句raise觸發異常,except沒有匹配字句,被拋到上層try匹配,print ‘e‘try: 1/0except Exception , e: print e #以上傳統的異常處理,加入!!!traceback後會列印出詳細的錯誤資訊import tracebacktry: 1/0except Exception: traceback.print_exc()<語句>finally:<語句> #退出try時總會執行raisetry: 1 / 0except Exception as e: ‘‘‘異常的父類,可以捕獲所有的異常‘‘‘ print "0不能被除"else: ‘‘‘保護不拋出異常的代碼‘‘‘ print "沒有異常"finally: print "最後總是要執行我"-12.raise 觸發異常 raise [Exception[,args[,traceback]]] 語句中Exception是異常的類型(例如,NameError)參數是一個異常參數值。 該參數是可選的,如果不提供,異常的參數是”None”。 最後一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。def mye( level ): if level < 1: raise Exception("Invalid level!", level)raise 觸發異常後,後面的代碼就不會再執行try: s = None if s is None: print "s 是Null 物件" raise NameError #如果引發NameError異常,後面的代碼將不能執行 print len(s) #這句不會執行,但是後面的except還是會走到except TypeError: print "Null 物件沒有長度" #由於錯誤類型並不是TypeError,不執行printtry: s = None if s is None: print u"s 是Null 物件" raise NameError(‘name is wrong‘,‘is‘) #如果引發NameError異常,後面的代碼將不能執行 print len(s) #這句不會執行,但是後面的except還是會走到except NameError,argvment: print u"Null 物件沒有長度",argvments = Noneif s is None: raise NameError print ‘is here?‘ #如果不使用try......except這種形式,那麼直接拋出異常,不會執行到這裡def mye( level ): if level < 1: raise Exception("Invalid level!", level) # 觸發異常後,後面的代碼就不會再執行try: mye(0) # 觸發異常except "Invalid level!": print 1else: print 2die函數,列印錯誤資訊def die(error_massage): raise Exception(error_massage)a = ‘wer‘if a == None: print ‘None‘else: die()-13.exec–eval–execfile exec 用來執行儲存在字串或檔案中的Python語句 exec是一條語句將字串str當成有效python代碼來執行 eval與execfile是pytho內建函數 eval(str[globals[locals]])函數將字串str當成有效python運算式來求值,並提供返回計算值exec ‘print"hello world"‘exec ‘a=100‘# 執行後 a = 100print a #100eval(‘3+5‘)# 8b = eval(‘5+6‘)#eval 返回計算值print b + 1 #12execfile(filename)函數可以用來執行檔案execfile(r‘F:\learn\ex1.py‘)# 若你位於檔案所在目錄直接執行execfile(r‘ex1.py‘)from os.path import exists exists(file)將檔案名稱字串作為參數,如果檔案存在返回True,否則返回False-14.return return 是函數傳回值def fun(): print ‘asd‘# fun() 函數沒有顯示return,預設返回Nonedef fan(a): return a#有傳回值-15.lambda—filter—map—reduce— lambda 只是一個運算式,定義了一個匿名函數,起到函數速寫的作用 由於lambda只是一個運算式,它可以直接作為python 列表或python 字典的成員,比如info = [lambda a:a**3 , lambda b:b**3]g = lambda x:x+1g(1) #2 等價於 lambda x:x+1(1)g(3) #4#其中 x 為入口參數,x+1 為函數體#用的函數來同樣表示def g(x): return x+1#lambda 也可以用在函數中def action(x): return lambda y:x+ya = action(3)# a是action函數的傳回值,a(22) # 24 ,a(22) ,調用了action返回的lambda運算式# 上面函數也可直接寫成下式b = lambda x:lambda y:x+ya = b(3)a(2) # 也可直接 (b(3))(2)# lambda 可以一個、多個參數g = lambda x:x*2 #oneprint g(3)m = lambda x,y,z: (x-y)*z # mutipleprint m(3,1,2)#lambda 並不會帶來程式運行效率的提高,只會使代碼更簡潔。#如果可以使用for...in...if來完成的,堅決不用lambda。#如果使用lambda,lambda內不要包含迴圈,如果有,我寧願定義函數來完成,#使代碼獲得可重用性和更好的可讀性。# lambda 是為了減少單行函數的定義而存在的。# --filter(function or None, sequence) -> list, tuple, or string# function是一個謂詞函數,接受一個參數,返回布爾值True或False。# filter函數會對序列參數sequence中的每個元素調用function函數,# 最後返回執行結果為True的# 傳回值的類型和參數sequence(list, tuple, string)的類型相同foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]print filter(lambda x: x % 3 == 0, foo)# filter 是 過濾/篩選 函數print[x for x in foo if x % 3==0] #[18, 9, 24, 12, 27] 篩選foo中能被3整除的map(function, sequence) 對sequence中的item 依次執行 function,將執行結果組成list返回 單個參數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‘]多個參數,要求函數接受多個參數def add(x,y): return x+yprint 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順序迭代調用function,如果有starting_value, 還可以作為初始值調用,例如可以用來對List求和def add1(x,y): return x+yprint reduce(add1,range(1,100))# 4950 註:1+2+...+99print reduce(add1,range(1,100),20)# 4970 註:1+2+...+99+20,20為初始值
Python關鍵字及其用法