#爲避免前述示例所示的繁瑣代碼,能夠像下面這樣做很有幫助:#打印1~100之間的所有整數
x =1while x <=100:print(x)
x +=1#還可以使用循環來確保用戶輸入名字,如下所示:
name =''whilenot name:
name =input('Please enter your name: ')print('Hello, {}!'.format(name))
2. for循環
'''
while 語句非常靈活,可用於在條件爲真時反覆執行代碼塊。這在通常情況下很好,但有時候你可能想根據需要進行定製。
一種這樣的需求是爲序列(或其他可迭代對象)中每個元素執行代碼塊。
'''#訪問序列元素方式一:
words =['this','is','an','ex','parrot']for word in words:print(word)#訪問序列元素方式二:
numbers =[0,1,2,3,4,5,6,7,8,9]for number in numbers:print(number)#鑑於迭代(也就是遍歷)特定範圍內的數是一種常見的任務,Python提供了一個創建範圍的內置函數。>>>range(0,10)range(0,10)>>>list(range(0,10))[0,1,2,3,4,5,6,7,8,9]'''
範圍類似於切片。它們包含起始位置(這裏爲0),但不包含結束位置(這裏爲10)。在很多情況下,你都希望範圍的起始位置
爲0。實際上,如果只提供了一個位置,將把這個位置視爲結束位置,並假定起始位置爲0。
'''>>>range(10)range(0,10)#下面的程序打印數1~100:for number inrange(1,101):print(number)#注意:相比前面使用的 while 循環,這些代碼要緊湊得多。
3. 迭代字典
#要遍歷字典的所有關鍵字,可像遍歷序列那樣使用普通的 for 語句。
d ={'x':1,'y':2,'z':3}for key in d:print(key,'corresponds to', d[key])'''
也可使用 keys 等字典方法來獲取所有的鍵。如果只對值感興趣,可使用 d.values 。你可能還記得, d.items 以元組的方式
返回鍵值對。 for 循環的優點之一是,可在其中使用序列解包。
'''for key, value in d.items():print(key,'corresponds to', value)
4. 迭代工具
'''
1. 並行迭代
同時迭代倆序列:name和age,如果要打印名字和對應的年齡,可以像下面這樣做:
'''
names =['anne','beth','george','damon']
ages =[12,45,32,102]for i inrange(len(names)):print(names[i],'is', ages[i],'years old')'''
i 是用作循環索引的變量的標準名稱。一個很有用的並行迭代工具是內置函數 zip ,它將兩個序列“縫合”起來,並返回一個由元組
組成的序列。返回值是一個適合迭代的對象,要查看其內容,可使用 list 將其轉換爲列表。
'''>>>list(zip(names, ages))[('anne',12),('beth',45),('george',32),('damon',102)]#“縫合”後,可在循環中將元組解包。for name, age inzip(names, ages):print(name,'is', age,'years old')#函數 zip 可用於“縫合”任意數量的序列。需要指出的是,當序列的長度不同時,函數 zip 將在最短的序列用完後停止“縫合”。>>>list(zip(range(5),range(100000000)))[(0,0),(1,1),(2,2),(3,3),(4,4)]'''
2. 迭代時獲取索引
在有些情況下,你需要在迭代對象序列的同時獲取當前對象的索引。例如,你可能想替換一個字符串列表中所有包含子串 'xxx'
的字符串。當然,完成這種任務的方法有很多,但這裏假設你要像下面這樣做:
'''for string in strings:if'xxx'in string:
index = strings.index(string)# 在字符串列表中查找字符串
strings[index]='[censored]''''
這可行,但替換前的搜索好像沒有必要。另外,如果沒有替換,搜索返回的索引可能不對(即返回的是該字符串首次出現處的
索引)。下面是一種更佳的解決方案:
'''
index =0for string in strings:if'xxx'in string:
strings[index]='[censored]'
index +=1#這個解決方案雖然可以接受,但看起來也有點笨拙。另一種解決方案是使用內置函數enumerate 。#enumerate函數讓你能夠迭代索引值對,其中的索引是自動提供的。for index, string inenumerate(strings):if'xxx'in string:
strings[index]='[censored]''''
3. 反向迭代和排序後再迭代
來看另外兩個很有用的函數: reversed 和 sorted 。它們類似於列表方法 reverse 和 sort(sorted接受的參數也與
sort 類似),但可用於任何序列或可迭代的對象,且不就地修改對象,而是返回反轉和排序後的版本。
'''>>>sorted([4,3,6,8,3])[3,3,4,6,8]>>>sorted('Hello, world!')[' ','!',',','H','d','e','l','l','l','o','o','r','w']>>>list(reversed('Hello, world!'))['!','d','l','r','o','w',' ',',','o','l','l','e','H']>>>''.join(reversed('Hello, world!'))'!dlrow ,olleH''''
請注意, sorted 返回一個列表,而 reversed 像 zip 那樣返回一個更神祕的可迭代對象。你無需關心這到底意味着什麼,
只管在 for 循環或 join 等方法中使用它,不會有任何問題。只是你不能對它執行索引或切片操作,也不能直接對它調用列表的
方法。要執行這些操作,可先使用 list 對返回的對象進行轉換。
'''