python的两种循环结构_python分支和循环结构
Python
Python開發
Python語言
python分支和循環結構
1.分支結構
1.1應用場景
迄今為止,我們寫的Python代碼都是一條一條語句順序執行,這種代碼結構通常稱之為順序結構。然而僅有順序結構并不能解決所有的問題,比如我們設計一個游戲,游戲第一關的通關條件是玩家獲得1000分,那么在完成本局游戲后,我們要根據玩家得到分數來決定究竟是進入第二關,還是告訴玩家“Game Over”,這里就會產生兩個分支,而且這兩個分支只有一個會被執行。類似的場景還有很多,我們將這種結構稱之為“分支結構”或“選擇結構”。
1.2 if語句的使用
在Python中,要構造分支結構可以使用if、elif和else關鍵字。所謂關鍵字就是有特殊含義的單詞,像if和else就是專門用于構造分支結構的關鍵字,很顯然你不能夠使用它作為變量名(事實上,用作其他的標識符也是不可以)。
01-單分支
下面的例子中演示了如何構造一個分支結構。
"""
用戶身份驗證
Version:?0.1
Author:?along
"""
username?=input('請輸入用戶名:?')
password?=input('請輸入密碼:?')
ifusername?=='along'andpassword?=='12345':
print('驗證通過')
else:
print('驗證失敗')
唯一需要說明的是和C/C++、Java等語言不同,Python中沒有用花括號來構造代碼塊而是使用了縮進的方式來設置代碼的層次結構,如果if條件成立的情況下需要執行多條語句,只要保持多條語句具有相同的縮進就可以了,換句話說連續的代碼如果又保持了相同的縮進那么它們屬于同一個代碼塊,相當于是一個執行的整體。
02-多分支
當然如果要構造出更多的分支,可以使用if…elif…else…結構,例如下面的分段函數求值。
"""
分段函數求值
3x?-?5??(x?>?1)
f(x)?=??x?+?2???(-1?<=?x?<=?1)
5x?+?3??(x?<?-1)
Version:?0.1
Author:?along
"""
x?=float(input('請輸入一個數:?'))
ifx?>1:
y?=3*?x?-5
elifx?>=?-1andx?<=1:
y?=?x?+2
else:
y?=5*?x?+3
print('f(%.2f)?=%.2f'%?(x?,?y))
03-嵌套分支
當然根據實際開發的需要,分支結構是可以嵌套的,例如判斷是否通關以后還要根據你獲得的寶物或者道具的數量對你的表現給出等級(比如點亮兩顆或三顆星星),那么我們就需要在if的內部構造出一個新的分支結構,同理elif和else中也可以再構造新的分支,我們稱之為嵌套的分支結構,也就是說上面的代碼也可以寫成下面的樣子。
"""
分段函數求值
3x?-?5??(x?>?1)
f(x)?=??x?+?2???(-1?<=?x?<=?1)
5x?+?3??(x?<?-1)
Version:?0.1
Author:?along
"""
x?=float(input('x?=?'))
ifx?>1:
y?=3*?x?-5
else:
ifx?>=?-1:
y?=?x?+2
else:
y?=5*?x?+3
print('f(%.2f)?=%.2f'%?(x,?y))
說明:大家可以自己感受一下這兩種寫法到底是哪一種更好。在之前我們提到的Python之禪中有這么一句話“Flat is better than nested.”,之所以提倡代碼“扁平化”是因為嵌套結構的嵌套層次多了之后會嚴重的影響代碼的可讀性,所以能使用扁平化的結構時就不要使用嵌套。
1.3練習
練習1:英制單位英寸與公制單位厘米互換。
參考答案:
"""
英制單位英寸和公制單位厘米互換
Version:?0.1
Author:?along
"""
value?=float(input('請輸入長度:?'))
unit?=input('請輸入單位:?')
ifunit?=='in'orunit?=='英寸':
print('%f英寸=%f厘米'%?(value,?value?*2.54))
elifunit?=='cm'orunit?=='厘米':
print('%f厘米=%f英寸'%?(value,?value?/2.54))
else:
print('請輸入有效的單位')
練習2:百分制成績轉換為等級制成績。
要求:如果輸入的成績在90分以上(含90分)輸出A;80分-90分(不含90分)輸出B;70分-80分(不含80分)輸出C;60分-70分(不含70分)輸出D;60分以下輸出E。
參考答案:
"""
百分制成績轉換為等級制成績
Version:?0.1
Author:?along
"""
score?=float(input('請輸入成績:?'))
ifscore?>=90:
grade?='A'
elifscore?>=80:
grade?='B'
elifscore?>=70:
grade?='C'
elifscore?>=60:
grade?='D'
else:
grade?='E'
print('對應的等級是:',?grade)
練習3:輸入三條邊長,如果能構成三角形就計算周長和面積。
參考答案:
"""
判斷輸入的邊長能否構成三角形,如果能則計算出三角形的周長和面積
Version:?0.1
Author:?along
"""
a?=float(input('a?=?'))
b?=float(input('b?=?'))
c?=float(input('c?=?'))
ifa?+?b?>?canda?+?c?>?bandb?+?c?>?a:
print('周長:%f'%?(a?+?b?+?c))
p?=?(a?+?b?+?c)?/2
area?=?(p?*?(p?-?a)?*?(p?-?b)?*?(p?-?c))?**0.5
print('面積:%f'%?(area))
else:
print('不能構成三角形')
說明:上面使用的通過邊長計算三角形面積的公式叫做
注意復習下學生時代的等邊三角形、直角三角形等知識哦,博主當時就忘了。(捂臉~)
2.循環結構
2.1應用場景
如果在程序中我們需要重復的執行某條或某些指令,例如用程序控制機器人踢足球,如果機器人持球而且還沒有進入射門范圍,那么我們就要一直發出讓機器人向球門方向奔跑的指令。當然你可能已經注意到了,剛才的描述中不僅僅有需要重復的動作,還需要用到上一章講的分支結構。再舉一個簡單的例子,我們要實現一個每隔1秒中在屏幕上打印一次"hello, world"并持續打印一個小時的程序,我們肯定不能夠直接把print('hello, world')這句代碼寫3600遍,如果真的要這樣做,那么編程的工作就太無聊乏味了。因此,我們還需要了解一下循環結構,有了循環結構我們就可以輕松的控制某件事或者某些事重復、重復、再重復的去執行。
在Python中構造循環結構有兩種做法,一種是for-in循環,一種是while循環。
2.2 for-in循環
如果明確的知道循環執行的次數或者要對一個容器進行迭代(后面會講到),那么我們推薦使用for-in循環。
01-案例1
例如下面代碼中計算1~100求和的結果($displaystyle sum limits_{n=1}^{100}n$)。
"""
用for循環實現1~100求和
Version:?0.1
Author:?along
"""
sum=0
forainrange(101):
sum+=?a
print(sum)
需要說明的是上面代碼中的range(101)可以用來構造一個從0到100的取值范圍,這樣就可以構造出一個整數的序列并用于循環中,例如:
range(101)可以產生一個0到100的整數序列。
range(1, 100)可以產生一個1到99的整數序列。
range(1, 100, 2)可以產生一個1到99的奇數序列,其中2是步長,即數值序列的增量。
forbinrange(10):
print(b)
forbinrange(1,10):
print(b)
forbinrange(1,10,2):
print(b)
02-案例2
知道了這一點,我們可以用下面的代碼來實現1~100之間的偶數求和。
"""
用for循環實現1~100之間的偶數求和
Version:?0.1
Author:?along
"""
sum=0
foriinrange(2,101,2):
sum+=?i
print(sum)
03-for_in和if結合
也可以通過在循環中使用分支結構的方式來實現相同的功能,代碼如下所示。
"""
用for循環實現1~100之間的偶數求和
Version:?0.1
Author:?along
"""
sum=0
foriinrange(1,101):
ifi?%2==0:
sum+=?i
print(sum)
2.3 while循環
如果要構造不知道具體循環次數的循環結構,我們推薦使用while循環。while循環通過一個能夠產生或轉換出bool值的表達式來控制循環,表達式的值為True循環繼續,表達式的值為False循環結束。
01-無限循環
下面我們通過一個“猜數字”的小游戲(計算機出一個1~100之間的隨機數,人輸入自己猜的數字,計算機給出對應的提示信息,直到人猜出計算機出的數字)來看看如何使用while循環。
"""
猜數字游戲
計算機出一個1~100之間的隨機數由人來猜
計算機根據人猜的數字分別給出提示大一點/小一點/猜對了
Version:?0.1
Author:?along
"""
importrandom
answer?=?random.randint(1,100)
counter?=0
#?print(answer)
whileTrue:
counter?+=1
number?=int(input('請輸入一個數字:?'))
ifnumber?>?answer:
print('小一點')
elifnumber?<?answer:
print('大一點')
else:
print('恭喜你,答對了')
break
print('你總共猜了%d次'%?counter)
ifcounter?>=7:
print('你的智商余額明顯不足')
上面的代碼中使用了break關鍵字來提前終止循環,需要注意的是break只能終止它所在的那個循環,這一點在使用嵌套的循環結構(下面會講到)需要引起注意。除了break之外,還有另一個關鍵字是continue,它可以用來放棄本次循環后續的代碼直接讓循環進入下一輪。
02-嵌套循環
和分支結構一樣,循環結構也是可以嵌套的,也就是說在循環中還可以構造循環結構。下面的例子演示了如何通過嵌套的循環來輸出一個九九乘法表。
"""
輸出乘法口訣表(九九表)
Version:?0.1
Author:?along
"""
foriinrange(1,10):
forjinrange(1,?i?+1):
print('%d*%d=%d'%?(j,?i,?i?*?j),end='t')
print()
2.4練習
練習1:輸入一個正整數判斷是不是素數。
提示:素數指的是只能被1和自身整除的大于1的整數。
參考答案:
"""
輸入一個正整數判斷它是不是素數
Version:?0.1
Author:?along
"""
frommathimportsqrt
num?=int(input('請輸入一個正整數:?'))
end?=int(sqrt(num))
is_prime?=True
forxinrange(2,?end?+1):
ifnum?%?x?==0:
is_prime?=False
break
ifis_primeandnum?!=1:
print('%d是素數'%?num)
else:
print('%d不是素數'%?num)
練習2:輸入兩個正整數,計算它們的最大公約數和最小公倍數。
參考答案:
"""
輸入兩個正整數計算它們的最大公約數和最小公倍數
Version:?0.1
Author:?along
"""
x?=int(input('x?=?'))
y?=int(input('y?=?'))
#如果x大于y就交換x和y的值
ifx?>?y:
#通過下面的操作將y的值賦給x,將x的值賦給y
x,?y?=?y,?x
#從兩個數中較的數開始做遞減的循環
forfactorinrange(x,0,?-1):
ifx?%?factor?==0andy?%?factor?==0:
print('%d和%d的最大公約數是%d'%?(x,?y,?factor))
print('%d和%d的最小公倍數是%d'%?(x,?y,?x?*?y?//?factor))
break
練習3:打印如下所示的三角形圖案。
注:先"左"直角、”右“直角、最后等腰三角形
*
**
***
****
*****
*
**
***
****
*****
*
***
*****
*******
*********
參考答案:
"""
打印三角形圖案
Version:?0.1
Author:?along
"""
row?=int(input('請輸入行數:?'))
foriinrange(row):
for_inrange(i?+1):
print('*',end='')
print()
foriinrange(row):
forjinrange(row):
ifj?<?row?-?i?-1:
print('?',end='')
else:
print('*',end='')
print()
foriinrange(row):
for_inrange(row?-?i?-1):
print('?',end='')
for_inrange(2*?i?+1):
print('*',end='')
print()
如果對linux中的分支和循環結構感興趣的話,請選擇傳送。
內容來源于網絡,如有侵權請聯系客服刪除
總結
以上是生活随笔為你收集整理的python的两种循环结构_python分支和循环结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python爬虫如何设置代理IP
- 下一篇: python的opencv库_用于Pyt