一般來說,語句依次執(zhí)行 - 例如,函數(shù)中的第一個(gè)語句首先執(zhí)行,然后是第二個(gè)語句,依次類推。但是有很多時(shí)候需要多次執(zhí)行同一段代碼,這就引入了循環(huán)的概念。
編程語言提供了允許更復(fù)雜的執(zhí)行路徑的各種控制結(jié)構(gòu)。
循環(huán)語句允許多次執(zhí)行語句或語句組。下圖說明了一個(gè)循環(huán)語句流程結(jié)構(gòu) -
Python編程語言提供以下類型的循環(huán)來處理循環(huán)需求。
編號(hào) | 循環(huán) | 描述 |
---|---|---|
1 | while循環(huán) | 在給定條件為TRUE 時(shí),重復(fù)一個(gè)語句或一組語句。 它在執(zhí)行循環(huán)體之前測(cè)試狀態(tài)。 |
2 | for循環(huán) | 多次執(zhí)行一系列語句,并縮寫管理循環(huán)變量的代碼。 |
3 | 嵌套循環(huán) | 可以使用一個(gè)或多個(gè)循環(huán)在while 或for 循環(huán)中。 |
循環(huán)控制語句從正常順序更改執(zhí)行。 當(dāng)執(zhí)行離開范圍時(shí),在該范圍內(nèi)創(chuàng)建的所有自動(dòng)對(duì)象都將被銷毀。
Python支持以下控制語句。
編號(hào) | 控制語句 | 描述 |
---|---|---|
1 | break語句 | 終止循環(huán)語句并將執(zhí)行轉(zhuǎn)移到循環(huán)之后的語句。 |
2 | continue語句 | 使循環(huán)跳過其主體的剩余部分,并立即重新測(cè)試其狀態(tài)以進(jìn)入下一次迭代。 |
3 | pass語句 | 當(dāng)語法需要但不需要執(zhí)行任何命令或代碼時(shí),Python中就可以使用pass 語句,此語句什么也不做,用于表示“占位”的代碼,有關(guān)實(shí)現(xiàn)細(xì)節(jié)后面再寫 |
下面簡單地看一下循環(huán)控制語句。
迭代器(Iterator)是允許程序員遍歷集合的所有元素的對(duì)象,而不管其具體實(shí)現(xiàn)。在Python中,迭代器對(duì)象實(shí)現(xiàn)了iter()
和next()
兩種方法。
String
,List
或Tuple
對(duì)象可用于創(chuàng)建Iterator
。
list = [1,2,3,4]
it = iter(list) # this builds an iterator object
print (next(it)) #prints next available element in iterator
# Iterator object can be traversed using regular for statement
for x in it:
print (x, end=" ")
or using next() function
while True:
try:
print (next(it))
except StopIteration:
sys.exit() #you have to import sys module for this
發(fā)生器(generator
)是使用yield
方法產(chǎn)生或產(chǎn)生一系列值的函數(shù)。
當(dāng)一個(gè)生成器函數(shù)被調(diào)用時(shí),它返回一個(gè)生成器對(duì)象,而不用執(zhí)行該函數(shù)。 當(dāng)?shù)谝淮握{(diào)用next()
方法時(shí),函數(shù)開始執(zhí)行,直到它達(dá)到yield
語句,返回yielded
值。 yield
保持跟蹤,即記住最后一次執(zhí)行,而第二個(gè)next()
調(diào)用從前一個(gè)值繼續(xù)。
以下示例定義了一個(gè)生成器,它為所有斐波納契數(shù)字生成一個(gè)迭代器。
#!usr/bin/python3
import sys
def fibonacci(n): #generator function
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(5) #f is iterator object
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()