摘要:基礎(chǔ)之控制結(jié)構(gòu)學(xué)習(xí)目標(biāo)代碼塊與縮進(jìn)條件語(yǔ)句語(yǔ)句語(yǔ)句的嵌套斷言循環(huán)循環(huán)循環(huán)中斷循環(huán)控制語(yǔ)句綜合嵌套列表解析式基礎(chǔ)相關(guān)鏈接學(xué)習(xí)目標(biāo)是簡(jiǎn)潔易學(xué)面向?qū)ο蟮木幊陶Z(yǔ)言。
Python
是簡(jiǎn)潔、易學(xué)、面向?qū)ο蟮木幊陶Z(yǔ)言。它不僅擁有強(qiáng)大的原生數(shù)據(jù)類型,也提供了簡(jiǎn)單易用的控制語(yǔ)句。在《Python基礎(chǔ)教程》的系列博文中,我們已經(jīng)介紹了 Python
中的內(nèi)置原生數(shù)據(jù)類型,并且也了解了程序如何利用輸入、輸出語(yǔ)句與用戶進(jìn)行交互。本節(jié)的主要目標(biāo)是介紹 Python
的控制語(yǔ)句,為接下來的學(xué)習(xí)奠定基礎(chǔ),本文會(huì)完整的介紹學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法所需的 Python
基礎(chǔ)知識(shí)及基本思想,并給出相應(yīng)的實(shí)戰(zhàn)示例及解釋。
Python
條件語(yǔ)句與循環(huán)語(yǔ)句Python
條件語(yǔ)句與循環(huán)語(yǔ)句的復(fù)雜嵌套以及列表解析式代碼塊是一組語(yǔ)句,Python
中用于定義代碼塊的語(yǔ)法對(duì)于所有控制結(jié)構(gòu)來說是相同的,可用于滿足條件時(shí)執(zhí)行代碼( if 語(yǔ)句),也可用于代碼多次執(zhí)行(循環(huán))等。代碼塊是通過縮進(jìn)代碼(可以使用空格或制表符)來創(chuàng)建的。在Python中,使用冒號(hào) (:
) 指出接下來是一個(gè)代碼塊,在同一個(gè)代碼塊中,各行代碼的縮進(jìn)量(一般每級(jí)縮進(jìn) 4
個(gè)空格)必須相同:
if condition is True: print("this is a block") print("another line of this block")print("escaped the previous block")
在指定函數(shù)體和類體時(shí),代碼塊的原則同樣適用。
以上示例語(yǔ)句都是逐條執(zhí)行的,但實(shí)際應(yīng)用中讓程序選擇執(zhí)行特定的語(yǔ)句塊是必備的。這時(shí)布爾類型就派上用場(chǎng)了。
用作布爾表達(dá)式時(shí),標(biāo)準(zhǔn)值 False
和 None
、數(shù)值 0、空序列(如空字符串、空元組和空字典等)都被視為假,而其他值均被視為真。這意味著任何 Python
值都可解釋為真值,但 True
和 False
為標(biāo)準(zhǔn)真值。在 C 語(yǔ)言中,標(biāo)準(zhǔn)真值為 0 (表示假)和 1 (表示真)。實(shí)際上,True
和 False
是 0 和 1 的別名,其作用是完全相同的:
>>> bool("")False>>> bool([0])True>>> bool("Hello world")True>>> True == 1True>>> True + 23
程序運(yùn)行時(shí),Python
會(huì)在需要時(shí)自動(dòng)將任意值轉(zhuǎn)換為布爾值,而無需顯式地進(jìn)行轉(zhuǎn)換:
# test_bool.pystring_test = "Hello world"if string_test: print("Automatic conversion ")
以上腳本執(zhí)行結(jié)果如下,表明 Python
執(zhí)行了自動(dòng)轉(zhuǎn)換:
Automatic conversion
需要注意的是,雖然值轉(zhuǎn)換為真值后可能相等,例如 bool({}) == bool([]) == False
,但本身它們并不相等,即 {} != []
:
>>> bool({}) == bool([])True>>> {} == []False
條件語(yǔ)句(也稱 if 語(yǔ)句)能夠有條件地執(zhí)行代碼,如果條件( if 和冒號(hào)之間的表達(dá)式)為真,就執(zhí)行后續(xù)代碼塊;如果條件為假,就不執(zhí)行:
if flag == True: flag = Falseprint(flag)
上示 if 語(yǔ)句也稱單路分支結(jié)構(gòu),如果 flag
為 True
,則將其變?yōu)?False
,再打印 flag
值。還有另一種條件結(jié)構(gòu)稱為二元分支(也稱 if...else
語(yǔ)句):
answer = input("Please enter your answer: ")if answer == "A": print("Right!")else: print("Error!")
在上述例子中,Python
會(huì)檢查用戶輸入答案,如果輸入為 A,則打印 “Right!
”,否則,會(huì)執(zhí)行else 分支打印 “Error!
”。
要檢查多個(gè)條件,可使用 elif
,elif
是 else if
的縮寫,可以將其理解為包含條件的 else
子句:
num = int(input("Please enter a number: ")) if num > 0: print("The number is positive") elif num < 0: print("The number is negative") else: print("The number is zero")
需要注意的是,在使用 elif
時(shí),最后的 else
是必需的,它用來在所有分支條件都不滿足的情況下提供默認(rèn)分支。
上述三種條件結(jié)構(gòu)可以用以下流程圖表示:
綜上,我們可以總結(jié)出 Python 中,條件語(yǔ)句的最一般形式:
if first_condition: first_blockelif second_condition: second_blockelif third_condition: third_blockelse: fourth_block
每個(gè)條件都是一個(gè)布爾表達(dá)式,每個(gè)代碼塊包含一個(gè)或多個(gè)滿足條件時(shí)要執(zhí)行的語(yǔ)句。如果第一個(gè)條件為真,則執(zhí)行第一個(gè)代碼塊,而不會(huì)評(píng)估其他條件。如果第一個(gè)條件失敗,則繼續(xù)判斷第二個(gè)條件,以此類推。if 語(yǔ)句可以包括任意數(shù)量的 elif 子句 (也可以為 0 個(gè)),最后一個(gè) else 子句是可選的。
條件結(jié)構(gòu)支持嵌套,即在 if 語(yǔ)句中調(diào)用任意數(shù)量的 if 語(yǔ)句:
if alcohol < 20: print("Does not constitute drinking behavior!")else: if alcohol > 80: print("Already meet drinking and driving standards!") else: print("Has reached the standard for drunk driving!")
上述程序所表達(dá)的邏輯可以用流程圖表示:
為了讓程序在錯(cuò)誤條件出現(xiàn)時(shí)立即中止,Python
還提供了類似 if 語(yǔ)句的關(guān)鍵字:assert
,使用此關(guān)鍵字可以要求某些條件必須得到滿足。assert
語(yǔ)句類似檢查點(diǎn),當(dāng)我們知道程序的執(zhí)行必須滿足特定條件,才能正確地運(yùn)行時(shí),使用assert
語(yǔ)句可以及時(shí)終止程序運(yùn)行,類似網(wǎng)站注冊(cè)時(shí)郵箱格式正確性的檢查:
>>> mail_1 = "test123456789@gmail.com">>> assert mail_1.endswith(".com")>>> mail_2 = "test123456789@gmail.con">>> assert mail_2.endswith(".com")Traceback (most recent call last): File "" , line 1, in <module>AssertionError
為了說明程序終止的原因,可以在 assert
語(yǔ)句后添加說明字符串:
>>> assert mail_2.endswith(".com")," Email must end with .com "Traceback (most recent call last): File "" , line 1, in <module>AssertionError: Email must end with .com
我們已經(jīng)學(xué)習(xí)了如何在條件為真(或假)時(shí)執(zhí)行代碼塊,但如何重復(fù)操作代碼塊多次呢?例如,打印 1—100 內(nèi)的所有的偶數(shù)。我們當(dāng)然可以寫出 50 行 print
語(yǔ)句,但如果是這樣,我們就不需要 Python
了。
Python
提供了兩種不同的循環(huán)結(jié)構(gòu)。while
循環(huán)允許對(duì)布爾條件進(jìn)行重復(fù)測(cè)試,直到條件不能得到滿足。for
循環(huán)提供了遍歷序列的迭代(例如字符串的字符、列表的元素或給定范圍內(nèi)的數(shù)字等)。
while
語(yǔ)句會(huì)在給定條件為真時(shí)重復(fù)執(zhí)行代碼塊。例如,在下面的示例中,變量 number
被初始化為 0
,并且在 while
循環(huán)中,它每迭代一次就遞增 1
,每次執(zhí)行循環(huán)體前,首先進(jìn)行條件判斷,因此直到 number
等于 5
時(shí)結(jié)束循環(huán):
number = 0while number < 5: print("A total of {} time(s)".format(number)) number += 1
程序運(yùn)行結(jié)果如下:
A total of 0 time(s)A total of 1 time(s)A total of 2 time(s)A total of 3 time(s)A total of 4 time(s)
while
語(yǔ)句可用于在條件為真時(shí)反復(fù)執(zhí)行代碼塊,但有時(shí)候我們可能需要為序列中每個(gè)元素執(zhí)行代碼塊。
為了介紹 for
循環(huán),我們首先要了解可迭代對(duì)象,可迭代對(duì)象是可使用 for
循環(huán)進(jìn)行遍歷的對(duì)象,對(duì)于現(xiàn)階段,我們可以只需將可迭代對(duì)象視為序列即可。
for
語(yǔ)句可以用于遍歷一個(gè)序列中的每個(gè)元素:
fruits = ["apple", "orange", "banana", "lemon"]for fruit in fruits: print(fruit)
for
語(yǔ)句將列表 fruits
中的每一個(gè)值依次賦給變量 fruit
。然后,代碼塊就會(huì)被執(zhí)行。for
語(yǔ)句的常見用法是在一定的值范圍內(nèi)進(jìn)行有限次數(shù)的迭代。
我們已經(jīng)在介紹數(shù)據(jù)類型 list
時(shí),簡(jiǎn)單的介紹過內(nèi)置函數(shù) range
用于創(chuàng)建范圍,range
語(yǔ)法類似于切片,包含起始位置,但不包含結(jié)束位置。實(shí)際上,如果只提供了一個(gè)位置,將把這個(gè)位置視為結(jié)束位置,而起始位置為 0。同時(shí)也可以為 range
函數(shù)提供步長(zhǎng)參數(shù),在范圍內(nèi)每隔若個(gè)元素提取一個(gè)元素:
for i in range(0, 10, 2): print("The square of {} equals {}".format(i, i**2))
程序的輸出結(jié)果如下:
The square of 0 equals 0The square of 2 equals 4The square of 4 equals 16The square of 6 equals 36The square of 8 equals 64
使用 for
循環(huán)還可以遍歷字典,默認(rèn)情況下,是遍歷字典的鍵,如果需要遍歷所有的值或鍵-值對(duì),就需要用到字典的 values
和 items
方法了:
fruits = {"apple": 5.0, "orange": 3.5, "banana": 4.0}for k in fruits: print(k, "corresponds to", fruits[k])
上示代碼等價(jià)于:
fruits = {"apple": 5.0, "orange": 3.5, "banana": 4.0}for k, v in fruits.items(): print(k, "corresponds to", v)
通常,循環(huán)會(huì)不斷地執(zhí)行代碼塊,直到條件為假或迭代完序列中的所有元素。但有時(shí),我們可能需要開始新迭代(跳到下一次迭代開頭,并不結(jié)束循環(huán))或直接結(jié)束循環(huán)。
? break
要結(jié)束循環(huán),可使用 break
,假設(shè)要找到最大的三位水仙花數(shù)(每個(gè)位上的數(shù)字的 3 次冪之和等于它本身的三位數(shù)),可以從 999 開始向下迭代,找到一個(gè)水仙花數(shù)后,無需繼續(xù)迭代,直接跳出循環(huán):
for i in range(999, 99, -1): b = i % 10 t = (i // 10) % 10 h = i // 100 if b ** 3 + t ** 3 + h ** 3 == i: print(i) break
運(yùn)行此程序,將在打印 407 后結(jié)束,在上述示例中,可以看到通過將 range
的步長(zhǎng)設(shè)置為負(fù)數(shù),讓 range
反向迭代。
常規(guī)的 while
循環(huán)會(huì)在循環(huán)開頭時(shí)進(jìn)行判斷用來結(jié)束循環(huán),但有時(shí)我們想要循環(huán)在循環(huán)體中結(jié)束,這時(shí)就需要用到 while True/break
語(yǔ)法了,使用 while True
可以使循環(huán)永不結(jié)束,然后在循環(huán)體內(nèi)使用 if
語(yǔ)句,當(dāng) if
語(yǔ)句的條件得到滿足時(shí)調(diào)用 break
結(jié)束循環(huán),例如在登陸界面中,只有用戶輸入了正確的用戶名才能進(jìn)行下一步操作:
users = ["root", "admin", "user_1"]while True: user = input("Please enter your name: ") if user in users: break print("User does not exist!")print("The user name is correct!")
? continue
當(dāng)指定語(yǔ)句 continue
時(shí),它結(jié)束當(dāng)前迭代,并跳到下一次迭代開頭。這基本上意味著跳過循環(huán)體中余下的語(yǔ)句,但不結(jié)束循環(huán),例如計(jì)算所有水仙花數(shù),如果使用語(yǔ)句 continue
,則可以寫為:
for i in range(100, 1000): b = i % 10 t = (i // 10) % 10 h = i // 100 if b ** 3 + t ** 3 + h ** 3 != i: continue print(i)
程序輸出結(jié)果如下:
153370371407
控制語(yǔ)句可以進(jìn)行復(fù)雜的綜合嵌套,可以通過打印九九乘法表來綜合使用控制語(yǔ)句:
for i in range(1, 10): for j in range(1, 10): if i > j: print("{} * {} = {}".format(i, j, i*j), end = "/t") elif i == j: print("{} * {} = {}".format(i, j, i*j)) else: continue
列表推導(dǎo)是利用列表創(chuàng)建新列表的方式,列表推導(dǎo)的工作原理類似于 for
循環(huán):
>>> [i**2 for i in range(10)][0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
在列表推導(dǎo)中也可以進(jìn)行嵌套,例如添加更多的 for
循環(huán)和 if
語(yǔ)句:
>>> [[i, j] for i in range(10) for j in range(10) if i % 3 == 0 and j % 4 == 0][[0, 0], [0, 4], [0, 8], [3, 0], [3, 4], [3, 8], [6, 0], [6, 4], [6, 8], [9, 0], [9, 4], [9, 8]]
等價(jià)于:
new_list = []for i in range(10): for j in range(1): if i % 3 == 0 and j % 4 == 0: new_list.append([i, j])
除了列表推導(dǎo)式外,還可以使用花括號(hào)來執(zhí)行字典推導(dǎo):
>>> print({i: i**3 for i in range(10)}){0: 0, 1: 1, 2: 8, 3: 27, 4: 64, 5: 125, 6: 216, 7: 343, 8: 512, 9: 729}
Python基礎(chǔ)之變量與內(nèi)置數(shù)據(jù)類型
Python基礎(chǔ)之輸入、輸出與高階賦值
Python基礎(chǔ)之控制結(jié)構(gòu)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/125089.html
摘要:協(xié)議學(xué)習(xí)常見請(qǐng)求方法學(xué)習(xí)和學(xué)習(xí)接口的基本概念接口文檔認(rèn)識(shí)接口測(cè)試用例編寫接口測(cè)試工具使用軟件測(cè)試自動(dòng)化進(jìn)階性能測(cè)試性能測(cè)試的技術(shù)要求很高,不僅僅要對(duì)性能測(cè)試的指標(biāo)測(cè)試分類測(cè)試設(shè)計(jì)有很深刻的理解。 ...
摘要:本文重點(diǎn)掌握異步編程的相關(guān)概念了解期物的概念意義和使用方法了解中的阻塞型函數(shù)釋放的特點(diǎn)。一異步編程相關(guān)概念阻塞程序未得到所需計(jì)算資源時(shí)被掛起的狀態(tài)。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握異步編程的相關(guān)概念;2、了解期物future的概念、意義和使用方法;3、了解Python...
摘要:基礎(chǔ)之輸入輸出與高階賦值學(xué)習(xí)目標(biāo)輸入輸出與注釋獲取用戶輸入格式化輸出基本方法格式化函數(shù)注釋高階賦值語(yǔ)句賦值運(yùn)算符并行賦值序列解包鏈?zhǔn)劫x值學(xué)習(xí)目標(biāo)是簡(jiǎn)潔易學(xué)面向?qū)ο蟮木幊陶Z(yǔ)言。 ...
摘要:下載器下載器負(fù)責(zé)獲取頁(yè)面數(shù)據(jù)并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁(yè)面下載完畢,下載器生成一個(gè)該頁(yè)面的,并將其通過下載中間件返回方向發(fā)送給引擎。 作者:xiaoyu微信公眾號(hào):Python數(shù)據(jù)科學(xué)知乎:Python數(shù)據(jù)分析師 在爬蟲的路上,學(xué)習(xí)scrapy是一個(gè)必不可少的環(huán)節(jié)。也許有好多朋友此時(shí)此刻也正在接觸并學(xué)習(xí)sc...
閱讀 3501·2021-11-25 09:43
閱讀 2434·2021-09-06 15:02
閱讀 3607·2021-08-18 10:21
閱讀 3405·2019-08-30 15:55
閱讀 2410·2019-08-29 17:06
閱讀 3590·2019-08-29 16:59
閱讀 1026·2019-08-29 13:47
閱讀 2845·2019-08-26 13:24