鍍金池/ 教程/ Python/ 語(yǔ)句(5)
標(biāo)準(zhǔn)庫(kù) (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫(kù) (6)
標(biāo)準(zhǔn)庫(kù) (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專家
除法
錯(cuò)誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫(kù) (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個(gè)簡(jiǎn)單的程序
將數(shù)據(jù)存入文件
語(yǔ)句(5)
SQLite 數(shù)據(jù)庫(kù)
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語(yǔ)句(4)
錯(cuò)誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫(kù) (1)
生成器
mysql 數(shù)據(jù)庫(kù) (1)
第三方庫(kù)
實(shí)戰(zhàn)
運(yùn)算符
類(3)
字典(2)
語(yǔ)句(1)
數(shù)和四則運(yùn)算
語(yǔ)句(2)
文件(2)
MySQL 數(shù)據(jù)庫(kù) (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫(kù) (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫(kù) (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級(jí)
字符串(3)
為計(jì)算做準(zhǔn)備
多態(tài)和封裝
類(4)
迭代
語(yǔ)句(3)
錯(cuò)誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫(kù) (2)
列表(2)
元組

語(yǔ)句(5)

while,翻譯成中文是“當(dāng)...的時(shí)候”,這個(gè)單詞在英語(yǔ)中,常常用來做為時(shí)間狀語(yǔ),while ... someone do somthing,這種類型的說法是有的。在 Python 中,它也有這個(gè)含義,不過有點(diǎn)區(qū)別的是,“當(dāng)...時(shí)候”這個(gè)條件成立在一段范圍或者時(shí)間間隔內(nèi),從而在這段時(shí)間間隔內(nèi)讓 Python 做好多事情。就好比這樣一段情景:

while 年齡大于 60 歲:-------->當(dāng)年齡大于 60 歲的時(shí)候
    退休            -------->凡是符合上述條件就執(zhí)行的動(dòng)作

展開想象,如果制作一道門,這道門就是用上述的條件調(diào)控開關(guān)的,假設(shè)有很多人經(jīng)過這個(gè)們,報(bào)上年齡,只要年齡大于 60,就退休(門打開,人可以出去),一個(gè)接一個(gè)地這樣循環(huán)下去,突然有一個(gè)人年齡是 50,那么這個(gè)循環(huán)在他這里就停止,也就是這時(shí)候他不滿足條件了。

這就是 while 循環(huán)。寫一個(gè)嚴(yán)肅點(diǎn)的流程,可以看下圖:

http://wiki.jikexueyuan.com/project/start-learning-python/images/12501.png" alt="" />

做猜數(shù)字游戲

前不久,有一個(gè)在校的大學(xué)生朋友(他叫李航),給我發(fā)郵件,讓我看了他做的游戲,能夠?qū)崿F(xiàn)多次猜數(shù),直到猜中為止。這是一個(gè)多么喜歡學(xué)習(xí)的大學(xué)生呀。

我在這里將他寫的程序恭錄于此,如果李航同學(xué)認(rèn)為此舉侵犯了自己的知識(shí)產(chǎn)權(quán),可以告知我,我馬上撤下此代碼。

#! /usr/bin/env Python
#coding:UTF-8           

import random

i=0
while i < 4:
    print'********************************'
    num = input('請(qǐng)您輸入 0 到 9 任一個(gè)數(shù):')       #李同學(xué)用的是 Python3

    xnum = random.randint(0,9)

    x = 3 - i

    if num == xnum:
        print'運(yùn)氣真好,您猜對(duì)了!'
        break
    elif num > xnum:
        print'''您猜大了!\n 哈哈,正確答案是:%s\n 您還有 %s 次機(jī)會(huì)!''' %(xnum,x)
    elif num < xnum:
        print'''您猜小了!\n 哈哈,正確答案是:%s\n 您還有 %s 次機(jī)會(huì)!''' %(xnum,x)
    print'********************************'

    i += 1

我們就用這段程序來分析一下,首先看 while i<4,這是程序中為猜測(cè)限制了次數(shù),最大是三次,請(qǐng)看官注意,在 while 的循環(huán)體中的最后一句:i +=1,這就是說每次循環(huán)到最后,就給 i 增加 1,當(dāng) bool(i<4) 為 False 的時(shí)候,就不再循環(huán)了。

當(dāng) bool(i<4) 為 True 的時(shí)候,就執(zhí)行循環(huán)體內(nèi)的語(yǔ)句。在循環(huán)體內(nèi),讓用戶輸入一個(gè)整數(shù),然后程序隨機(jī)選擇一個(gè)整數(shù),最后判斷隨機(jī)生成的數(shù)和用戶輸入的數(shù)是否相等,并且用 if 語(yǔ)句判斷三種不同情況。

根據(jù)上述代碼,看官看看是否可以修改?

為了讓用戶的體驗(yàn)更爽,不妨把輸入的整數(shù)范圍擴(kuò)大,在 1 到 100 之間吧。

num_input = raw_input("please input one integer that is in 1 to 100:")    #我用的是 Python2.7,在輸入指令上區(qū)別于李同學(xué)

程序用 num_input 變量接收了輸入的內(nèi)容。但是,請(qǐng)列位看官一定要注意,看到這里想睡覺的要打起精神了,我要分享一個(gè)多年編程經(jīng)驗(yàn):

請(qǐng)牢記:任何用戶輸入的內(nèi)容都是不可靠的。

這句話含義深刻,但是,這里不做過多的解釋,需要各位在隨后的編程生涯中體驗(yàn)了。為此,我們要檢驗(yàn)用戶輸入的是否符合我們的要求,我們要求用戶輸入的是 1 到 100 之間的整數(shù),那么就要做如下檢驗(yàn):

  1. 輸入的是否是整數(shù)
  2. 如果是整數(shù),是否在 1 到 100 之間。

為此,要做:

if not num_input.isdigit():     #str.isdigit()是用來判斷字符串是否純粹由數(shù)字組成
    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,意思是暫時(shí)省略,如果滿足了前面提出的要求,就該執(zhí)行此處語(yǔ)句

再看看李航同學(xué)的程序,在循環(huán)體內(nèi)產(chǎn)生一個(gè)隨機(jī)的數(shù)字,這樣用戶每次輸入,面對(duì)的都是一個(gè)新的隨機(jī)數(shù)字。這樣的猜數(shù)字游戲難度太大了。我希望是程序產(chǎn)生一個(gè)數(shù)字,直到猜中,都是這個(gè)數(shù)字。所以,要把產(chǎn)生隨機(jī)數(shù)字這個(gè)指令移動(dòng)到循環(huán)之前。

import random

number = random.randint(1,100)

while True:             #不限制用戶的次數(shù)了
    ...

觀察李同學(xué)的程序,還有一點(diǎn)需要向列位顯明的,那就是在條件表達(dá)式中,兩邊最好是同種類型數(shù)據(jù),上面的程序中有:num>xnum 樣式的條件表達(dá)式,而一邊是程序生成的 int 類型數(shù)據(jù),一邊是通過輸入函數(shù)得到的 str 類型數(shù)據(jù)。在某些情況下可以運(yùn)行,為什么?看官能理解嗎?都是數(shù)字的時(shí)候,是可以的。但是,這樣不好。

那么,按照這種思路,把這個(gè)猜數(shù)字程序重寫一下:

#!/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"

以上供參考,看官還可改進(jìn)。

break 和 continue

break,在上面的例子中已經(jīng)出現(xiàn)了,其含義就是要在這個(gè)地方中斷循環(huán),跳出循環(huán)體。下面這個(gè)簡(jiǎn)要的例子更明顯:

#!/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 的時(shí)候,執(zhí)行循環(huán)體中的 break,跳出循環(huán),執(zhí)行最后的打印語(yǔ)句,得到結(jié)果:

8 is even number

如果 a=9,則要執(zhí)行 else 里面的的 print,然后 a=0,循環(huán)就在執(zhí)行一次,又 break 了,得到結(jié)果:

9 is odd number
0 is even number

而 continue 則是要從當(dāng)前位置(即 continue 所在的位置)跳到循環(huán)體的最后一行的后面(不執(zhí)行最后一行),對(duì)一個(gè)循環(huán)體來講,就如同首尾銜接一樣,最后一行的后面是哪里呢?當(dāng)然是開始了。

#!/usr/bin/env python
#coding:utf-8

a = 9
while a:
    if a%2==0:
        a -=1
        continue    #如果是偶數(shù),就返回循環(huán)的開始
    else:
        print "%d is odd number"%a #如果是奇數(shù),就打印出來
        a -=1

其實(shí),對(duì)于這兩東西,我個(gè)人在編程中很少用到。我有一個(gè)固執(zhí)的觀念,盡量將條件在循環(huán)之前做足,不要在循環(huán)中跳來跳去,不僅可讀性下降,有時(shí)候自己也糊涂了。

while...else

這兩個(gè)的配合有點(diǎn)類似 if ... else,只需要一個(gè)例子列為就理解了,當(dāng)然,一遇到 else 了,就意味著已經(jīng)不在 while 循環(huán)內(nèi)了。

#!/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"

執(zhí)行結(jié)果:

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

for...else

除了有 while...else 外,還可以有 for...else。這個(gè)循環(huán)也通常用在當(dāng)跳出循環(huán)之后要做的事情。

#!/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."

讀 讀者是否能夠讀懂這段代碼的含義?

閱讀代碼是一個(gè)提升自己編程水平的好方法。如何閱讀代碼?像看網(wǎng)上新聞那樣嗎?一目只看自己喜歡的文字,甚至標(biāo)題看不完就開始噴。

絕對(duì)不是這樣,如果這樣,不是閱讀代碼呢。閱讀代碼的最好方法是給代碼做注釋。對(duì),如果可能就給每行代碼做注釋。這樣就能理解代碼的含義了。

上面的代碼,讀者不妨做注釋,看看它到底在干什么。如果把 for n in range(99, 1, -1)修改為 for n in range(99, 81, -1)看看是什么結(jié)果?


總目錄   |   上節(jié):語(yǔ)句(4)   |   下節(jié):文件(1)

如果你認(rèn)為有必要打賞我,請(qǐng)通過支付寶:qiwsir@126.com,不勝感激。