因?yàn)榈骱蜕善骰臼腔ネǖ?,因此有些知識(shí)點(diǎn)需要綜合在一起
反向迭代,應(yīng)該也是常有的需求了,比如從一開始迭代的例子里,有個(gè)輸出 list 的元素,從 1 到 5 的
list1 = [1,2,3,4,5]
for num1 in list1 :
print ( num1 , end = ' ' )
那么我們從 5 到 1 呢?這也很簡(jiǎn)單, Python 中有內(nèi)置的函數(shù) reversed()
list1 = [1,2,3,4,5]
for num1 in reversed(list1) :
print ( num1 , end = ' ' )
方向迭代很簡(jiǎn)單,可是要注意一點(diǎn)就是:反向迭代僅僅當(dāng)對(duì)象的大小可預(yù)先確定或者對(duì)象實(shí)現(xiàn)了 __reversed__() 的特殊方法時(shí)才能生效。 如果兩者都不符合,那你必須先將對(duì)象轉(zhuǎn)換為一個(gè)列表才行
其實(shí)很多時(shí)候我們可以通過在自定義類上實(shí)現(xiàn) __reversed__() 方法來實(shí)現(xiàn)反向迭代。不過有些知識(shí)點(diǎn)在之前的篇節(jié)中還沒有提到,不過可以相應(yīng)的看下,有編程基礎(chǔ)的,學(xué)完上面的知識(shí)點(diǎn)應(yīng)該也能理解的。
# -*- coding: UTF-8 -*-
class Countdown:
def __init__(self, start):
self.start = start
def __iter__(self):
# Forward iterator
n = self.start
while n > 0:
yield n
n -= 1
def __reversed__(self):
# Reverse iterator
n = 1
while n <= self.start:
yield n
n += 1
for rr in reversed(Countdown(30)):
print(rr)
for rr in Countdown(30):
print(rr)
輸出的結(jié)果是 1 到 30 然后 30 到 1 ,分別是順序打印和倒序打印
你想同時(shí)迭代多個(gè)序列,每次分別從一個(gè)序列中取一個(gè)元素。你遇到過這樣的需求嗎?
為了同時(shí)迭代多個(gè)序列,使用 zip() 函數(shù),具體示例:
# -*- coding: UTF-8 -*-
names = ['laingdianshui', 'twowater', '兩點(diǎn)水']
ages = [18, 19, 20]
for name, age in zip(names, ages):
print(name,age)
輸出的結(jié)果:
laingdianshui 18
twowater 19
兩點(diǎn)水 20
其實(shí) zip(a, b) 會(huì)生成一個(gè)可返回元組 (x, y) 的迭代器,其中 x 來自 a,y 來自 b。 一旦其中某個(gè)序列到底結(jié)尾,迭代宣告結(jié)束。 因此迭代長(zhǎng)度跟參數(shù)中最短序列長(zhǎng)度一致。注意理解這句話喔,也就是說如果 a , b 的長(zhǎng)度不一致的話,以最短的為標(biāo)準(zhǔn),遍歷完后就結(jié)束。
利用 zip() 函數(shù),我們還可把一個(gè) key 列表和一個(gè) value 列表生成一個(gè) dict (字典),如下:
# -*- coding: UTF-8 -*-
names = ['laingdianshui', 'twowater', '兩點(diǎn)水']
ages = [18, 19, 20]
dict1= dict(zip(names,ages))
print(dict1)
輸出如下結(jié)果:
{'laingdianshui': 18, 'twowater': 19, '兩點(diǎn)水': 20}
這里提一下, zip() 是可以接受多于兩個(gè)的序列的參數(shù),不僅僅是兩個(gè)。