『無為則無心』Python基礎 — 13、Python流程控制語句(條件語句)

繁華似錦Fighting發表於2021-07-01

1、流程控制基本概念

預設情況下,程式的執行流程是這樣的:執行程式後,系統會按編寫好的程式碼,從上至下順序執行程式中的每一行程式碼。但是這樣並不能滿足我們所有的開發需求,實際開發中,我們需要根據不同的條件可以改變程式的執行順序,也可以讓指定的程式反覆執行多次,最終來實現我們要完成的功能。

為了方便我們控制程式的執行流程,程式語言一般都會有基本的流程控制結構。

流程控制語句的基本控制結構有三種:順序結構選擇結構迴圈結構

順序結構說明

當程式執行的時候,會從程式碼的第一行開始往下一行一行的執行,直到整個程式碼全部執行完成。在此過程中程式按照書寫的順序執行,不會跳過任何一行程式碼,像這樣的執行流程就是常見的順序執行結構

提示:所以重點要說的是選擇結構、迴圈結構。

2、選擇結構(條件語句)

(1)條件語句概念

我們常用的條件語句一般就是if語句switch語句,但是Python語言中是沒有switch-case語句的。

  • 那我們就說說什麼是if選擇語句?
    if語句是指程式語言中用來判定所給定的條件是否滿足,根據判定的結果(真或假)決定執行程式的哪些操作。
  • 再比如我們假設一個場景:
    我們去網咖需要給網管提供身份證,提供身份證的主要目的就是登記你的身份資訊,檢視你是否成年,如果識別你成年就可以給你開機器,如果識別你未成年就不能夠給你開機器。
    其實這個場景描述的就是條件語句,即條件成立執行某些程式碼,條件不成立則不執行這些程式碼

(2)if語句語法

if 條件表示式:
    # 這裡是程式碼塊
    條件成立執行的程式碼1
    條件成立執行的程式碼2
    ......

執行的流程:if語句在執行時,會先對條件表示式進行求值判斷,如果為True,則執行if後程式碼塊中的語句,如果為False,則不執行。

我們來看下一段程式碼:

if False:print('條件成立執行的程式碼1')
print('條件成立執行的程式碼2')
# 輸出結果:
# 條件成立執行的程式碼2

上面示例說明:

在Python中,預設情況下,if語句只會控制緊隨其後的那條語句,如果希望if條件語句可以控制多條語句,則可以在if後跟著一個程式碼塊。

什麼是程式碼塊?

程式碼塊中儲存著一組程式碼,同一個程式碼塊中的程式碼,要麼都執行要麼都不執行。

程式碼塊就是一種為程式碼分組的機制,如果要編寫程式碼塊,語句就不能緊隨在:後邊,而是要寫在下一行

程式碼塊以縮排開始,直到程式碼恢復到之前的縮排級別時結束。

程式碼塊縮排有兩種方式

  1. 縮排規則4個空格。(官方文件推薦)
  2. 或者一個Tab鍵(製表符)。(開發習慣)

在Pycharm中,輸入冒號後會自動換行縮排。

Python程式碼中使用的縮排方式必須統一,也就是說你編寫程式碼的時候,要用空格就全用空格,要用Tab鍵就全用Tab鍵,避免混著用。

現在大部分的Python編輯器,會預設的把Tab鍵轉換成4個空格。

1)快速體驗

if True:
    print('條件成立執行的程式碼1')
    print('條件成立執行的程式碼2')

# 下方的程式碼沒有縮排到if語句塊,
# 所以不屬於if語句塊,和if條件無關。
print('我是無論條件是否成立都要執行的程式碼')

# 執行結果如下:
# 條件成立執行的程式碼1
# 條件成立執行的程式碼2
# 我是無論條件是否成立都要執行的程式碼

2)例項

需求分析:如果使用者年齡大於等於18歲,即成年,輸出"已經成年,可以上網"。

簡單版

age = 20
if age >= 18:
    print('已經成年,可以上網')

print('系統關閉')

進階版

新增需求:使用者可以輸出自己的年齡,然後系統進行判斷是否成年,成年則輸出"您的年齡是'使用者輸入的年齡',已經成年,可以上網"。

# input()接受使用者輸入的資料是字串型別,
# 條件是age和輸入的整型做判斷,所以這裡要int()轉換資料型別。
age = int(input('請輸入您的年齡:'))

"""
 如果age不做型別轉換,age >= 18 表示式會報錯,
 變數age是字串,字串和數值型不能進行比較,
 在前邊關係運算子(比較運算子)講過。
"""
if age >= 18: 
    print(f'您的年齡是{age},已經成年,可以上網')


print('系統關閉')

(3)if...else...語句

作用:條件成立執行if下方的程式碼,條件不成立執行else下方的程式碼。

思考:網咖上網的例項,如果成年,允許上網,如果不成年呢?是不是應該回複使用者不能上網?

1)語法

if 條件:
    條件成立執行的程式碼1
    條件成立執行的程式碼2
    ......
else:
    條件不成立執行的程式碼1
    條件不成立執行的程式碼2
    ......

執行流程

if-else語句在執行時,先對if後的條件表示式進行求值判斷。如果為結果為True,則執行if後的程式碼塊,

如果為False,則執行else後的程式碼塊。

2)示例

age = int(input('請輸入您的年齡:'))

if age >= 18:
    print(f'您的年齡是{age},已經成年,可以上網')
else:
    print(f'您的年齡是{age},未成年,請自行回家寫作業')

print('系統關閉')

注意:如果條件成立執行了某些程式碼,那麼其他的情況的程式碼將不會執行。

(4)多重判斷

思考:中國合法工作年齡為18-60歲,即如果年齡小於18的情況為童工,不合法;如果年齡在18-60歲之間為合法工齡;大於60歲為法定退休年齡。

1)語法

if 條件1:
    條件1成立執行的程式碼1
    條件1成立執行的程式碼2
    ......
elif 條件2:
    條件2成立執行的程式碼1
    條件2成立執行的程式碼2
    ......
...... # 表示可以寫多個elif 條件:
else:
    以上條件都不成立執行執行的程式碼

執行流程

  • if-elif-else語句在執行時,會自上向下依次對條件表示式進行求值判斷,
    如果表示式的結果為True,則執行當前程式碼塊,然後語句結束。
    如果表示式的結果為False,則繼續向下判斷,直到找到True為止。
    如果所有的表示式都是False,則執行else後的程式碼塊。
  • if-elif-else語句中只會有一個程式碼塊會執行。

提示:多重判斷也可以和else配合使用。一般else放到整個if語句的最後,表示以上條件都不成立的時候執行的程式碼。

(2)示例

# 工齡判斷
age = int(input('請輸入您的年齡:'))
if age < 18:
    print(f'您的年齡是{age},童工一枚')
elif (age >= 18) and (age <= 60):
    print(f'您的年齡是{age},合法工齡')
else age > 60:
    print(f'您的年齡是{age},可以退休')

擴充:age >= 18 and age <= 60可以化簡為18 <= age <= 60(邏輯運算子擴充2有講)。

(5)if語句巢狀

思考:坐公交:如果有錢可以上車,沒錢不能上車;上車後如果有空座,則可以坐下;如果沒空座,就要站著。怎麼書寫程式?

1)語法

if 條件1:
    條件1成立執行的程式碼
    條件1成立執行的程式碼

    if 條件2:
        條件2成立執行的程式碼
        條件2成立執行的程式碼

注意:條件2的if也是處於條件1成立執行的程式碼的縮排關係內部。

2)示例:坐公交,判斷是否能上車

"""
1. 如果有錢,則可以上車
    2. 上車後,如果有空座,可以坐下
       上車後,如果沒有空座,則站著等空座位
   如果沒錢,不能上車
"""
# 假設用 money = 1 表示有錢, money = 0表示沒有錢
money = 1
if money == 1:
    print('土豪,不差錢,順利上車')
else:
    print('沒錢,不能上車,追著公交車跑')

判斷是否能坐下:

"""
1. 如果有錢,則可以上車
    2. 上車後,如果有空座,可以坐下
       上車後,如果沒有空座,則站著等空座位
   如果沒錢,不能上車
"""
# 假設用 money = 1 表示有錢, money = 0表示沒有錢; 
# seat = 1 表示有空座,seat = 0 表示沒有空座
money = 1
seat = 0
if money == 1:
    print('土豪,不差錢,順利上車')
    # 判斷是否能坐下
    if seat == 1:
        print('有空座,可以坐下')
    else:
        print('沒有空座,站等')
else:
    print('沒錢,不能上車,追著公交車跑')

3)if巢狀語句執行流程圖

如下圖所示:

image

3、應用:猜拳遊戲

(1)需求分析

1)參與遊戲的角色

  • 玩家:手動出拳
  • 電腦:隨機出拳

2)判斷輸贏

  • 玩家獲勝
    玩家 電腦
    石頭 剪刀
    剪刀
    石頭
  • 平局:例如:玩家出拳 和 電腦出拳相同。
  • 電腦獲勝:除以上情況,則電腦獲勝。

(2)隨機數做法

  1. 匯出random模組
    import 模組名
    
  2. 使用andom模組中的隨機整數功能
    random.randint(開始,結束) # 包含頭尾
    

(3)示例

"""
提示:0-石頭,1-剪刀,2-布
1. 出拳
玩家輸入出拳
電腦隨機出拳

2. 判斷輸贏
玩家獲勝
平局
電腦獲勝
"""

# 匯入random模組
import random

# 電腦出拳
computer = random.randint(0, 2)

# 玩家出拳
player = int(input('請出拳:0-石頭,1-剪刀,2-布:'))

# 玩家勝利 p0:c1 或 p1:c2 或 p2:c0
# (就是玩家獲勝的三種情況)
if (player == 0 and computer == 1) or (player == 1 and computer == 2) or (player == 2 and computer == 0):
    print('玩家獲勝')

# 平局:玩家 == 電腦
elif player == computer:
    print('平局')
else:
    print('電腦獲勝')

4、三元運算子

(1)描述

三元運算子也叫三目運算子或三元表示式。

三元運算子的作用就是簡化程式碼,可以簡化非常簡單的if-else的格式語句。

(2)語法如下:

描述1:值1(語句1) if 條件 else 值2(語句2)
描述2:條件成立執行的表示式 if 條件 else 條件不成立執行的表示式

說明:我們讀三元表示式的時候,先從條件開始讀取,
	如果成立,執行前面表示式內容,
    如果不成立,執行後面表示式內容。

(Java中三元運算子語法:條件表示式?語句1:語句2)

(3)快速體驗:

# 三元運算子執行流程:
#   三元運算子在執行時,會先對條件表示式進行求值判斷,
#   如果判斷結果為True,則執行語句1,並返回執行結果,
#   如果判斷結果為False,則執行語句2,並返回執行結果。

# 示例
print('你好') if True else print('Hello')

# 練習1
a = 30
b = 50
print('a比較大!') if a > b else print('b比較大!')

# 練習2:工作中也常用與獲取a和b的較大值
max = a if a > b else b
print(max)

相關文章