【Python】Python中的循環語句

循環語句

  • 導讀
  • 一、基本概念
    • 1.1 循環語句的執行流程
    • 1.2 循環語句的分類
  • 二、while語句
  • 三、for語句
  • 四、break與continue
  • 五、死循環
  • 六、循環中的else語句
  • 七、`range()`函數
  • 結語

封面

導讀

大家好,很高興又和大家見面啦!!!

在上一篇內容中我們介紹了條件語句的相關內容,我們先簡單的回顧一下:

在Python中有兩種條件語句——if語句和match……case語句。其中if語句是由關鍵字if、elif、else引導的特定語句塊,而match……case是在Python 3.10之后新增的一種條件語句,并且match與case并不是Python中的關鍵字,也就是說我們在沒有使用match……case語法結構時,是可以定義重名的變量的。

在if語句中有三種形式的分支語句:

  1. 單分支語句——由if引導的條件語句,其語法格式為:
if True:  # True代表的是語句中的判斷語句pass  # pass——空語句,代表的是if語句塊中的語句
  1. 雙分支語句——由if……else引導的條件語句,其語法格式為:
if True:  # if后帶有判斷語句pass
else:  # else后不帶判斷語句pass
  1. 多分支語句——由if……elif……else引導的條件語句,其語法格式為:
if 1:pass
elif 2:  # elif可以存在多個pass
else:pass

if條件語句還有兩種使用方式:

  1. if嵌套使用,嵌套格式如下所示:
if True: if True:  # 在if語句的任一分支中都能繼續使用if語句# ……passelse:passpass
else:pass
pass
  1. 省略else,在兩種情況下可以省略else語句:
  • 不需要借助else語句的判斷邏輯,可以省略else,其語法結構如下:
# 雙分支或多分支語句中不需要使用else的判斷邏輯時可以省略else
if True:pass
pass  # 雙分支語句省略else變為單分支語句if 1:pass
elif 2:pass
pass  # 三分支語句省略else變為雙分支語句
  • if、elif語句中存在轉向語句的情況,可以省略else,其語法結構如下:
def ignoreElse():# 在函數中if、elif分支中存在轉向語句return,可以省略elseif True:return Truereturn Falsewhile True:# 在循環語句中,if、elif分支中存在轉向語句break、continue,可以省略elseif 1:continueelif 2:breakpass

match……case語句的用法與C/C++中的開關語句(Switch語句)的使用方式一致,通過match作為語句的引導詞,case作為語句中各分支的引導詞,其語法格式如下所示:

a = 1
match a + 1:  # match 引導詞后跟一個表達式case 1:  # case 引導詞后可以跟常量、變量、函數、通配符等pass  # case 語句塊中的內容都是獨立的語句塊case 2:passcase _:  # 通配符_ 可以指代一切內容,相當于defaultpass

但是match……case語句要比Switch語句的功能強大:

  1. Switch引導詞后只能跟一個整型表達式,而match引導詞后可以跟一個任一類型的表達式
  2. Switch語句中case引導詞后只能跟整型常量表達式,而match語句中case引導詞后可以跟常量、變量、函數……
  3. Switch語句中case分支是連通的需要借助break將分支給獨立出來,match語句中case分支是相互獨立的

復習完了Python中的分支語句的內容,下面我們來看一下Python中的第二類控制語句——循環語句,

一、基本概念

循環語句指的是能夠重復執行同一件事情的語句,是循環結構的具體體現。

1.1 循環語句的執行流程

循環語句的執行流程如下所示:

循環語句執行流程
在循環語句中循環體中可以是空語句,但是下面三條語句是一個循環語句中必不可少的內容:

  • 循環對象語句——在循環語句中參與循環的對象
  • 循環判斷語句——通過判斷語句的值來決定是否進入循環
  • 循環遞進語句——循環對象通過遞進語句逐漸向循環的結束條件靠近

1.2 循環語句的分類

C/C++中有三種循環語句——while循環語句、for循環語句以及do……while循環語句除了這三種循環語句外我們還可以通過goto語句來實現循環;

但是在Python中,只存在兩種形式的循環語句——while循環語句和for循環語句。Python中的循環語句與C/C++中所對應的while循環語句與for循環語句有相同點也有不同點,接下來我們就分別來看一下這兩種語言中的while語句與for語句之間的差異;

二、while語句

在C/C++中while語句的語法結構如下所示:

	int i = 1;//循環對象語句while (i != 100) {//while——語句引導詞//i != 100——循環判斷語句printf("%d\n", i);//循環體語句——循環語句需要執行的具體內容,可以為空語句i++;//循環遞進語句——對象語句根據遞進語句逐漸靠近循環的介紹條件}

在Python中while語句的語法結構與該結構相似,但還是會有些許區別:

i = 1  # 循環對象語句
while i != 100:# while——語句引導詞# i != 100——循環判斷語句print(i)  # 循環體語句——循環語句中需要執行的具體內容i += 1  # 循環遞進語句——循環對象根據遞進語句逐漸靠近循環的介紹條件

while語句的語法結構在兩種語言中唯一的不同在于判斷語句的表示,在C/C++中,判斷語句會通過圓括號'()'括起來,但是在Python中,判斷語句則是通過冒號':'來表示判斷語句的結束。

需要注意的是,在C/C++中如果遞進語句是逐個遞進,那我們可以通過前置'++'/'--'或者后置'++'/'--'來完成語句的遞進,但是在Python中舍棄了這類操作符,在自增自減的遞進語句中,可以通過賦值運算符來實現自增自減的操作。

while語句是循環語句的最基礎的一種語法,語法的使用上也比較簡單,這里就不再繼續贅述,下面我們繼續來看一下for語句在兩種語言中的異同點;

三、for語句

while語句中,語句的循環對象位于語句的外部,循環遞進語句則位于循環體中,它們三者在位置上呈現的是一種上下關系,這樣就容易出現一種情況——當循環對象語句與while引導詞中間的語句內容過多或者循環體中的語句比較多時,導致循環對象語句、判斷語句以及循環遞進語句間隔太遠。

在這種情況下如果在循環語句中出現問題時,我們想要修改這三者中的其中之一,則會需要花費大量的時間去一一尋找這三條語句。因此如果我們在編寫循環語句時,需要盡可能的讓這三條語句靠近一些。

在計算機語言中,for循環語句就很好的彌補了while語句中的這個問題,下面我們先來看一下C/C++中的for語句的語法結構,如下所示:

	for (int i = 1; i != 100; i++) {printf("%d\n", i);}

可以看到,在C/C++的for語句中,循環對象語句、循環判斷語句、循環遞進語句都位于引導詞for后面的圓括號內'()',這樣就能在我們需要修改這三者中的任一一條語句時,就能通過循環語句引導詞for很輕松的找到這三條語句。

在Python中,for語句的語法結構與C/C++的for語句的語法結構有很大的不同,如下所示:

for i in range(1, 101):print(i)
# i——循環對象
# in——成員運算符
# range()——可迭代對象,也可以是字符串、元組、列表……

在Python中,for循環語句的判斷語句與遞進語句都被整合到了可迭代對象中。可迭代對象指的是一種特殊的變量~內部包含了很多其他的值。循環體在執行時,可以通過成員運算符'in'將可迭代對象中的值一個一個的取出來并存放在循環對象變量中。

這里展示的可迭代對象range(),是一個可以依次獲取參數區間內整數的內建函數,該函數的區間為前閉后開區間,也就是說對于區間1~101我們通過成員運算符'in'可以從函數中獲取到的內容為1~100的所有整數。

在循環語句中我們還可以通過轉向語句來控制循環體語句的執行邏輯,在C/C++中循環體中的轉向語句有兩種——breakcontinue,在Python中,這兩種轉向語句同樣適用,下面我們就來看一下Python中的breakcontinue的用法

四、break與continue

在循環語句中,break可以用來立即結束循環并跳出循環,continue可以用來立即結束當前循環開始進入下一次循環,具體用法如下所示:

break與continue
從測試中可以看到,通過for循環語句我們完成了從1到100 的打印,當在循環中加入breakcontinue之后,循環的執行邏輯發生了變化:

  • i == 10 時,第一個if語句能夠正常執行,也就是說此時循環體中執行的是轉向與continue,可以看到continue后的print語句并沒有執行,而是直接進入了下一次循環打印i == 11
  • i == 20 時,在完成打印后,第二個if語句能夠正常執行,也就是說此時循環體中執行的是轉向語句break,可以看到在執行完break后,循環并未繼續執行,而是執行了循環外的print語句;

這個例子很好的說明了這兩個轉向語句在循環中的用法:

  • continue——用于結束當前循環,continue后的語句不再執行,程序立即進入下一次循環
  • break——用于結束循環,程序直接跳出循環,執行循環外的語句

五、死循環

死循環也就是無線循環——循環無法停止,會一直運行。當我們在寫程序時,最怕的就是遇到死循環,會導致死循環的原因主要有以下幾點:

  1. 判斷語句的值永遠為真
  2. 缺少遞進語句導致判斷語句恒成立
  3. 遞進語句的遞進方向錯誤,導致循環對象逐漸遠離循環的結束條件

下面我們通過一個最簡單的死循環來認識什么是死循環:
死循環
可以看到此時程序已經運行到了i==1622878任然未停止運行,之所以無法停止,正是因為在該循環中判斷條件一直成立,且循環體內沒有轉向語句break來結束循環,因此循環進入了死循環。

那是不是說所有的死循環都是不合理的呢?

實際上并不是這樣,比如一款游戲的運行,當我們在結束一句游戲后,如果游戲就直接退出了,那我們想要開啟下一句游戲,只能夠重新啟動該游戲,顯然這種設計是不合理的,因此我們就可以設置死循環,并通過轉向語句來控制循環的結局,如下所示:

死循環2
可以看到,同樣的代碼,當我們在循環體中添加了轉向語句后循環變不再是死循環了。

設想一下,如果我們是將條件語句的判斷條件改為輸入某個值,或者檢測鍵盤按下了某個按鍵,或者鼠標點擊了某個按鍵,才會執行轉向語句,這樣我們是不是就能夠保證即使一局游戲結束后,不會第一時間退出程序,而是會繼續運行了。

因此合理的利用死循環和轉向語句,能夠幫助我們實現更多的操作。

六、循環中的else語句

在Python中對于循環語句而言,新增了一個語法——else語句:

  • while……else語句
  • for……else語句

這種語法就是在雙分支語句的基礎上將if語句替換成了循環語句,如下所示:

else語句
看到這里,有朋友就會好奇了,這跟不加else有什么區別?不一樣的都是在不滿足循環條件時運行循環體外的語句嗎?

如果我們只是看這個測試代碼,確實,循環語句后加一個else語句與不加else語句并無區別,但是當我們在循環體中加入了轉向語句后,我們就能知道他們的區別在哪里了,如下所示:

else語句2
從測試結果中大家應該能夠明白在循環語句后加了else語句與不加else語句的區別了。

循環……else語句就像雙分支條件語句一樣,它們是一個整體,對于轉向語句breakcontinue而言,它們的作用是用來結束循環語句,因此,當循環體中出現轉向語句時,會直接結束整個循環,包括else語句。

下面我們通過一個例子來說明該語法的運用場景:

else語句3
可以看到實現同樣功能的代碼,第一次加了else,第二次沒有加else,但是輸出的結果卻不相同,第二次比第一次多輸出了一行信息。

導致這種錯誤的原因是因為對于該功能而言,我們在實際的運行中只會嘗試兩種結果——是質數與不是質數,也就是說這兩種判斷結果我們只需要輸出其中之一。

  • 當我們通過else語句來控制時,能完美的實現二者輸出其一的操作;
  • 但是當我們不加else時,第二個print語句屬于第一層循環的循環體中的內容,因此第二層循環的循環體中的break語句無法對其生效,所以會導致進行重復輸出的情況。

也就是說這種語法結構比較適合需要根據判斷條件進行不同輸出的結果,并且其中一種判斷條件需要通過循環來實現。

七、range()函數

range()函數作為Python中的內置函數,它的作用是生成一組數字序列,并將其以可迭代的對象進行返回,其返回值的類型為對象類型。該函數語法如下所示:

range(stop)
range(start, stop[, step])

函數中的參數的含義依次為:

  • start: 計數從 start 開始。默認是從 0 開始。例如 range(5) 等價于 range(0, 5)
  • stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是 [0, 1, 2, 3, 4] 沒有 5
  • step:步長,默認為 1。例如:range(0, 5) 等價于 range(0, 5, 1)

這里我們需要了解的是函數的第三個參數——步長(step)。

所謂的步長,我們可以理解為對象語句遞進的方式,函數默認的步長為1,其對象語句會依次增加1,當步長為n時,其對象語句依次增加n,如下所示:

range()
下面我們來簡單總結一下range函數的用法:

  • range函數可以用于生成一組數字序列,并將其作為可迭代對象返回,返回值的類型為對象類型;
  • range中的三個參數分別是序列開始值、序列結束值以及序列步長;
  • 開始值默認為0,序列步長默認為1
  • 當步長為負數時,傳入的序列開始值需要大于結束值

結語

今天的內容到這里就全部結束了,在下一篇內容中我們將介紹《Python中的函數》,大家記得關注哦!如果大家喜歡博主的內容,可以點贊、收藏加評論支持一下博主,當然也可以將博主的內容轉發給你身邊需要的朋友。最后感謝各位朋友的支持,咱們下一篇再見!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915435.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker|Linux|以centos基礎鏡像為基礎制作nmap專用鏡像(鏡像瘦身計劃)

一、 最近由于某些場景下需要使用nmap,而nmap的rpm安裝包在源目標機器上使用有軟件沖突,因此,計劃使用docker部署nmap 具體計劃為 1、使用centos的基礎鏡像,在有網環境下,通過配置阿里云的yum倉庫,在cen…

基于單片機公交車報站系統/報站器

傳送門 👉👉👉👉其他作品題目速選一覽表 👉👉👉👉其他作品題目功能速覽??????? 概述 公交車自動報站系統利用單片機作為核心控制器,結合GPS/北斗定位模塊、語音存…

Oracle 體系結構學習

1 認識Oracle后臺進程Oracle數據庫后臺進程是Oracle數據庫管理系統(DBMS)的核心組件,它們在后臺運行,負責數據庫的各種管理和維護任務。主要包括以下幾種:SMON (System Monitor)SMON負責數據庫的恢復操作,如…

構建一種安全的老式測試儀,用于具有限流燈泡,模擬儀表和可變輸出的交流設備

這個復古電路和電源測試儀的想法來自我需要一個簡單,安全,時尚的工具來測試和控制工作臺上的線路供電設備。商業解決方案要么太笨重,太昂貴,要么缺乏我喜歡的觸覺和模擬魅力。所以我決定自己造一個。這個測試儀的核心是一個老式的…

Redis5:Redis的Java客戶端——Jedis與SpringDataRedis詳解

目錄 1、Jedis客戶端 1.1使用過程 2、SpringDataRedis 2.1 SpingDataRedis介紹 2.2SpringDataRedis快速入門 2.3RedisTemplate的RedisSerializer 2.3.1RedisTemplate中JDK序列化局限性 2.3.2方式一:改變RedisTemplate的序列化方式 2.3.3RedisTemplate存儲一…

零基礎 “入坑” Java--- 十三、再談類和接口

文章目錄一、Object類1.獲取對象信息2.對象比較:equals方法二、再談接口1.比較相關接口2.Cloneable接口和深拷貝三、內部類1.匿名內部類2.實例內部類3.靜態內部類4.局部內部類在之前的學習中,我們已經了解了有關類以及接口的知識,在本章節中&…

Spring Boot 一個注解搞定「加密 + 解密 + 簽名 + 驗簽」

Spring Boot 一個注解搞定「加密 解密 簽名 驗簽」本文基于 Spring Boot 3.x,通過一個自定義注解 AOP,一行注解即可給任何 Controller 方法加上 請求解密 → 驗簽 → 響應加密 → 加簽 的完整鏈路,并可直接拷貝到生產環境使用。一、最終效…

《計算機網絡》實驗報告二 IP協議分析

目 錄 1、實驗目的 2、實驗環境 3、實驗內容 3.1 tcpdump 基本用法 3.2 wireshark基本用法 3.3 利用tcpdump抓包,wireshark分析包 4、實驗結果與分析 4.1 tcpdump命令的基本用法 4.2 wireshark的基本用法 4.3 利用tcpdump抓包,wireshark分析包…

k8s學習記錄(三):Pod基礎-Node選擇

一、前言 在上一篇文章中我們學習了Pod的一些基本的知識,今天我們將繼續學習Pod。 二、K8S如何選擇節點來運行Pod 我們知道在一個K8S集群中,會有多個工作節點(Worker Node),那么k8s會選擇那個node呢?接下…

3天功能開發→3小時:通義靈碼2.0+DEEPSEEK實測報告,單元測試生成準確率92%的秘密

活動鏈接:https://developer.aliyun.com/topic/lingma-aideveloper?spma2c6h.29979852.J_9593490300.2.49b8110eeymlF8 前言 隨著人工智能技術的迅猛發展,AI 賦能編程成為了必然趨勢。通義靈碼應運而生,它是阿里巴巴集團在人工智能與編程領…

【小沐學GIS】基于Rust繪制三維數字地球Earth(Rust、OpenGL、GIS)

🍺三維數字地球GIS系列相關文章如下🍺:1【小沐學GIS】基于C繪制三維數字地球Earth(OpenGL、glfw、glut)第一期2【小沐學GIS】基于C繪制三維數字地球Earth(OpenGL、glfw、glut)第二期3【小沐學GI…

ARM 學習筆記(三)

參考文獻:《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》《ARM Cortex-A (ARMv7-A) Series Programmer’s Guide》1、內存類型 ARMv7-A 處理器中,將 Memory 定義為幾種類型(Memory Type): Strong…

Flask 框架(一):核心特性與基礎配置

目錄 一、為什么選擇 Flask? 二、Flask 核心概念與初始化 2.1 程序實例初始化 2.2 運行配置:app.run () 參數詳解 2.3 應用配置:三種參數設置方式 1. 字典直接配置(簡單臨時場景) 2. 配置文件導入(生…

社交圈子系統開源社交源碼 / 小程序+H5+APP 多端互通的底層技術分析

伴隨社交產品向“圈子化”、“內容驅動”發展方向演進,打造一套支持小程序、H5、APP 互通的社交圈子系統,已經成為構建垂直社區的基礎架構能力要求。本文圍繞一套典型的多端社交興趣平臺(即友貓社區平臺)的設計實踐,對…

gitlab-runner配置問題記錄

引言 筆者曾通過2種方式部署過 gitlab-runner,在 gitlab 中使用這個 runner 拉起 ci job 的過程中或多或少遇到些問題,主要都是 job 中無法訪問宿主機的docker 等組件。本篇文檔主要記錄 gitlab-runner 安裝及相關配置。 二進制部署 gitlab-runner 部署 …

每日面試題10:令牌桶

令牌桶算法:優雅的流量控制藝術在現代分布式系統中,流量控制如同交通信號燈般重要——它既不能讓請求"堵死"系統,也不能放任流量"橫沖直撞"。令牌桶算法(Token Bucket Algorithm)正是這樣一種精妙…

【java】消息推送

文章目錄Java網頁消息推送解決方案 短輪詢、長輪詢、SSE、Websocket

STM32 | 有源蜂鳴器響,無源蜂鳴器播音樂

目錄 Overview 有源蜂鳴器 無源蜂鳴器 有源蜂鳴器控制 GPIO配置 控制程序 無源蜂鳴器控制 反轉GPIO控制 GPIO配置 控制接口 PWM控制 GPIO配置 控制函數 改變頻率播音樂 原理 1. 頻率決定音調 2. 占空比決定音量 GPIO初始化 結構體定義和音符頻率表 播放接口 …

第十四章 gin基礎

文章目錄Gin快速搭建一個web服務Gin數據交互JSON串內容規范Gin使用結構體返回數據給前端Gin配置POST類型的路由Gin獲取GET請求參數Gin獲取POST請求參數-form-data類型Gin獲取POST請求參數-JSON類型Gin獲取參數綁定至結構體Gin快速搭建一個web服務 下載包 \\新建一個文件&…

Baumer工業相機堡盟工業相機如何通過YoloV8的深度學習模型實現PCB的缺陷檢測(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8的深度學習模型實現PCB的缺陷檢測(C#代碼,UI界面版)工業相機使用YoloV8模型實現PCB的缺陷檢測工業相機實現YoloV8模型實現PCB的缺陷檢測的技術背景在相機SDK中獲取圖像轉換圖像的代碼分析工業相機圖…