Python3-流程控制語句、迭代器、生成器

熊博主發表於2020-11-22

Python3-流程控制語句、迭代器、生成器

1. 介紹幾個基本的指令碼

# 斐波那契數列
# 前兩個數字的和等於第三個數字
a,b = 0,1
while b<10:
    print(b)
    a,b = b,a+b    # 先計算出右邊表示式,再同時賦值給左邊變數

在這裡插入圖片描述

a,b = 0,1
while b<10:
    print(b,end=',')   # 將輸出放到同一行,並在輸出的結尾加上字串
    a,b = b,a+b

在這裡插入圖片描述

2. if條件控制

# if語句格式:
if condition_1:
    statement_block_1
elif condition_2:
    statement_block_2
else:
    statement_block_3
    
# 每個條件後面都要有冒號:
# 一個程式碼塊中所有語句的縮排都要相同,同一縮排才是同一程式碼塊。

# if語句巢狀格式:
if 表示式1:
    語句
    if 表示式2:   # 巢狀的if語句
        語句
    elif 表示式3:
        語句
    else:
        語句
elif 表示式4:
    語句
else:
    語句
age = int(input("請輸入你家狗狗的年齡: "))   # 輸入一個值,並轉換為整數
print("")
if age <= 0:
    print("你是在逗我吧!")
elif age == 1:
    print("相當於 14 歲的人。")
elif age == 2:
    print("相當於 22 歲的人。")
elif age > 2:
    human = 22 + (age - 2) * 5
    print("對應人類年齡: ", human)

### 退出提示
input("點選 enter 鍵退出")

在這裡插入圖片描述

if條件語句中常用運算子:

在這裡插入圖片描述

number = 7
guess = -1
print("數字猜謎遊戲!")
while guess != number:
    guess = int(input("請輸入你猜的數字:"))
 
    if guess == number:
        print("恭喜,你猜對了!")
    elif guess < number:
        print("猜的數字小了...")
    elif guess > number:
        print("猜的數字大了...")

在這裡插入圖片描述

num=int(input("輸入一個數字:"))
if num%2==0:
    if num%3==0:
        print ("你輸入的數字可以整除 2 和 3")
    else:
        print ("你輸入的數字可以整除 2,但不能整除 3")
else:
    if num%3==0:
        print ("你輸入的數字可以整除 3,但不能整除 2")
    else:
        print  ("你輸入的數字不能整除 2 和 3")

在這裡插入圖片描述

3. while迴圈語句

# 單條件while迴圈語句
while 判斷條件(condition):
    執行迴圈體語句(statements)
    
# python中沒有do...while語句


# 多條件while迴圈語句
while <expr>:
    <statement(s)>
else:
    <additional_statement(s)>
n = 100

sum = 0
counter = 1
while counter <= n:   # while迴圈,條件正確則執行迴圈體
    sum = sum + counter
    counter += 1

print("1 到 %d 之和為: %d" % (n, sum))

在這裡插入圖片描述

var = 1
while var == 1 :  # 表示式永遠為 true
   num = int(input("輸入一個數字  :"))
   print ("你輸入的數字是: ", num)
 
print ("Good bye!")

# 條件永遠為True,重複執行迴圈體

在這裡插入圖片描述

count = 0
while count < 5:   # 小於5則執行迴圈體
   print (count, " 小於 5")
   count = count + 1
else:              # 大於等於5執行其他語句
   print (count, " 大於或等於 5")

在這裡插入圖片描述

# 迴圈體只有一條語句,可與while寫在同一行
flag = 1
while flag == 1: print("努力,奮鬥!")

在這裡插入圖片描述

4. for迴圈語句

for <variable> in <sequence>:
    <statements>
else:
    <statements>
a = [1, 2, 3, 4, 5]
b = 0
for i in a:
    print(i)
    b = b + i
    if i == 5:
        print('累加結束,請給出計算結果!')
        break      # break終止for迴圈,跳出整個迴圈。
else:
    print('a列表是一個空列表')
print('a列表的各數值的和為:', b)

# continue 跳出本次for迴圈,繼續下次for迴圈

在這裡插入圖片描述
range()函式和len()函式實現for迴圈:
range():生成一個數列,可以使用list()或tuple()轉換為列表或元組。格式:range(最小值,最大值,步長),最小值預設預設0,步長預設預設1,最大值不可預設。數列中包含最小值,不包含最大值。
len():用於計算物件的長度

在這裡插入圖片描述

list1 = ['a', 'b', 'c', 'd']
print('列表list1的元素個數為:', len(list1))
for i in range(len(list1)):
    print(i,list1[i])

在這裡插入圖片描述

5. break和continue語句

break 語句可以跳出 for 和 while 的迴圈體。如果你從 for 或 while 迴圈中終止,任何對應的迴圈 else 塊將不執行。

continue 語句被用來告訴 Python 跳過當前迴圈塊中的剩餘語句,然後繼續進行下一輪迴圈。

迴圈語句可以有 else 子句,它在窮盡列表(以for迴圈)條件變為 false (以while迴圈)導致迴圈終止時被執行,但迴圈被 break 終止時不執行

在沒有break語句時,for迴圈或while迴圈中的else子句肯定會執行。

for letter in 'abong':    # 例項1
   if letter == 'b':
      break
   print ('當前字母為 :', letter)
  
var = 10
while var > 0:             # 例項2
   print ('當期變數值為 :', var)
   var = var -1
   if var == 5:
      break
 
print ("Good bye!")

在這裡插入圖片描述

for letter in 'abong':  # 例項1
    if letter == 'b':
        continue
    print('當前字母為 :', letter)

var = 10
while var > 0:  # 例項2
    var = var - 1
    if var == 5:
        continue
    print('當期變數值為 :', var)
    

print("Good bye!")

在這裡插入圖片描述

6. pass語句

Python中pass是空語句,是為了保持程式結構的完整性。pass 不做任何事情,一般用做佔位語句。

for letter in 'abong':
    if letter == 'o':
        pass    # 啥都不做
        print('執行 pass 塊')
    print('當前字母 :', letter)

print("Good bye!")

在這裡插入圖片描述

7. 迭代器

7.1 用標準資料型別建立迭代器

迭代是Python最強大的功能之一,是訪問集合元素的一種方式。

迭代器是一個可以記住遍歷的位置的物件。

迭代器物件集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

迭代器有兩個基本的方法:iter()next()。【前者建立迭代器,後者記住下一個元素】

字串,列表或元組物件都可用於建立迭代器。

介紹幾個迭代器的用法:

list = ['a', 'b', 'c', 'd']
it = iter(list)  # 建立迭代器物件,這是next(it)指向第一個元素
i = 0
while i < len(list):
    print('第', i+1, '個元素是:', next(it))
    i += 1

在這裡插入圖片描述

list = ['a', 'b', 'c', 'd']
it = iter(list)  # 建立迭代器物件,這是next(it)指向第一個元素
i = 0
for a in it:
    print('第', i+1, '個元素是:', a)
    i += 1

在這裡插入圖片描述

import sys    # 匯入模組
list=[1,2,3,4]
it=iter(list)   # 使用列表建立迭代器物件
while True:
    try:
        print(next(it), end=' ')
    except StopIteration:   # 異常處理,用於標識迭代的完成,防止出現無限迴圈的情況
        sys.exit()    # 退出迴圈

在這裡插入圖片描述

7.2 自定義迭代器

把一個作為一個迭代器使用需要在類中實現兩個方法__iter__()__next__()

__iter__():返回一個特殊的迭代器物件, 這個迭代器物件實現了__next__()方法並通過 StopIteration異常標識迭代的完成。

__next__() :返回下一個迭代器物件。

class MyNumbers:     # 定義一個新的資料型別MyNumbers,數字、字串、列表、元組、集合、字典是標準的資料型別,即已經定義好的資料型別。
    def __iter__(self):   # 成員函式,self是指一個例項
        self.a = 1        # 成員變數a,賦值為1
        return self       # 返回值

    def __next__(self):   # 成員函式
        if self.a <= 20:  # 成員變數
            x = self.a    # 把變數a賦值給x
            self.a += 1   # 變數a加1
            return x      # 返回原來的變數a
        else:             # 當a的值大於20,就會引發異常,停止迭代。
            raise StopIteration


myclass = MyNumbers()   # 建立一個MyNumbers型別的例項,類比列表、元組
myiter = iter(myclass)  # 使用例項建立一個迭代器,這個和使用列表建立的迭代器使用方法一致.

for i in myiter:                # 此時的myiter就是一個迭代器,可以看作是帶有座標的列表。
    print(i, end=' ')

在這裡插入圖片描述

8. 生成器

在 Python 中,使用了 yield 的函式被稱為生成器(generator)

生成器是一個返回迭代器的函式,只能用於迭代操作。

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。

呼叫一個生成器函式,返回的是一個迭代器物件。

import sys


def fibonacci(n):  # 生成器函式,斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):   # 大於n就直接返回
            return
        yield a             # 否則儲存a的值,即while迴圈體執行一次,就會返回一次a的值。
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  # f是一個迭代器,由生成器生成並返回

while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()

在這裡插入圖片描述

相關文章