1. 程式人生 > >第五章 條件、迴圈及其他語句

第五章 條件、迴圈及其他語句

一、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’

二、模組的不同匯入方法
  1. import somemodule
  2. from somemodule import somefunction(函式方法)
  3. from somemodule import somefunction, anotherfunction, yetanotherfunction
  4. 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')  
  1. 斷言(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語句