Python(14)--迴圈
while迴圈格式:
# 語法格式 while 條件: 滿足條件執行的迴圈體 # 列印1到9 x = 1 while x <10: print(x) x += 1 # 接收使用者輸入姓名,不能為空 name = "" while not name or name.isspace(): name = input("name:") print("hello, {}".format(name))
for迴圈:
while語句可用於在條件為真的情況下反覆執行程式碼塊,但是有需要特定的情況,比如遍歷可迭代物件(序列就是可迭代物件),需要使用for迴圈語句
ages = [12, 32, 43, 35, 46] for age in ages: print(age) words = ["is", "is", "name"] for word in words: print(word)
range(start, stop[, step]):
函式range返回的是一個可迭代物件
start: 計數從 start 開始。預設是從 0 開始。例如range(5)等價於range(0, 5);
stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5
step:步長,預設為1。例如:range(0, 5) 等價於 range(0, 5, 1)
# 列印0-5 for i in range(6): print(i) # 列印10以內奇數:指定步長,每兩步取一次值 for i in range(1, 10, 2): print(i) # 列印99乘法表: for i in range(1, 10): for j in range(1, i+1): print("%s*%s=%s" %(j, i, j*i), end="\t") print()
注:只要能使用for迴圈,就不要使用while迴圈
迭代字典:
遍歷字典,可以像遍歷序列那樣使用for語句
d = {"x" : 1, "y" : 3, "z": 6} for key in d: print(key, d[key]) # x 1 # y 3 # z 6
也可以使用d.keys獲取所有鍵
d.values獲取所有值
d.items以元組方式返回鍵值對
d = {"x" : 1, "y" : 3, "z": 6} print(d.keys()) print(d.values()) print(d.items()) # dict_keys(['x', 'y', 'z']) # dict_values([1, 3, 6]) # dict_items([('x', 1), ('y', 3), ('z', 6)])
for迴圈的一個優點是可以在其中使用序列解包
d = {"x" : 1, "y" : 3, "z": 6} for key, value in d.items(): print(key, value) # x 1 # y 3 # z 6
並行迭代:
可能有時候會想要同時迭代兩個序列
# 列印名字和對應的年齡, i用作迴圈索引的變數 names = ["an", "yuan", "li"] ages = [12, 34, 25] for i in range(len(names)): print(names[i], ages[i])
zip函式:內建函式,將兩個序列縫合,返回一個元組組成的序列,返回的是一個可迭代物件,可以使用list轉換為列表
names = ["an", "yuan", "li"] ages = [12, 34, 25] print(list(zip(names, ages))) # [('an', 12), ('yuan', 34), ('li', 25)] # 縫合後就可以迴圈中解包 for name, age in zip(names, ages): print(name, age) # an 12 # yuan 34 # li 25 # zip可以縫合任意數量的序列,當序列長度不同時,將終在最短的序列用完時停止 names = ["an", "yuan", "li"] a = [333, 444, 555] ages = [12, 34, 25, 34, 56, 66] print(list(zip(names, ages, a))) # [('an', 12, 333), ('yuan', 34, 444), ('li', 25, 555)]
迭代時獲取索引:
在迭代序列物件的同時要獲取索引
函式:enumerate
s = "banana" for string in s: if "a" in string: index = s.index("a") print(index) # 如果自讀沒有重複,那麼可行,但是有重複的,返回的是該字串中首次出現的字元索引,除非將字元替換,才會查詢到後面字元的索引 for index, string in enumerate(s): if "a" in s: print(index, string) # 0 b # 1 a # 2 n # 3 a # 4 n # 5 a #使用內建函式enumerate,該函式能夠迭代索引和值,索引是自動提供的
反向迭代和排序後迭代:
函式:reversed和sorted,類似列表方法reverse和sort,用於任何序列和可迭代物件,不就地修改物件,返回反轉後排序後的版本
s = [1, 5, 3, 8, 2,6] print(sorted(s)) # [1, 2, 3, 5, 6, 8] s1 = "hi, world" print(sorted(s1)) # [' ', ',', 'd', 'h', 'i', 'l', 'o', 'r', 'w'] print(list(reversed(s1))) # ['d', 'l', 'r', 'o', 'w', ' ', ',', 'i', 'h'] print("".join(reversed(s1))) # dlrow ,ih
注:sorted返回一個列表,而reversed有點像zip
要按字母表排序,可先轉換為小寫。為此,可將sort或sorted的key引數設定為str.lower。例如,sorted("aBc",key=str.lower)返回['a','B','c']。
跳出迴圈:
break
用於跳出迴圈,當執行到break時,會跳出整個迴圈,繼續往下執行
for i in range(6): if i == 3: break print(i) # 0 # 1 # 2
continue
用於跳出當前迴圈,執行下一次迴圈
for i in range(6): if i == 3: continue print(i) # 0 # 1 # 2 # 4 # 5
死迴圈和迴圈中使用else:
使用標誌位tag來控制迴圈:
登入成功,接收使用者命令,直到輸入“q”退出
tag = True while tag: name = input("name:") passwd = input("password:") if name == "yuan" and passwd == "123456": print("login ok!") while tag: cmd = input(">>>:") if cmd == "q": tag = False print("your enter is %s" %cmd) else: print("login error!")