国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

2015/9/5Python基礎(9):條件和循環

2019-11-14 17:01:35
字體:
來源:轉載
供稿:網友

條件語句
Python中的if語句如下:

if exPRession:  expr_true_suite

其中expression可以用布爾操作符and, or 和 not實現多重判斷條件。
如果一個復合語句的的代碼塊僅僅包含一行代碼,那么它可以和前面的語句寫在同一行:

if expression: dosomething

但實際上,為了可讀性,我們盡量不這么做
else語句的使用:

if expression:  expr_true_suiteelse:  expr_false_suite

Python使用縮進強制使代碼對齊,可以避免制造一些類型的懸掛else問題。但同樣要讓我們非常小心代碼的對齊問題,否則代碼很可能不能使用。
elif(else—if)語句
Python沒有switch/case語句,所以用if—elif來替代它的使用,并不會降低太多的閱讀性

if user.cmd == 'create':  action = "create item"elif user.cmd == 'delete':  action = 'delete item'elif user.cmd == 'update':  action = 'update item'else:  action = 'invalid choice... try again!'

上面的語句也可以用序列改寫:

if user.cmd in ('create', 'delete', 'update'):    action = '%s item' % user.cmdelse:    action = 'invalid choice... try again!'

再或者是字典方案

msgs = {'create': 'create item','delete': 'delete item','update': 'update item'}default = 'invalid choice... try again!'action = msgs.get(user.cmd, default)

 


條件表達式(即“三元操作符”)
也就是C里的C?X:Y
Python里使用了 X if C else Y:

>>> x, y = 4, 3>>> smaller = x if x < y else y>>> smaller3

 

while語句
while循環的一般語法如下:

while expression:  suite_to_repeat

while循環一般被用作計數循環或者無限循環:

>>> count = 0>>> while (count < 9):    print 'the index is:', count    count += 1the index is: 0the index is: 1the index is: 2the index is: 3the index is: 4the index is: 5the index is: 6the index is: 7the index is: 8>>>while True:    message = raw_input("please input :")    if message.lower() == 'q':    break

 

for 語句
Python的for非常強大,它可以遍歷序列成員,可用在列表解析和生成器表達式,會自動地調用迭代器的 next()方法,捕獲StopIteration異常并結束循環(這都是在內部發生的),Python的for循環不同于傳統語言的for循環,類似于shell的foreach

一般語法
for循環訪問一個可迭代對象(如序列或迭代器)中所有元素,并在所有條目都處理后結束循環

for iter_var in iterable:  suit_to_repeat

for循環迭代不同的序列對象,有如下例子:

>>> for eachLetter in 'Names': #迭代字符串    print 'current letter:',eachLettercurrent letter: Ncurrent letter: acurrent letter: mcurrent letter: ecurrent letter: s>>> nameList = ['Amy', 'Bob', 'Henry']>>> for eachName in nameList: #迭代序列項    print eachName, 'Lim'Amy LimBob LimHenry Lim>>> for nameIndex in range(len(nameList)): #不迭代元素,迭代索引    print "Liu,", nameList[nameIndex]Liu, AmyLiu, BobLiu, Henry>>> nameList = ['Donn', 'Shirley', 'Ben', 'Jane']>>> for i, eachone in enumerate(nameList): #用項和索引迭代    print '%d %s' %(i+1, eachone)1 Donn2 Shirley3 Ben4 Jane

 

for循環訪問迭代器和訪問序列的方法差不多,只是for語句會做一些額外的事而迭代器不代表循環條目的集合。
迭代器對象有一個next()方法,調用后返回下一個條目。迭代完后引發一個StopIteration異常告訴程序循環結束。for在內部直接調用next()并捕獲異常。

range()內建函數在之前的博文Python基本使用(2)里已經詳細說明。這里不贅述

xrange()
xrange()類似range(),當一個列表范圍很大時,xrange()更為合適,因為它不會在內存里創建列表的完整拷貝,它只能用于for循環中,在for循環外沒有任何意義。使用時性能遠高于range()。

sorted(), reversed(), enumerate(), zip()

>>> for album in sorted(albums):    print album,Freud Gaudi Poe Poe2>>> for album in reversed(albums):    print album,Poe2 Freud Gaudi Poe>>> for i, album in enumerate(albums):    print i, album0 Poe1 Gaudi2 Freud3 Poe2>>> for album, yr in zip(albums, years):    print yr, album1976 Poe1987 Gaudi1990 Freud2003 Poe2

 

break語句和continue語句

break,continue和C中的break,continue十分相似。
pass語句
因為Python沒有傳統的括號,所以用pass表示此代碼塊什么都不做。

另外,循環語句也可以接else語句
表示循環結束后執行此代碼塊。

 

迭代器和iter()函數
迭代器為類序列對象提供了一個類序列的接口。序列可以利用索引從0開始一直迭代到序列的最后一個條目,用計數的方法迭代序列是很簡單的。Python的迭代無縫支持序列對象,還允許非序列類型,包括用戶定義的對象。
迭代器用起來很靈巧,可以迭代不是序列但表現出序列行為的對象,例如字典的key,一個文件的行等等。Python在使用迭代時分不出是迭代器還是序列,讓人不用去關注這些,因為Python讓它像一個序列那樣操作。
使用迭代器:
序列:

>>> myTuple = (123, 'xyz', 45.67)>>> i = iter(myTuple)>>> i.next()123>>> i.next()'xyz'>>> i.next()45.67>>> i.next()Traceback (most recent call last):File "<pyshell#5>", line 1, in <module>i.next()StopIteration

 

如果這是一個實際應用程序,那么我們需要把代碼放在一個try—except 塊中。序列現在回自動地產生它們自己的迭代器,所以一個for循環:

for i in seq:  do_something_to(i)

 

實際上是這樣工作:

fetch = iter(seq)while True:  try:  i = fetch.next()  except StopIteration:  break  do_something_to(i)

 

字典:字典的迭代器會遍歷它的鍵(keys)

>>> legends = {('Poe', 'author'):(1809, 1849, 1976),}>>> legends = {('Poe', 'author'):(1809, 1849, 1976),('Gaudi','architect'):(1852, 1906, 1987),('Freud', 'psychoanalyst'):(1856, 1939, 1990)}>>> for eachLegend in legends:    print 'Name: %s/tOccupation: %s' % eachLegend    print 'Birth: %s/tDeath: %s/tAlbum:%s/n' % legends[eachLegend]Name: Poe    Occupation: authorBirth: 1809    Death: 1849    Album:1976Name: Gaudi    Occupation: architectBirth: 1852    Death: 1906    Album:1987Name: Freud    Occupation: psychoanalystBirth: 1856    Death: 1939    Album:1990

 

另外,Python還引進了三個新的內建字典方法來定義迭代:myDict.iterkeys()(通過keys迭代),myDict.itervalues()(通過values迭代)以及myDict.iteritems()(通過key/value對來迭代)

文件
文件對象生成的迭代器會自動調用readline()方法,這樣,循環就可以訪問文本文件的所有行。 程序員可以用for eachLine in myFile 替換 for eachLine in myFile.readlines():

>>> myFile = open('config-win.txt')>>> for eachLine in myFile:...   print eachLine, # comma suppresses extra /n...[EditorWindow]font-name: courier newfont-size: 10>>> myFile.close()

 

可變對象和迭代器
迭代可變對象時修改它們不是一個好主意,除了列表外其他序列類型不可變,所以危險就發生在這里。序列的迭代器只記錄你當前到達第多少個元素,如果你迭代時改變了元素,更新會立即反映到你所迭代的條目上。在迭代字典的key時,絕對不能改變這個字典(因為字典是無序的)。使用字典的keys()方法是可以的,因為keys()返回一個獨立于字典的列表,而迭代器與實際對象綁在一起,它將不會繼續執行下去:

>>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd':4}>>> for eachKey in myDict:    print eachKey, myDict[eachKey]    del myDict[eachKey]a 1Traceback (most recent call last):File "<pyshell#4>", line 1, in <module>for eachKey in myDict:RuntimeError: dictionary changed size during iteration

 

創建迭代器
對一個對象調用iter()就可以得到它的迭代器:

iter(obj)iter(func, sentinel)

如果傳遞一個參數給 iter() ,它會檢查你傳遞的是不是一個序列,如果是,那么很簡單:根據索引從0一直迭代到序列結束。
如果傳遞兩個參數給iter(),它會重復地調用func,直到迭代器的下個值等于sentinel
另一個創建迭代器的方法是類,以后我將在后面的章節詳細學習。

列表解析
列表解析是一項非常有用,簡單,而且靈活的工具,可以用來動態地創建列表。
列表解析的語法:

[expr for iter_var in iterable]

核心是for循環,迭代iterable對象的所有條目。前邊的expr應用于序列的每個成員,最后的結果值是該表達式產生的列表。迭代變量并不需要是表達式的一部分。
lambda函數表達式:

>>> map(lambda x: x ** 2, range(6)) #這是lambda函數表達式[0, 1, 4, 9, 16, 25]>>> [x ** 2 for x in range(6)] #這是列表解析[0, 1, 4, 9, 16, 25]

列表解析還有結合if的拓展版本

[expr for iter_var in iterable if cond_expr]

這個語法在迭代時會過濾/捕獲滿足條件表達式cond_expr的序列成員
以下例子是挑出序列中的奇數:

>>> seq = [11, 12, 16, 13, 10, 9, 9, 10, 8]>>> filter(lambda x: x % 2, seq) #用filter和lambda實現[11, 13, 9, 9]>>> [x for x in seq if x % 2] #用列表解析實現[11, 13, 9, 9]

 

生成器表達式
生成器表達式是列表解析的一個擴展,語法如下:

(expr for iter_var in iterable if cond_expr)

語法和列表解析基本相同,不過它并不真正創建數字列表,而是返回一個生成器,這個生成器在計算出一個條目后,把這個條目“產生”(yield)出來。生成器表達式用了“延遲計算”,所以它在使用內存上更有效。將在以后的學習中詳細地說明這一點


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 隆尧县| 新泰市| 集贤县| 普兰店市| 珲春市| 罗江县| 称多县| 岳普湖县| 安陆市| 碌曲县| 宣武区| 信丰县| 翁牛特旗| 寿阳县| 昌都县| 渝中区| 孟津县| 澜沧| 扶绥县| 泰兴市| 辉南县| 马边| 巴彦县| 竹山县| 宿松县| 章丘市| 开阳县| 永德县| 玉林市| 砚山县| 十堰市| 东丰县| 股票| 临夏县| 驻马店市| 徐州市| 潢川县| 团风县| 修武县| 工布江达县| 新源县|