第五章 條件、迴圈及其他語句
一、print
列印多個引數,print可用於列印一個表示式,這個表示式要麼是字串,要麼將自動轉換為字串,而且你還可以列印多個表示式,條件用逗號隔開它們。
print (‘age’, 42)->age42
如果想中間有冒號隔開,則print (‘age’ +’:’, 42)->age:42
sep=“符號” 可以定義分割符
end="符號/空格"可以定義換行符 (適用於多個print語句中,一般存在與腳本當中)
print(‘I’, ‘wish’, ‘to’ ‘register’, ‘a’, ‘complaint’, sep=’_’) -> I_wish_to_register_a_complaint’
二、模組的不同匯入方法
- import somemodule
- from somemodule import somefunction(函式方法)
- from somemodule import somefunction, anotherfunction, yetanotherfunction
- from somemodule import *
三、賦值魔法
1. 序列解包
以前的賦值都是單個變數進行賦值,但其實是可以多個變數一起賦值,但要求值的個數與變數個數一致,否則會出現報錯:
如x,y,z=1,2,3 print (x,y,z)->1,2,3 並且可以交換多個變數的值 x,y=2,1 print (x, y,z)->2,1,3
有的變數還可以包含多個值,加上星號()就可以,但主要星號是在變數前面;此外,值得注意的是,帶星號賦值的變數解壓出來是一個列表,而且任何位置的變數都可以加上星號進行賦值多個值,只要變數與值的個數匹配就行
a, b, *rest=[1,2,3,4] rest ->[3,4] a, *b, c='abc' a, b, c ->(a, ['b'], c)
2. 鏈式賦值
鏈式賦值是一種快捷方式,用於將多個變數關聯到同一個值。
`x=y=somefunction( ) == (y=somefunction( ) x=y) 前後兩種賦值是等價的,一個一步完成,即鏈式賦值,一個拆分為兩步。
3. 增強賦值
使用增強賦值,可以使程式碼更緊湊、更簡潔,同時在很多情況下的可讀性更強。
比如程式碼x=x+1可以將右邊的+移動左邊,寫成x+=1,這種表達方式成為增強賦值,不僅使用於+號,其他運算子(、/、%等)可適用,同時,增強語句也可用於其他資料型別,只要可以使用雙目運算子即可
fnord='foo' fnord+='bar' fnord *=2 fnord -> 'foobarfoobar'
四、程式碼塊:縮排的樂趣
程式碼塊是一組語句組成,可在滿足條件時執行(if 語句),可執行多次(迴圈)等等,程式碼塊是通過縮排程式碼建立,使用冒號(:)指出接下來是一個程式碼塊,並將該程式碼塊中每行程式碼都縮排相同的程度。發現縮排量與之前相同時,表明當前程式碼塊已經結束了。
五、條件和條件語句
用作布林表示式(如用作if語句中的條件)時,下面的值都將被直譯器視為假:
False、 None、 0、 “”、 ()、 []、 {} (即除了這七個外,其他值都可表示為真)
布林值(True和False)屬於型別bool, 其與list、str和tuple一樣,可用來轉換其它的值。
bool ('I think, there i am') -> True
1. 條件分支
if 條件: 條件為真(True)執行的操作 else: 條件為假(False)執行的操作
此外,還有elif語句,可以多增加幾個條件,使得程式碼更為複雜,if語句裡還可以巢狀if或elif語句,這樣程式碼更緊湊,可執行的條件也更多
name=input('what is your name') if name.endswith('Gumby'): print ('hello, mr. gumby')
if語句則是讓你有條件執行的程式碼。這意味著,如果條件(if 和冒號之間的表示式)為前面定義的真,就執行後續的程式碼塊(這裡為print語句);如果條件為假,就不執行
num=int (input ('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')
2. 更復雜的條件
1)比較運算子
- x ==y:x等於y(注意是兩個等號,而不是一個)
- x<y:x小於y
- x>y:x大於y
- x>=y:x大於等於y
- x!=y:x小於等於y
- x is y:x和y是同一個物件(注意是相同物件,而不是相等)
- x is not y:x和y不是同一個物件
- x in y:x是容器(如序列)y的成員
- x not in y:x不是容器(如序列)y的成員
- 注意還有鏈式比較表示式,即0<x<10這種表示式
**is:相同運算子 **
x=y=[1,2,3] z=[1,2,3] x==y->True x==z->True x is y ->True x is z ->False
一定要注意,is是判斷是否相同物件,而並不是比較兩個值是否相等。
字串和序列的比較(字串是根據字元的字母排列順序進行比較的,要注意的是字母都是Unicode符)
2)**布林運算子 **
- and
- or
- not
number= int (input ('Enter a number between 1 and 10:'))
if number <=10 and number<=1:
print ('great')
else:
print ('wrong')
- 斷言(assert)
其語法與if條件分支語句,當這個關鍵字後面的條件為假時,程式會自動崩潰並丟擲AssertionError的異常。
一般用於當測試程式時,要確保程式一定為真時,可以用斷言語句在程式一開始出現假時即奔潰,防止其一直執行錯誤的程式,同時還佔用記憶體。
**六、迴圈 **
重複執行程式碼時需要用到迴圈,主要有while語句和for語句
**1. while 迴圈 **zai
while迴圈中,只要條件為真,就會一直迴圈重複執行那段程式碼,這段程式碼也稱為迴圈體。
while 條件:
迴圈體
x=1
while x<=100:
print (x)
x+=1
**2. for 迴圈 **
while迴圈只在條件為真時反覆執行程式碼塊。要指定條件反覆執行時,一般要用到for迴圈,可以自定義要迭代(也稱為遍歷)的物件:
上面的程式碼可以寫成:
for i in range (1, 101):
print (i)
這段程式碼比while迴圈更為簡單緊湊,所以,一般能用for迴圈寫的程式碼,儘量避免使用while迴圈來寫;
range ( )函式
range ([start, ] stop [, step=1]) :一共有三個引數,其中中括號內的引數可以省略,有點類似於切片,,它包含起始位置,但不包括結束位置。step相當於步長,預設為1
for i in range(1, 10,2):
print (i)
1
3
5
7
9
for迴圈還可以用於迭代字典,即判斷鍵是否存在就行
d={'x':1, 'y':2, 'z':3}
for key in d:
print (key, 'corresponds to', d[key])
由於字典元素的排列順序是不確定的,所以迭代字典的鍵或值時也是不確定的。
**3. 迭代工具(內建函式) **
** zip函式:並行迭代 **
它可將兩個序列“縫合”起來,並返回一個由元組組成的序列,返回值是一個適合迭代的物件,要檢視其內容,可使用list將其轉化為列表,在不適用zip函式時可以採用索引也能達到該效果,但程式碼過於複雜
names=['anne', 'beth', 'george', 'damon']
ages=[12,45,32,102]
for i in range(len(names)):
print (names[i], 'is', age[i], 'years old')(注意任何一個符號都缺一不可,相互之間應該用逗號隔開,否則會出現報錯
用zip可以表示如下
for name, age in zip(names, ages):
print (name, 'is', age, 'years old')
以上例子都是迭代兩個個數相同的序列,如果序列長度不同時,函式zip將在最短的序列用完後停止“縫合”。
list zip((range(5), range(100)))
[(0,0),(1,1),(2,2),(3,3),(4,4)]
- enumerate:迭代時獲取索引
在迭代物件序列的同時獲取當前物件的索引。
如想替換一個字串列表中所有包含子串"xxx”的字串。
for index, string in enumerate (strings):
if 'xxx' in string:
strings[index]='[censored]'
- reversed:反向迭代
- sorted:排序後迭代
4. 跳出迴圈 - break語句:終止當前迴圈,跳出迴圈體
from math import sqrt
for n in range(99, 0, -1):
root =sqrt(n)
if int(root)=root:
print(n)
break
->81
- contine語句:終止本輪迴圈並開始下一輪迴圈(在開始下一輪迴圈前,會先測試迴圈條件),但不結束迴圈。當迴圈體龐大而複雜是,存在多個要跳過它的原因時很有用。
- pass語句:pass是空語句,是為了保持程式結構的完整性。pass 不做任何事情,一般用做佔位語句。
- while True/break
while True;
word=input('please enter a word: ‘)
if not word: break
print('the word was ', word)
while True導致迴圈永不結束,但將條件放在了迴圈體內的一條if語句中,而這條if語句將在條件滿足時呼叫break.這說明並非只能像常規while迴圈那樣只能在迴圈開頭結束迴圈,而是可在迴圈的任何地方結束迴圈。if/break行將整個迴圈分成兩部分:第一部分負責設定(如果是常規while迴圈,將重複部分),第二部分在迴圈條件為真時使用第一部分初始化的資料。
-簡單推導
列表推導是一種從其他列表建立列表的方式,類似於數字中的集合推導,列表推導的原理與for迴圈比較類似。
result=[]
for x in range(3):
for y in range(3):
result.append((x,y))
用列表推導式可以寫成:[(x,y)for x in range(3)for y in range(3)]
其他的還可以加入if語句:[x*x for x in range(10)if x%3==0]
del語句:可用於刪除物件名稱,但物件值其實並沒有刪除,即使如此,python中沒有對應名稱,也無法解釋出對應的值,而值在直譯器中儲存一段時間後一直沒有訪問,會被自動刪除。
excel語句
eval語句