while,翻譯成中文是“當...的時候”,這個單詞在英語中,常常用來做為時間狀語,while ... someone do somthing,這種類型的說法是有的。在python中,它也有這個含義,不過有點區別的是,“當...時候”這個條件成立在一段范圍或者時間間隔內,從而在這段時間間隔內讓python做好多事情。就好比這樣一段情景:
~~~
while 年齡大于60歲:-------->當年齡大于60歲的時候
退休 -------->凡是符合上述條件就執行的動作
~~~
展開想象,如果制作一道門,這道門就是用上述的條件調控開關的,假設有很多人經過這個們,報上年齡,只要年齡大于60,就退休(門打開,人可以出去),一個接一個地這樣循環下去,突然有一個人年齡是50,那么這個循環在他這里就停止,也就是這時候他不滿足條件了。
這就是while循環。寫一個嚴肅點的流程,可以看下圖:
[](https://github.com/qiwsir/StarterLearningPython/blob/master/1images/12501.png)
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/125.md#做猜數字游戲)做猜數字游戲
前不久,有一個在校的大學生朋友(他叫李航),給我發郵件,讓我看了他做的游戲,能夠實現多次猜數,直到猜中為止。這是一個多么喜歡學習的大學生呀。
我在這里將他寫的程序恭錄于此,如果李航同學認為此舉侵犯了自己的知識產權,可以告知我,我馬上撤下此代碼。
~~~
#! /usr/bin/env python
#coding:UTF-8
import random
i=0
while i < 4:
print'********************************'
num = input('請您輸入0到9任一個數:') #李同學用的是python3
xnum = random.randint(0,9)
x = 3 - i
if num == xnum:
print'運氣真好,您猜對了!'
break
elif num > xnum:
print'''您猜大了!\n哈哈,正確答案是:%s\n您還有%s次機會!''' %(xnum,x)
elif num < xnum:
print'''您猜小了!\n哈哈,正確答案是:%s\n您還有%s次機會!''' %(xnum,x)
print'********************************'
i += 1
~~~
我們就用這段程序來分析一下,首先看while i<4,這是程序中為猜測限制了次數,最大是三次,請看官注意,在while的循環體中的最后一句:i +=1,這就是說每次循環到最后,就給i增加1,當bool(i<4)為False的時候,就不再循環了。
當bool(i<4)為True的時候,就執行循環體內的語句。在循環體內,讓用戶輸入一個整數,然后程序隨機選擇一個整數,最后判斷隨機生成的數和用戶輸入的數是否相等,并且用if語句判斷三種不同情況。
根據上述代碼,看官看看是否可以修改?
為了讓用戶的體驗更爽,不妨把輸入的整數范圍擴大,在1到100之間吧。
~~~
num_input = raw_input("please input one integer that is in 1 to 100:") #我用的是python2.7,在輸入指令上區別于李同學
~~~
程序用num_input變量接收了輸入的內容。但是,請列位看官一定要注意,看到這里想睡覺的要打起精神了,我要分享一個多年編程經驗:
請牢記:**任何用戶輸入的內容都是不可靠的。**
這句話含義深刻,但是,這里不做過多的解釋,需要各位在隨后的編程生涯中體驗了。為此,我們要檢驗用戶輸入的是否符合我們的要求,我們要求用戶輸入的是1到100之間的整數,那么就要做如下檢驗:
1. 輸入的是否是整數
2. 如果是整數,是否在1到100之間。
為此,要做:
~~~
if not num_input.isdigit(): #str.isdigit()是用來判斷字符串是否純粹由數字組成
print "Please input interger."
elif int(num_input)<0 and int(num_input)>=100:
print "The number should be in 1 to 100."
else:
pass #這里用pass,意思是暫時省略,如果滿足了前面提出的要求,就該執行此處語句
~~~
再看看李航同學的程序,在循環體內產生一個隨機的數字,這樣用戶每次輸入,面對的都是一個新的隨機數字。這樣的猜數字游戲難度太大了。我希望是程序產生一個數字,直到猜中,都是這個數字。所以,要把產生隨機數字這個指令移動到循環之前。
~~~
import random
number = random.randint(1,100)
while True: #不限制用戶的次數了
...
~~~
觀察李同學的程序,還有一點需要向列位顯明的,那就是在條件表達式中,兩邊最好是同種類型數據,上面的程序中有:num>xnum樣式的條件表達式,而一邊是程序生成的int類型數據,一邊是通過輸入函數得到的str類型數據。在某些情況下可以運行,為什么?看官能理解嗎?都是數字的時候,是可以的。但是,這樣不好。
那么,按照這種思路,把這個猜數字程序重寫一下:
~~~
#!/usr/bin/env python
#coding:utf-8
import random
number = random.randint(1,101)
guess = 0
while True:
num_input = raw_input("please input one integer that is in 1 to 100:")
guess += 1
if not num_input.isdigit():
print "Please input interger."
elif int(num_input) < 0 or int(num_input) >= 100:
print "The number should be in 1 to 100."
else:
if number == int(num_input):
print "OK, you are good.It is only %d, then you successed." % guess
break
elif number > int(num_input):
print "your number is more less."
elif number < int(num_input):
print "your number is bigger."
else:
print "There is something bad, I will not work"
~~~
以上供參考,看官還可改進。
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/125.md#break和continue)break和continue
break,在上面的例子中已經出現了,其含義就是要在這個地方中斷循環,跳出循環體。下面這個簡要的例子更明顯:
~~~
#!/usr/bin/env python
#coding:utf-8
a = 8
while a:
if a%2 == 0:
break
else:
print "%d is odd number"%a
a = 0
print "%d is even number"%a
~~~
a=8的時候,執行循環體中的break,跳出循環,執行最后的打印語句,得到結果:
~~~
8 is even number
~~~
如果a=9,則要執行else里面的的print,然后a=0,循環就在執行一次,又break了,得到結果:
~~~
9 is odd number
0 is even number
~~~
而continue則是要從當前位置(即continue所在的位置)跳到循環體的最后一行的后面(不執行最后一行),對一個循環體來講,就如同首尾銜接一樣,最后一行的后面是哪里呢?當然是開始了。
~~~
#!/usr/bin/env python
#coding:utf-8
a = 9
while a:
if a%2==0:
a -=1
continue #如果是偶數,就返回循環的開始
else:
print "%d is odd number"%a #如果是奇數,就打印出來
a -=1
~~~
其實,對于這兩東西,我個人在編程中很少用到。我有一個固執的觀念,盡量將條件在循環之前做足,不要在循環中跳來跳去,不僅可讀性下降,有時候自己也糊涂了。
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/125.md#whileelse)while...else
這兩個的配合有點類似if ... else,只需要一個例子列為就理解了,當然,一遇到else了,就意味著已經不在while循環內了。
~~~
#!/usr/bin/env python
count = 0
while count < 5:
print count, " is less than 5"
count = count + 1
else:
print count, " is not less than 5"
~~~
執行結果:
~~~
0 is less than 5
1 is less than 5
2 is less than 5
3 is less than 5
4 is less than 5
5 is not less than 5
~~~
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/125.md#forelse)for...else
除了有while...else外,還可以有for...else。這個循環也通常用在當跳出循環之后要做的事情。
~~~
#!/usr/bin/env python
# coding=utf-8
from math import sqrt
for n in range(99, 1, -1):
root = sqrt(n)
if root == int(root):
print n
break
else:
print "Nothing."
~~~
讀 讀者是否能夠讀懂這段代碼的含義?
> 閱讀代碼是一個提升自己編程水平的好方法。如何閱讀代碼?像看網上新聞那樣嗎?一目只看自己喜歡的文字,甚至標題看不完就開始噴。
>
> 絕對不是這樣,如果這樣,不是閱讀代碼呢。閱讀代碼的最好方法是給代碼做注釋。對,如果可能就給每行代碼做注釋。這樣就能理解代碼的含義了。
上面的代碼,讀者不妨做注釋,看看它到底在干什么。如果把`for n in range(99, 1, -1)`修改為`for n in range(99, 81, -1)`看看是什么結果?
- 第零章 預備
- 關于Python的故事
- 從小工到專家
- Python安裝
- 集成開發環境
- 第壹章 基本數據類型
- 數和四則運算
- 除法
- 常用數學函數和運算優先級
- 寫一個簡單的程序
- 字符串(1)
- 字符串(2)
- 字符串(3)
- 字符串(4)
- 字符編碼
- 列表(1)
- 列表(2)
- 列表(3)
- 回顧list和str
- 元組
- 字典(1)
- 字典(2)
- 集合(1)
- 集合(2)
- 第貳章 語句和文件
- 運算符
- 語句(1)
- 語句(2)
- 語句(3)
- 語句(4)
- 語句(5)
- 文件(1)
- 文件(2)
- 迭代
- 練習
- 自省
- 第叁章 函數
- 函數(1)
- 函數(2)
- 函數(3)
- 函數(4)
- 函數練習
- 第肆章 類
- 類(1)
- 類(2)
- 類(3)
- 類(4)
- 類(5)
- 多態和封裝
- 特殊方法(1)
- 特殊方法(2)
- 迭代器
- 生成器
- 上下文管理器
- 第伍章 錯誤和異常
- 錯誤和異常(1)
- 錯誤和異常(2)
- 錯誤和異常(3)
- 第陸章 模塊
- 編寫模塊
- 標準庫(1)
- 標準庫(2)
- 標準庫(3)
- 標準庫(4)
- 標準庫(5)
- 標準庫(6)
- 標準庫(7)
- 標準庫(8)
- 第三方庫
- 第柒章 保存數據
- 將數據存入文件
- mysql數據庫(1)
- MySQL數據庫(2)
- mongodb數據庫(1)
- SQLite數據庫
- 電子表格
- 第捌章 用Tornado做網站
- 為做網站而準備
- 分析Hello
- 用tornado做網站(1)
- 用tornado做網站(2)
- 用tornado做網站(3)
- 用tornado做網站(4)
- 用tornado做網站(5)
- 用tornado做網站(6)
- 用tornado做網站(7)
- 第玖章 科學計算
- 為計算做準備
- Pandas使用(1)
- Pandas使用(2)
- 處理股票數據
- 附:網絡文摘
- 如何成為Python高手
- ASCII、Unicode、GBK和UTF-8字符編碼的區別聯系