【Python】05、python程序結構控制語句
一、程序結構
程序結構:語句和表達式按照什麽樣的順序執行
所有語言無非就三種程序結構:
順序:默認結構
語句從上到下依次一行一行的執行,
分支:選擇一個分支執行,永遠最多只執行一個分支
循環:
二、分支結構語句
1、Python的比較操作
所有的Python對象都支持比較操作,可用於測試相等性、相對大小等
如果是復合對象,Python會檢查其所有部分,包括自動遍歷各級嵌套對象,直到可以得出最終結果
測試操作符:
“ ==”操作符測試值的相等性
“is”表達式測試對象的一致性
還有很多比如: <,>,=,
Python中不同類型的比較方法:
數字:通過相對大小進行比較
字符串:按照字典次序逐字符進行比較
列表和元組:自左至右比較各部分內容
字典:對排序之後的(鍵、值)列表進行比較
Python中真和假的含義
非零數字為真,否則為假
非空對象為真,否則為假
None則始終為假
組合條件測試
and
or
not 非運算:返回True或False
註意:Python中,and和or運算會返回真或假的對象,而不是True或False,
and和or是短路操作符
2、分支結構
if boolean_expression1: # boolean_expression 布爾表達式可為真可為假
suite1
elif boolean_expression2:
suite2
…
else:
else_suite
elif 語句是可選的,else語句也是可選的
僅用於占位,而後再填充相關語句時,可以使用pass
In [168]: a = 5 # 主幹 In [169]: if a < 10: # 分支結構 ...: print("a less than 10") # 分支結構 ...: print(a) # 主幹 ...: a less than 10 5 In [41]: x=3 In [42]: y=4 In [45]: if x<y: # 單分支 print y ....: 4 In [48]: if x<y: # 雙分支 ....: print "the max number is: %d" %y ....: else: ....: print "the max number is: %d" %x ....: the max number is: 4 In [51]: if x<y: # 多分支 ....: print y ....:elif x>y: ....: print x ....:else: ....: print x,y ....: 4
3、if/else三元表達式
通常在為某變量設定默認值時通常用到的如下格式
if X:
A = Y
else:
A = Z
可以改寫為如下簡短格式:
A = Y if X else Z # 如果X是True則,A=Y,否則A=Z
其通用條件表達式語法格式為:
expression1 if boolean_expressionelse expression2
表達式1 條件(布爾表達式) 表達式2
如果boolean_expression的值為True,則條件表達式的結果為expression1,否則為expression2
三、循環結構語句
1、循環機制及應用場景
while循環
用於編寫通用叠代結構
頂端測試為真即會執行循環體,並會重復多次測試直到為假後執行循環後的其它語句
for循環
一個通用的序列叠代器,用於遍歷任何有序的序列對象內的元素
可用於字符串、元組、列表和其它的內置可叠代對象,以及通過類所創建的新對象
2、while
語法格式:
while boolean_expression:
while_suite
else:
else_suite
else分支為可選部分
只要boolean_expression的結果為True,循環就會執行;
boolean_expression的結果為False時終止循環,此時如果有else分支,則會執行一次。
一定要有某種機制來退出循環,通常是在需循環體裏修改條件
In [183]: i = 0 In [184]: while i < 10: ...: print(i) ...: i += 1 ...: 0 1 2 3 4 5 6 7 8 9
3、for/in
語法格式:
for expression1 in iterable: # interable為可叠代對象
for_suite
else:
else_suite
通常,expression或是一個單獨的變量,或是一個變量序列,一般以元組的形式給出
如果以元組或列表用於expression,則其中的每個數據項都會拆分到表達式的項,
In [191]: for i in range(10): ...: print(i) ...: 0 1 2 3 4 5 6 7 8 9
for/in循環中永遠不要修改可叠代對象
3、break、continue 、pass 和else
break
跳出所處的最近層循環
continue
跳過循環題剩下的部分,跳到所處的最近層循環的開始處;
break,continue 只能出現在循環結構中
In [200]: for i in range(10): ...: if i == 5: ...: continue ...: print(i) ...: 0 1 2 3 4 6 7 8 9 In [201]: for i in range(10): ...: if i == 5: ...: break ...: print(i) ...: 0 1 2 3 4
pass
占位語句
當語法需要語句但還沒有任何實用語句可寫時使用
else代碼塊
只要循環是正常終止,else分支就會執行
在由於break語句、或由於返回語句(如果循環在函數或方法內)、或由於發生異常導致跳出循環,則else分支不會執行
4、循環語法格式擴展
語法格式:
while boolean_expression1:
while_suite
if boolean_expression2:
break
if boolean_expression3:
continue
else:
else_suite
for expressionin1 iterable:
for_suite
if boolean_expression2:
break
if boolean_expression3:
continue
else:
else_suite
In [85]: url="www.magedu.com";x=0 In [86]: while url: ....: print url ....: url=url[:-1] ....: x +=1 ....: if x>7: ....: break ....: else: ....: print "game over" ....: www.magedu.com www.magedu.co www.magedu.c www.magedu. www.magedu www.maged www.mage www.mag In [87]:
死循環
while True:
shile_suite
沒有退出條件,一直執行循環體
練習:
1、求100萬以內的所有素數
假如a*b=c(a、b、c都是整數),那麽我們稱a和b就是c的因數。
質數:又稱素數,除了1和它本身以外不再有其他因數的數稱為質數。
0和1都既不是質數也不是合數
為什麽質數檢驗到N的開方就可以結束了?
因為所有N的除數都是以根號N為軸對稱的
假如一個數N是合數,它有一個約數a,a×b=N,則a、b兩個數中必有一個大於或等於根號N,一個小於或等於根號N;因此,只要小於或等於根號N的數(1除外)不能整除N,則N一定是素數.
所以判斷一個數為質數與否的復雜度為O(根號N)
判斷一個數是否素數的方法:
In [6]: x = 10 In [7]: for i in range(2, x): ...: if x % i == 0: ...: break ...: else: ...: print(x) ...: In [8]: x = 7 In [9]: for i in range(2, x): ...: if x % i == 0: ...: break ...: else: ...: print(x) ...: 7
100以內的素數及其總個數:
In [25]: c = 0 In [26]: for x in range(2, 100): ...: for i in range(2, x): ...: if x % i == 0: ...: break ...: else: ...: print(x) ...: c += 1 ...: print("sum is: ",c) ...: ...: ...: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 sum is: 25
100W以內的素數個數:
In [41]: c = 0 In [42]: for x in range(2, 1000000): ...: for i in range(2, int(x ** 0.5) + 1): ...: if x % i == 0: ...: break ...: else: ...: c += 1 ...: print(c) ...: 78498
2、求任意整數的級數和
無窮級數中,幾何級數又稱為等比級數。
幾何級數(即等比級數)的和為:當︱q︱<1 時a+aq+aq^2+……+aq^n+……=a/(1-q)
sum = 0 In [44]: for n in range(11): ...: sum += 3 * 2**n ...: print(sum) ...: 3 9 21 45 93 189 381 765 1533 3069 6141 In [45]
3、求菲波那切數列的第101位
斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
這個數列從第3項開始,每一項都等於前兩項之和
In [52]: for i in range(0, 102): ...: if i == 0: ...: y = 1 ...: elif i == 1: ...: x = 1 ...: y = 1 ...: else: ...: tmp = y ...: y = x + y ...: x = tmp ...: print(y) ...: 927372692193078999176 In [21]: a=0 In [22]: b=1 In [23]: i=0 In [24]: while i <= 101: ...: print(b) ...: a, b, i= b, a+b, i+1 ...: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994 190392490709135 308061521170129 498454011879264 806515533049393 1304969544928657 2111485077978050 3416454622906707 5527939700884757 8944394323791464 14472334024676221 23416728348467685 37889062373143906 61305790721611591 99194853094755497 160500643816367088 259695496911122585 420196140727489673 679891637638612258 1100087778366101931 1779979416004714189 2880067194370816120 4660046610375530309 7540113804746346429 12200160415121876738 19740274219868223167 31940434634990099905 51680708854858323072 83621143489848422977 135301852344706746049 218922995834555169026 354224848179261915075 573147844013817084101 927372692193078999176 In [25]:
【Python】05、python程序結構控制語句