首頁 > 軟體

Python 中的判斷語句,迴圈語句,函數

2022-08-24 22:00:29

1. 判斷語句

1.1 布林型別和比較運運算元

1.1.1 布林型別

布林(bool)表達現實生活中的邏輯,即真和假:

  • True 表示真
  • False 表示假

True 和 False 的本質都是數位。True 記作 1,False 記作 0。

定義變數儲存布林型別資料:變數名 = 布林型別字面量

布林型別不僅可以自行定義,也可以通過比較運算得到布林型別的結果。

result = 10 > 5
print(f"result的值是{result},型別是{type(result)}")

輸出結果:

result的值是True,型別是<class 'bool'>

1.1.2 比較運運算元

1.2 if 語句

1.2.1 if 語句基本格式

if 語句基本格式:

if 要判斷的條件: #不要忘記加冒號
    條件成立時,要做的事情 #前面有4個空格縮排

【例】結合前面學習的input輸入語句,完成如下案例:

  • (1)通過input語句,獲取鍵盤輸入,為變數 age 賦值。(注意轉換成數位型別)
  • (2) 通過 if 判斷是否是成年人,滿足條件則輸出提示資訊,

如下:

歡迎來到黑馬兒童遊樂場,兒童免費,成人收費。
請輸入你的年齡:30
您已成年
遊玩需要補票10元
祝您遊玩愉快。

print("歡迎來到黑馬兒童遊樂場,兒童免費,成人收費。")
age = int(input("請輸入你的年齡:"))#型別轉換

if age >= 18:
    print("您已成年") #有4格縮排
    print("遊玩需要補票10元")

print("祝您遊玩愉快")

輸出結果1:

歡迎來到黑馬兒童遊樂場,兒童免費,成人收費。
請輸入你的年齡:20
您已成年
遊玩需要補票10元
祝您遊玩愉快

輸出結果2:

歡迎來到黑馬兒童遊樂場,兒童免費,成人收費。
請輸入你的年齡:10
祝您遊玩愉快

1.2.2 if else 語句

print("歡迎來到黑馬兒童遊樂場,兒童免費,成人收費。")
age = int(input("請輸入你的年齡:"))#型別轉換

if age >= 18:
    print("您已成年,遊玩需要補票10元。")
else:#同樣有冒號,且其中的語句有4個格縮排
    print("您未成年,可以免費遊玩")

1.2.3 if elif else 語句

print("歡迎來到黑馬動物園")
if int(input("請輸入你的身高(cm):")) < 120:
    print("您的身高小於120cm,可以免費遊玩")
elif int(input("請輸入vip等級:")) > 3:
    print("您的vip等級大於3,可以免費遊玩")
elif int(input("請告訴我今天幾號:")) == 1:
    print("今天是1號免費日,可以免費遊玩")
else:
    print("不好意思,您不滿足免費遊玩的條件,需購票")

1.2.4 判斷語句的巢狀

基礎語法格式如下:

if 條件1:
    滿足條件1時做的事情1
    滿足條件1時做的事情2
    if 條件2:
        滿足條件2時做的事情1
        滿足條件2時做的事情2

如上面程式碼,第二個 if 在第一個 if 內,只有滿足第一個 if 的條件時,才會執行第二個 if。
巢狀的關鍵點在於:空格縮排。
Python 就是通過空格縮排來決定語句之間的層次關係

print("歡迎來到黑馬動物園")
if int(input("請輸入你的身高(cm):")) > 120:
    print("您的身高大於120cm,不能免費遊玩")
    print("不過,若您的vip等級超過3,可以免費遊玩")
    if int(input("請輸入vip等級:")) > 3:
        print("您的vip等級大於3,可以免費遊玩")
    else:
        print("不好意思,您不滿足免費遊玩的條件,需購票")
else:
    print("您的身高小於120cm,可以免費遊玩")

2. 迴圈語句

2.1 while 迴圈

2.1.1 while 迴圈基礎語法

while 條件:
    條件滿足時,做的事情1
    條件滿足時,做的事情2
    條件滿足時,做的事情3
    ...

【例】設定一個範圍 1~100 的隨機整數變數,通過 while 迴圈,配合 input 語句,判斷輸入的數位是否等於亂數。

要求:

  • (1)無限次機會,直到猜中為止;
  • (2)每一次猜不中,會提示大了或小了;
  • (3)猜完數位後,提示猜了幾次。
import random
count = 0
num = random.randint(1,100)#生成1~100的隨機整數,包括1和100

while True:
    guess = int(input("請輸入猜測的數位:"))
    count += 1	#python中沒有count++這種累加操作
    if guess == num:
        print("猜中了")
        break
    else:
        if guess < num:
            print("小了")
        else:
            print("大了")

print("共猜了%d次" % count)

2.1.2 while 迴圈巢狀使用

while 條件1:
    條件1滿足時,做的事情1
    條件1滿足時,做的事情2
    條件1滿足時,做的事情3
    ...
    while 條件2:
        條件2滿足時,做的事情1
        條件2滿足時,做的事情2
        條件2滿足時,做的事情3
        ...

【例1】向小美表白 100 天,每天都送 10 朵玫瑰花。

i = 1
while i <= 100:
    print(f"第{i}天表白")

    j = 1
    while j <= 10:
        print(f"第{i}天,送的第{j}朵玫瑰花")
        j += 1

    print("小美,我喜歡你")
    i += 1

補充知識

print 語句預設情況下,輸出內容會自動換行,如下圖:

在即將完成的案例中,需要使用 print 語句輸出時不換行的功能,加上end=''即可:

ps:end=''使用了方法傳參功能,後面會詳細講解。

【例2】列印九九乘法表

i = 1
while i < 10:

    j = 1
    while j <= i:
        print(f"{j} * {i} = {j * i}t", end = '')
        j += 1

    i += 1
    print()

2.2 for 迴圈

2.2.1 for 迴圈基礎語法

for 臨時變數 in 待處理資料集(序列):
    迴圈滿足條件時執行的程式碼

遍歷字串:

info = "hello"
for ch in info:
    print(ch)

輸出結果:

h
e
l
l
o

由此看出,與 while 迴圈不同,for 迴圈無法定義迴圈條件,只能從被處理的資料集裡,依次取出內容進行處理。
所以,理論上講,Python 的 for 迴圈無法構建無限迴圈(被處理的資料集不可能無限大)

【例】統計 “itheima is a brand of itcast” 中有多少個 a。

name = "itheima is a brand of itcast"
count = 0
for ch in name:
    if ch == 'a':
        count += 1
print(f"共有{count}個a")	# 共有4個a

2.2.2 range 語句

for 迴圈語法中待處理資料集,嚴格來說,稱為序列型別
序列型別:其內容可以一個個依次取出的一種型別,包括:字串、列表、元組 等。
目前只介紹了字串型別,其餘型別後面會詳細講解。

由於現階段只介紹了字串,所以暫且只能通過 range 語句,可以獲得一個簡單的數位序列(range 語句還有其他用途,後面詳講)。

range(num):獲取一個從 0 開始,到 num 結束的數位序列(不含 num 本身)

如:range(5) 取得的資料是:[0,1,2,3,4]

range(num1, num2):獲得一個從 num1 開始,到 num2 結束的數位序列(不含 num2 本身)

如:range(5,10)取得的資料是:[5,6,7,8,9]

range (num1, num2, step):獲得一個從 num1 開始,到 num2 結束的數位序列(不含 num2 本身)
數位之間的步長,以 step 為準(step 預設為1)

如:range(5,10,2) 取得的資料是:[5,7,9]

range 語句通常配合 for 使用:

for i in range(5):
    print(i)

輸出結果:

0
1
2
3
4

【例】

有了 range 語句,前面送 10 朵玫瑰花的操作也可以用 for 迴圈實現:

count = 0
for i in range(1, 100):
    if i % 2 == 0:
        count += 1

print(f"共有{count}個偶數")	# 共有49個偶數

2.2.3 變數作用域

如程式碼,思考:最後的 print 語句,能否存取到變數 i?

for i in range(5):
	print(i)
print(i)	# 能否存取到變數i?

規範上:不允許
實際上:可以,最後的 print 語句輸出 4

回看 for 迴圈的語法:

for 臨時變數 in 待處理資料集(序列):
    迴圈滿足條件時執行的程式碼

我們會發現,將從資料集(序列)中取出的資料賦值給臨時變數
該臨時變數,在程式設計規範上,作用範圍(作用域),限定在 for 迴圈內部。
如果在 for 迴圈外部存取該臨時變數,實際上可以存取到;但在程式設計規範上,不允許、不建議這麼做。

上面程式碼中,若想要在 for 迴圈外面使用 i,可以將 i 定義在 for 迴圈外面:

i = 0
for i in range(5):
    print(i)
print(i)

2.2.4 for 迴圈巢狀使用

for 臨時變數 in 待處理資料集(序列):
    迴圈滿足條件應做的事情1
    迴圈滿足條件應做的事情2
    迴圈滿足條件應做的事情N
    for 臨時變數 in 待處理資料集(序列):
        迴圈滿足條件應做的事情1
        迴圈滿足條件應做的事情2
        迴圈滿足條件應做的事情N

【例】用 for 迴圈實現送小美 100 天玫瑰花,每天送 10 朵的功能。

for i in range(1, 101):
    print(f"今天是向小美表白的第{i}天")

    for j in range(1, 11):
        print(f"送小美第{j}朵玫瑰花")

    print("小美,我喜歡你")

目前學習了 2 個迴圈,while 迴圈和 for 迴圈。這兩種迴圈可以相互巢狀

【例】用 for 迴圈列印九九乘法表。

for i in range(1, 10):
    for j in range(1, 10):
        if j <= i:
            print(f"{j} * {i} = {j * i}t", end = '')
    print()

2.3 break 和 continue

  • break:所在的迴圈完全結束。
  • continue:中斷本次迴圈,直接進入下一次迴圈。

注意點:

  • (1)兩者都可以用於 for 迴圈和 while 迴圈。
  • (2)在巢狀迴圈中,兩者都只能作用於所在的迴圈,無法對上層迴圈起作用。

【例】某公司,賬戶餘額有 1 W元,給 20 名員工發工資。規則:

  • (1)員工編號從 1 到 20,從編號1開始,依次領取工資,每人可領取 1000 元
  • (2)領工資時,財務判斷員工的績效分(1~10)(隨機生成),如果低於 5,不發工資,換下一位。
  • (3)如果工資發完了,結束髮工資。

輸出格式如圖:

import random
money = 10000
for i in range(1, 21):
    if money < 1000:
        print("工資發完了,下個月領取吧")
        break
    score = random.randint(1, 10) #生成1~10的隨機整數,包括1和10
    if score < 5:
        print(f"員工{i},績效分{score},低於5,不發工資,下一位")
    else:
        money -= 1000;
        print(f"向員工{i}發放工資1000元,賬戶餘額還剩餘{money}元")

輸出結果:

向員工1發放工資1000元,賬戶餘額還剩餘9000元
向員工2發放工資1000元,賬戶餘額還剩餘8000元
向員工3發放工資1000元,賬戶餘額還剩餘7000元
向員工4發放工資1000元,賬戶餘額還剩餘6000元
向員工5發放工資1000元,賬戶餘額還剩餘5000元
員工6,績效分3,低於5,不發工資,下一位
向員工7發放工資1000元,賬戶餘額還剩餘4000元
向員工8發放工資1000元,賬戶餘額還剩餘3000元
向員工9發放工資1000元,賬戶餘額還剩餘2000元
員工10,績效分3,低於5,不發工資,下一位
向員工11發放工資1000元,賬戶餘額還剩餘1000元
員工12,績效分1,低於5,不發工資,下一位
向員工13發放工資1000元,賬戶餘額還剩餘0元
工資發完了,下個月領取吧

3. 函數

3.1 函數的定義

函數的定義:

def 函數名(傳入引數):
    函數體
    return 返回值

函數的呼叫:

函數名(引數)

# 函數定義
def say_hello():
    print("hello world")
# 函數呼叫
say_hello()	#輸出 hello world

注意事項:

  • (1)引數如果不需要,可以省略(後續章節講解)。
  • (2)返回值如果不需要,可以省略(後續章節講解)。
  • (3)函數必須先定義後使用

3.2 函數的引數

# 函數定義
def add(x, y):
    print(f"{x} + {y} = {x + y}")
# 函數呼叫
add(3, 4)

函數定義中的引數,稱之為形式引數;
函數呼叫中的引數,稱之為實際引數;
函數的引數數量不限,使用逗號分隔開;
傳入引數的時候,要和形式引數一一對應(順序、個數),逗號隔開。

3.3 函數的返回值

帶返回值的函數的定義和呼叫:

# 函數定義
def add(x, y):
    return x + y
# 函數呼叫
res = add(3, 4)
print(res)	#輸出7

question:如果函數沒有使用 return 語句返回資料,那麼函數有返回值嗎?
answer:有返回值。
why:Python 中有一個特殊的字面量:None,其型別是:<class’NoneType’>,
無返回值的函數,實際上就是返回了:None 這個字面量,
函數返回 None,就表示沒有返回什麼有意義的內容,也就是返回了空的意思。

def say_he11o():
    print("Hello...")

result = say_he11o()
print(result)
print(type(result))

輸出結果:

Hello...
None
<class 'NoneType'>

None可以主動使用 return 返回,效果等同於不寫 return 語句:

def say_he11o():
    print("Hello...")
    return None

result = say_he11o()
print(result)
print(type(result))

輸出結果:

Hello...
None
<class 'NoneType'>

None 作為一個特殊的字面量,用於表示:空、無意義,其有非常多的應用場景。

  • 用於函數無返回值。
  • 用於 if 判斷。在 if 判斷中,None 等同於 False。在函數中可以主動返回 None,配合 if 判斷做相關處理。
def check_age(age):
    if age >= 18:
        return "success"
    else:
        return None

result = check_age(16)
if not result:
    print("未滿18歲,不能進網咖")

用於宣告無內容的變數。定義變數,但暫時不需要變數有具體值,可以用None來代替

#暫不賦予變數具體值
name = None

3.4 函數說明檔案

雖然函數的說明檔案只是註釋,隨便寫也沒啥,但最好要遵循一定的規範。
在函數內寫引號一回車,就自動出現引數和返回值的說明頭部(這就是規範)。這樣就可以在此基礎上繼續補充。

寫好函數說明檔案後,將滑鼠懸停在函數的上方,會出現函數的說明資訊。

3.5 函數的巢狀呼叫

函數的巢狀呼叫:在一個函數中,呼叫另外一個函數。

def func_b():
    print("---2---")

def func_a():
    print("---1---")
    func_b()
    print("---3---")

func_a()  # 呼叫函數func_a

輸出結果:

---1---
---2---
---3---

3.6 變數的作用域

變數主要分為兩類:區域性變數和全域性變數。
區域性變數:定義在函數體內部,只在函數內部生效。

def testA():
    num = 100
    print(num)
testA() # 100
print(num)#報錯:name'num'is not defined

變數 a 定義在 testA 函數內部,在函數外部存取則立即報錯。
區域性變數的作用:在函數體內部,臨時儲存資料,當函數呼叫完成後銷燬。

全域性變數:在函數內、外都能生效的變數。
如果有一個資料,在函數 A 和函數 B 中都要使用,則可以將這個資料儲存在一個全域性變數中。

#定義全域性變數num
num = 100
def testA():
    print(num)
def testB():
    print(num)
    
testA() #100
testB() #100

global 關鍵字

現在有個需求:在函數內部修改函數外的全域性變數。

num = 200
def test_a():
    print(f"test_a: {num}")

def test_b():
    num = 500
    print(f"test_b:{num}")
    
test_a()
test_b()
print(num)

上述程式碼輸出結果:

test_a: 200
test_b:500
200

程式碼並沒有修改全域性變數的值。原因是 test_b() 中的 num 是一個區域性變數,與全域性變數 num 沒有絲毫關係。
想要在函數內修改全域性變數,可以使用 global 關鍵字。

num = 200
def test_a():
    print(f"test_a: {num}")

def test_b():
    global num #增加了global
    num = 500
    print(f"test_b:{num}")

test_a()
test_b()
print(num)

輸出結果:

test_a: 200
test_b:500
500

上面程式碼中,global 關鍵字將 num 宣告為全域性變數,這樣 test_b() 中的 num 與函數外的 num 就是同一個變數。

3.7 函數綜合案例

銀行系統查詢餘額、存款、取款、退出功能。
初始餘額 5000000 元,進入系統時先輸入姓名。

money = 5000000
name = input("請輸入姓名:") 
# 選單
def menu(): 
    print(f"{name},您好,歡迎來到黑馬銀行ATM,請選擇操作:")
    print("查詢餘額t【輸入1】")
    print("存款tt【輸入2】")
    print("取款tt【輸入3]")
    print("退出tt【輸入4】")
    return input("請輸入您的選擇:")
# 查詢餘額
def query(show_header): 
    # 控制是否輸出表頭
    if show_header:
        print("-------------查詢餘額--------------")
    print(f"{name},您好,您的餘額剩餘:{money}元")
# 取款
def save(deposit): 
    print("-------------存款--------------")
    global money
    money += deposit
    print(f"{name},您好,您存款{deposit}元成功")
    query(False)
# 存款
def get(withdraw): 
    print("-------------取款--------------")
    global money
    money -= withdraw
    print(f"{name},您好,您取款{withdraw}元成功")
    query(False)
 
while True:
    choice = menu() # 使用者選擇
    if choice == "1":
        query(True)
    elif choice == "2":
        save(int(input("請輸入要存入的金額:")))
    elif choice == "3":
        get(int(input("請輸入要去除的金額:")))
    else:
        break
print("程式退出...")

到此這篇關於Python 中的判斷語句,迴圈語句,函數的文章就介紹到這了,更多相關Python 判斷語句和迴圈語句內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com