博文大綱:

  • 一、Python條件判斷
  • 二、Python的循環
  • 三、循環的控制
  • 四、Python的循環綜合示例

一、Python條件判斷

Python中的條件判斷語句有if語句,if雙分支、if多分支語句,其執行過程與shell中的if語句完全一樣,只是語法有些差異,如下(文中所有的if語句執行流程圖都是借鑒與shell中的):

注意:在Python中,關于代碼縮進有嚴格的要求,Python是采用空格縮進的方式表示一組語句,通常用4個空格表示一組語句(默認會有4個空格縮進),使我們在編寫代碼時減少代碼的工作量。

1、單分支if語句:

執行過程:

Python條件與循環_第1張圖片

單分支if語句示例:

            
              money = 1000      #首先定義一個變量
if (money > 500):     #測試條件是:如果money變量大于500,則條件成立,輸出下面的內容
    print '吃大餐'      #輸出的內容為吃大餐,該print語句就是if中的代碼塊,默認print前面有4個空格
            
          

2、雙分支if語句:

執行過程:

Python條件與循環_第2張圖片

雙分支if語句示例:

            
              money = 1000
if (money < 500):
    print '吃大餐'
else:
    print '吃土'
            
          

3、多分支if語句:

執行過程:
Python條件與循環_第3張圖片

多分支if語句示例:

            
              print '你還有多少錢?'         #輸出提示信息
money = input()     #定義一個變量,變量值是接受鍵盤輸入的值。
if (money > 500):    #如果變量值大于500,則輸出“吃大餐”
    print '吃大餐'
elif (money > 100):   #如果變量值大于100,則輸出“吃蓋飯”
    print '吃蓋飯'
else:            #如果前面兩個條件都不成立,則輸出“吃土”
    print '吃土'
            
          

4、使用if語句常見的問題:

問題(1): 使用if-elif-else語句時,容易出現邏輯錯誤,因為條件是從上往下判斷的,如果條件成立,那么下面的條件判斷就不執行了,拿剛才的舉例來說,若將代碼寫成下面這個樣子:

            
              print '你還有多少錢?'         #輸出提示信息
money = input()     #定義一個變量,變量值是接受鍵盤輸入的值。
if (money > 100):    #如果變量值大于500,則輸出“吃大餐”
    print '吃大餐'
elif (money > 500):   #如果變量值大于100,則輸出“吃蓋飯”
    print '吃蓋飯'
else:            #如果前面兩個條件都不成立,則輸出“吃土”
    print '吃土'
            
          

可以看出來會發生什么問題么?問題就是只要你輸入的值大于100,那么它就將輸出“吃蓋飯”,哪怕你輸入的是800,它也不會輸出“吃大餐”,因為第一個條件測試成立了,執行完第一段代碼塊后,程序就直接跳出了這個if-elif-else語句,后面都不執行了。

問題(2): if語句中語句塊沒有縮進也是容易犯的錯誤,如下代碼編譯器會直接報錯:

            
              money = 1000      #首先定義一個變量
if (money > 500):    
 print '吃大餐'    #這一行語句沒有代碼塊,程序必定會報錯,不能正常運行
            
          

還要保證同級語句縮進空格的絕對一致,即使只有一個空格的差別,它們已經表示不同的語句塊了,錯誤的示范如下:

            
              money = 1000      #首先定義一個變量
if (money > 500):    
    print '吃大餐' 
         print '吃大餐'     #多了一個空格

            
          

問題(3): 對于使用其他語言轉Python的朋友,由于習慣會經常忘記條件測試后面的冒號(感覺是在說我自己),需要多多注意。

二、Python的循環

編寫程序時經常有代碼需要重復運行,Python提供了while和for進行循環。

1、while循環

while循環可以根據條件進行判斷,決定是否要循環執行語句塊,語法如下:

            
              while 循環語句:
    循環操作語句
            
          

while語句的執行流程如下:
循環條件后面也要使用冒號,然后縮進寫循環操作語句,先判斷條件是否成立,如果為True,則執行循環操作語句,如果為False,則跳出循環

            
              i = 1            #定義一個變量
sum = 0      #定義一個變量
while i <= 3:       #測試條件是變量“i”小于或等于3,則執行下面循環體中的語句
    print ('請輸入第%d個月的工資:' %i)            #等待鍵盤輸入工資,并賦值給變量“i”
    sum = sum + int(input())       #將上面鍵盤輸入的工資數和變量sum相加,并在賦值給變量sum
    i = i + 1  #執行一次變量“i”的值就+1。
#執行至此,然后返回去再進行判斷,變量“i”是否小于或等于3,如果是,則再執行一遍循環語句;
#如果不是,則跳出循環,執行下面的語句
#注意,以下都沒有縮進了,已經不屬于while循環了
month = i - 1      #當循環條件不成立時,“i”的值都已經為4了,所以這里要減去1,并賦值給變量month
avg = sum / month       #把3個月的工資總和除以月份,就是平均工資
print ('近%d個月的平均工資是%d' %(month,avg))             #輸出平均工資信息
#在上面的輸出語句中,“%d”表示將后面的%(month,avg)這兩個變量的值,依次賦值給語句中的兩個“%d”
            
          

執行的結果如下:

            
              請輸入第1個月的工資:             #手動依次輸入進三個月的工資
11000
請輸入第2個月的工資:
12000
請輸入第3個月的工資:
13000
近3個月的平均工資是12000      #最后的輸出結果,OK!沒問題。
            
          

字符串的格式化輸出介紹

在上面的腳本中,使用了字符串的格式化輸出,就是“%d”,字符串的格式化是將若干值插入帶有“%”替代符的字符串中,從而可以動態地輸出字符串,在上面的Python腳本中,字符串中的“%d”表示插入的是一個整型數據,字符串后面的“%i”表示取的是變量“i”的值。

字符串格式化中可以使用的替代符除了“%d”,還有其他替代符,如下:

Python條件與循環_第4張圖片

上面三種替換符的使用情況:
(1)每行字符串中單個替代符的使用:

            
              #腳本如下:
num = 5
numstr = "五"
numF = 5.55
print ("第%d名"%num)
print ("第%s名"%numstr)
print ("第%f名"%numF)
#執行結果如下:
第5名
第五名
第5.550000名
            
          

(2)字符串中還可以使用多個替代符,對應的變量使用元組即可,示例如下:

            
              #腳本如下:
first = 1
second = 2
print ("第%d名和第%d名"%(first,second))
#執行結果如下:
第1名和第2名
            
          

使用多個替代符時,注意順序不要放錯,否則可能會出現類型不匹配的問題。

(3)還可以使用字典格式化多個值,如下:

            
              #代碼如下:
num = {"first":1,"second":2}             #定義一個字典
print ( "第%(second)d名和第%(first)d名"%num )
#執行結果如下:
第2名和第1名
            
          

在上面代碼中,因為字典是無序的,所以使用字典時需要把鍵指出來,明確哪個位置要用到哪個鍵值。

while循環的嵌套使用

while循環可以嵌套使用,示例代碼如下:

            
              #代碼如下:
j = 1
prompt = '請輸入員工姓名:'
while j <= 2:
    sum = 0
    i = 1
    name = raw_input(prompt)
    while i <= 3:
        print '請輸入第%d月的工資:' %i
        sum = sum +input()
        i = i + 1
    i = i - 1
    avg = sum / i
    print '%s的近%d個月的平均工資是:%d' %(name,i,avg)
#執行結果如下:
請輸入員工姓名:張三
請輸入第1月的工資:
11000
請輸入第2月的工資:
12000
請輸入第3月的工資:
13000
張三的近3個月的平均工資是:12000
請輸入員工姓名:李四
請輸入第1月的工資:
7000
請輸入第2月的工資:
8000
請輸入第3月的工資:
9000
李四的近3個月的平均工資是:8000
員工平均工資計算完成!
            
          

在上面的代碼中,外層循環(第一個while語句)用于輸入員工姓名,用變量j控制循環的次數,共2次;內層循環(第二個while語句)用于輸入近三個月的工資,用變量i控制,也就是在外層循環輸入一個名字后,需要輸入3次月工資,然后輸出這個員工的平均工資,一共可以輸入兩個員工。第四行的代碼放在了外層循環,是對sum變量做了清零,是因為每次輸入一個人的近三個月的成績后,sum都需要清零處理,以便計算下一個人的工資。如果不這樣,之前的sum值就會保存,程序就無法達到預期的目的。

2、for循環

for循環是另一種用于控制循環的方式,while是使用條件判斷執行循環,而for是使用遍歷元素的方式進行循環。

(1)for循環的幾種方式

for的語法結構如下:

            
              for  變量 in 集合:
    語句塊
            
          

常用的有以下幾種使用方式:

1) for循環可以對字符串進行遍歷,逐個獲得字符串的每個字符,示例如下:

            
              #代碼如下:
for letter in 'Python':
    print 'Current letter:%s' %letter
#執行結果如下:
Current letter:P
Current letter:y
Current letter:t
Current letter:h
Current letter:o
Current letter:n
            
          

上面的代碼中“for letter in 'Python' :”的作用是對“Python”字符串的字符逐個遍歷,把字符賦值給變量letter,然后執行for對應的語句塊,直到字符串取值完畢。看執行結果就知道怎么回事咯,這里就不啰嗦了。

2) for循環可以對列表和元組進行遍歷,如下:

            
              #代碼如下:
Python = ['西瓜','蘋果','香蕉']
for letter in Python:
    print letter
#執行結果如下:
西瓜
蘋果
香蕉
            
          

語句“for letter in Python:”的作用就是遍歷列表中的元素,把元素賦值給letter,輸出語句每次輸出一個水果。

3) 需要循環操作的內容相同時,可以用for循環結合range()函數使用,如下:

            
              #代碼如下:
for i in range(0,5):
    print '每天進步一點點。'
#執行結果如下:
每天進步一點點。
每天進步一點點。
每天進步一點點。
每天進步一點點。
每天進步一點點。
            
          

range(0,5)輸出的是一個列表,由第一個參數0開始,默認每次加1,當大于或等于第二個參數時結束,所以列表中不包括第二個參數值。range()函數中還可以寫入第三個參數,如:range(0,5,2),意思是每次加2,最后的列表值是“[0,2,4]”,所以range()函數的作用是創建一個數字列表,取值范圍是從起始數字開始到結束數字之前的內容。for循環可以對列表進行遍歷,所以可以針對range()函數的結果進行遍歷。

4) for循環示例:

            
              #代碼如下:
subjects = ('python','mysql','linux')
sum = 0
for i in subjects:
    print '請輸入%s的測試成績:' %i
    score = input()
    sum +=score                  # 與sum = sum+score效果一樣
avg = sum / len(subjects)
print '張三的平均測試成績為%d' %avg
#執行結果如下:
請輸入python的測試成績:
80
請輸入mysql的測試成績:
90
請輸入linux的測試成績:
100
張三的平均測試成績為90
            
          

上面代碼的作用是接收3門課程的成績,計算輸出平均成績,使用for循環遍歷測試列表subjects,接受測試成績后使用sum累加,最后輸出平均成績。

5) for循環嵌套舉例

            
              #代碼如下:
staffs = ['張三','李四']
months = ['1','3','5']
for staff in staffs:
    sum = 0
    for month in months:
        print '請輸入%s的第%s個月的工資:' %(staff,month)
        sum = sum + input()
    avg = sum / len(months)
    print '%s的平均工資是%d' %(staff,avg)
#執行結果如下:
請輸入張三的第1個月的工資:
11000
請輸入張三的第3個月的工資:
12000
請輸入張三的第5個月的工資:
13000
張三的平均工資是12000
請輸入李四的第1個月的工資:
21000
請輸入李四的第3個月的工資:
22000
請輸入李四的第5個月的工資:
23000
李四的平均工資是22000
            
          

上面代碼中,第一次循環對員工姓名進行了遍歷,第二層循環對所指定的月份進行了遍歷。

6) 任何語言中都有邏輯表達式,它是用邏輯運算符和變量連接起來的表達式,邏輯運算符如下所示:

Python條件與循環_第5張圖片

邏輯運算符的使用舉例:

舉例1:

            
              >>> print (not True)
False
>>> print (True and False)
False
>>> print (True or False)
True
            
          

舉例2:

            
              >>> score = 180
>>> if (score < 0 or score > 100):   #如果score小于0或大于100,那么就為真
    print '成績錯誤,不能小于0或大于100'

成績錯誤,不能小于0或大于100
>>> if (not (score > 0 and score < 100)):     #如果score不大于0并且不小于100,那么就為真。
    print '成績錯誤,不能小于0或大于100'

成績錯誤,不能小于0或大于100
            
          

三、循環的控制

當使用while和for做循環操作時,有時候需要改變循環的正常執行順序,這時就需要用到循環控制語句實現,循環控制語句有break和continue。

1、break(中斷)

當循環的語句塊中有break語句時,可以跳出整個循環,相當于shell中的exit。示例如下:

            
              #代碼如下:
staffs = ['張三','李四']
months = ['1','3','5']
for staff in staffs:
    sum = 0
    for month in months:
        print '請輸入%s的第%s個月的工資:' %(staff,month)
        score = input()
        if (score < 0 or score > 50000):   
            print '輸入的工資要大于0或者小于50000,循環退出'
            break;     # break語句,跳出這個循環
        sum += score
    avg = sum / len(months)
    print '%s的平均工資是%d' %(staff,avg)
#執行結果如下:
請輸入張三的第1個月的工資:
50001             #輸入了一個比50000大的數字
輸入的工資要大于0或者小于50000,循環退出
張三的平均工資是0
請輸入李四的第1個月的工資:
            
          

2、continue(繼續)

continue和break的區別在于:continue它不是結束整個循環,而是跳過當前一輪的循環體剩余語句,重置測試循環狀態,準備進入下一輪循環,如下:

            
              #代碼如下:
staffs = ['張三','李四']
months = ['1','3','5']
for staff in staffs:
    sum = 0
    i = 0
    while (i < len(months)):
        print '請輸入%s的第%s個月的工資:' %(staff,months[i])
        score = input()
        if (score < 0 or score > 50000):
            print '輸入的工資要大于0或者小于50000,請重新輸入。'
            continue;
        sum += score
        i += 1
    avg = sum / len(months)
    print '%s的平均工資是%d' %(staff,avg)
#執行結果如下:
請輸入張三的第1個月的工資:
50001
輸入的工資要大于0或者小于50000,請重新輸入。
請輸入張三的第1個月的工資:
30000
請輸入張三的第3個月的工資:
25000
請輸入張三的第5個月的工資:
60000
輸入的工資要大于0或者小于50000,請重新輸入。
請輸入張三的第5個月的工資:
20000
張三的平均工資是25000
請輸入李四的第1個月的工資:
            
          

在上面代碼中,第一層循環使用for循環遍歷員工,第二層使用while循環遍歷月份,使用continue是跳到離它最近的循環的下一輪,也就是第二層的while循環,如果while中的if條件測試不成立,那么將執行continue后,代碼中的“ i+=1 ”,并沒有執行,就又重新執行while循環,所以再次調用時同樣的月份,以便重新輸入。這種方式在比較人性化。

四、Python的循環綜合示例

示例需求如下:

  • 顯示操作的菜單,有3個選項,分別用字母N、E、Q表示;
  • N表示輸入新的用戶名和密碼;
  • E表示使用用戶名和密碼登錄;
  • Q表示退出程序。

1、完整腳本如下所示:

            
              #代碼如下:
kgc = {}
prompt = '''
    (N) ew user login
    (E) ntering user login
    (Q)uit
Enter choice:'''
while True:
    choice = raw_input(prompt).strip()[0].lower()
    print '\n--You picked : [%s]' %choice
    if choice not in 'neq':
        print '--invalid option,try again--'
    else:
        if choice=='n':
            prompt1 = 'login desired:'
            while True:
                name = raw_input(prompt1)
                if(kgc.has_key(name)):
                    prompt1 = '--name taken,try another:'
                    continue
                else:
                    pwd = raw_input('password:')
                    kgc[name] = pwd
                    break
        elif choice =='e':
            name = raw_input('login:')
            pwd = raw_input('password:')
            password = kgc.get(name)
            if password == pwd:
                print '--welcome back--',name
            else:
                print '--login incorrect--'
        else:
            print 'quit'
            break
#執行結果如下:

    (N) ew user login
    (E) ntering user login
    (Q)uit
Enter choice:N

--You picked : [n]
login desired:張三
password:123

    (N) ew user login
    (E) ntering user login
    (Q)uit
Enter choice:e

--You picked : [e]
login:張三
password:123
--welcome back-- 張三

    (N) ew user login
    (E) ntering user login
    (Q)uit
Enter choice:q

--You picked : [q]
quit
>>> 
            
          

2、解釋代碼的作用及含義:

            
              kgc = {}             #首先定義一個空字典,用于存放新建的用戶及密碼
prompt = '''                #這是一段提示信息,三引號表示若需要輸入多行內容時使用。
    (N) ew user login
    (E) ntering user login
    (Q)uit
Enter choice:'''
while True:                  #條件是永遠為真
    choice = raw_input(prompt).strip()[0].lower()  
#上面一段是等待鍵盤輸入的字符串(n、q、e),strip()函數去掉字符串前后的空格,然后取第一個字符。
#函數lower()的作用是將字符變成小寫字母,為后面的條件判斷做準備
    print '\n--You picked : [%s]' %choice    #換行輸出提示信息,提示你剛剛輸入的是什么。
    if choice not in 'neq':       #如果輸入的不是neq這三個字符其中之一
        print '--invalid option,try again--'           #那么輸出一段錯誤提示信息
    else:     #否則執行下面的內容
        if choice=='n':        #如果輸入的是“n”
            prompt1 = 'login desired:'     #定義一個提示信息的變量
            while True:                  #進行while循環
                name = raw_input(prompt1)  #等待鍵盤輸入用戶名,提示信息就是上面定義的prompt1變量
                if(kgc.has_key(name)):   #如果輸入的用戶名已存在字典中,
                    prompt1 = '--name taken,try another:'     #重新定義一下提示信息的變量內容       
                    continue     #然后執行continue語句,重新進行循環
                else:          #反之
                    pwd = raw_input('password:')      #繼續輸入用戶的密碼
                    kgc[name] = pwd        #然后將用戶名和密碼寫入字典中
                    break       #while循環結束
        elif choice =='e':               #如果輸入的“e”
            name = raw_input('login:')     #那么等待鍵盤輸入用戶名,提示信息為“login”
            pwd = raw_input('password:')  #等待鍵盤輸入密碼,raw_input()括號中的內容時提示信息
            password = kgc.get(name)    #查詢字典中的用戶名對應的密碼和輸入的密碼是否一致
            if password == pwd:     #如果一致
                print '--welcome back--',name      #則輸出歡迎信息
            else:     #反之
                print '--login incorrect--'       #輸出錯誤
        else:     #如果輸入的不是n也不是e,又在neq三個字符中,那么輸出的肯定是q了
            print 'quit'    #所以就退出咯
            break         #所以就退出咯
            
          

———————— 本文至此結束,感謝閱讀 ————————