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

語句(3)

循環(huán),也是現(xiàn)實生活中常見的現(xiàn)象,我們常說日復(fù)一日,就是典型的循環(huán)。又如:日月更迭,斗轉(zhuǎn)星移,無不是循環(huán);王朝更迭;子子孫孫,繁衍不息,從某個角度看也都是循環(huán)。

編程語言就是要解決現(xiàn)實問題的,因此也少不了要循環(huán)。

在 Python 中,循環(huán)有一個語句:for 語句。

其基本結(jié)構(gòu)是:

for 循環(huán)規(guī)則:
    操作語句

從這個基本結(jié)構(gòu)看,有著同 if 條件語句類似的地方:都有冒號;語句塊都要縮進。是的,這是不可或缺的。

簡單的 for 循環(huán)例子

前面介紹 print 語句的時候,出現(xiàn)了一個簡單例子。重復(fù)一個類似的:

>>> hello = "world"
>>> for i in hello:
...     print i
... 
w
o
r
l
d

這個 for 循環(huán)是怎么工作的呢?

  1. hello 這個變量引用的是"world"這個 str 類型的數(shù)據(jù)
  2. 變量 i 通過 hello 找到它所引用的對象"world",因為 str 類型的數(shù)據(jù)屬于序列類型,能夠進行索引,于是就按照索引順序,從第一字符開始,依次獲得該字符的引用。
  3. 當(dāng) i="w"的時候,執(zhí)行 print i,打印出了字母 w,結(jié)束之后循環(huán)第二次,讓 i="e",然后執(zhí)行 print i,打印出字母 e,如此循環(huán)下去,一直到最后一個字符被打印出來,循環(huán)自動結(jié)束。注意,每次打印之后,要換行。如果不想換行,怎么辦?參見《語句(1)》中關(guān)于 print 語句。

因為可以也通過使用索引(偏移量),得到序列對象的某個元素。所以,還可以通過下面的循環(huán)方式實現(xiàn)同樣效果:

>>> for i in range(len(hello)):
...     print hello[i]
... 
w
o
r
l
d

其工作方式是:

  1. len(hello)得到 hello 引用的字符串的長度,為 5
  2. range(len(hello),就是 range(5),也就是[0, 1, 2, 3, 4],對應(yīng)這"world"每個字母索引,也可以稱之為偏移量。這里應(yīng)用了一個新的函數(shù) range(),關(guān)于它的用法,繼續(xù)閱讀,就能看到了。
  3. for i in range(len(hello)),就相當(dāng)于 for i in [0,1,2,3,4],讓i依次等于 list 中的各個值。當(dāng) i=0 時,打印 hello[0],也就是第一個字符。然后順序循環(huán)下去,直到最后一個 i=4 為止。

以上的循環(huán)舉例中,顯示了對 str 的字符依次獲取,也涉及了 list,感覺不過癮呀。那好,看下面對 list 的循環(huán):

>>> ls_line
['Hello', 'I am qiwsir', 'Welcome you', '']
>>> for word in ls_line:
...     print word
... 
Hello
I am qiwsir
Welcome you

>>> for i in range(len(ls_line)):
...     print ls_line[i]
... 
Hello
I am qiwsir
Welcome you

range(start,stop[, step])

這個內(nèi)建函數(shù),非常有必要給予說明,因為它會經(jīng)常被使用。一般形式是range(start, stop[, step])

要研究清楚一些函數(shù)特別是內(nèi)置函數(shù)的功能,建議看官首先要明白內(nèi)置函數(shù)名稱的含義。因為在 Python 中,名稱不是隨便取的,是代表一定意義的。所謂:名不正言不順。

range

n. 范圍;幅度;排;山脈 vi. (在...內(nèi))變動;平行,列為一行;延伸;漫游;射程達(dá)到 vt. 漫游;放牧;使并列;歸類于;來回走動

在具體實驗之前,還是按照管理,摘抄一段官方文檔的原話,讓我們能夠深刻理解之:

This is a versatile function to create lists containing arithmetic progressions. It is most often used in for loops. The arguments must be plain integers. If the step argument is omitted, it defaults to 1. If the start argument is omitted, it defaults to 0. The full form returns a list of plain integers [start, start + step, start + 2 step, ...]. If step is positive, the last element is the largest start + i step less than stop; if step is negative, the last element is the smallest start + i * step greater than stop. step must not be zero (or else ValueError is raised).

從這段話,我們可以得出關(guān)于 range()函數(shù)的以下幾點:

  • 這個函數(shù)可以創(chuàng)建一個數(shù)字元素組成的列表。
  • 這個函數(shù)最常用于 for 循環(huán)(關(guān)于 for 循環(huán),馬上就要涉及到了)
  • 函數(shù)的參數(shù)必須是整數(shù),默認(rèn)從 0 開始。返回值是類似[start, start + step, start + 2*step, ...]的列表。
  • step 默認(rèn)值是 1。如果不寫,就是按照此值。
  • 如果 step 是正數(shù),返回 list 的最最后的值不包含 stop 值,即 start+istep 這個值小于 stop;如果 step 是負(fù)數(shù),start+istep 的值大于 stop。
  • step 不能等于零,如果等于零,就報錯。

在實驗開始之前,再解釋 range(start,stop[,step])的含義:

  • start:開始數(shù)值,默認(rèn)為 0,也就是如果不寫這項,就是認(rèn)為 start=0
  • stop:結(jié)束的數(shù)值,必須要寫的。
  • step:變化的步長,默認(rèn)是 1,也就是不寫,就是認(rèn)為步長為 1。堅決不能為 0

實驗開始,請以各項對照前面的講述:

>>> range(9)                #stop=9,別的都沒有寫,含義就是 range(0,9,1)
[0, 1, 2, 3, 4, 5, 6, 7, 8] #從 0 開始,步長為 1,增加,直到小于 9 的那個數(shù) 
>>> range(0,9)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> range(0,9,1)
[0, 1, 2, 3, 4, 5, 6, 7, 8]

>>> range(1,9)              #start=1
[1, 2, 3, 4, 5, 6, 7, 8]

>>> range(0,9,2)            #step=2,每個元素等于 start+i*step,
[0, 2, 4, 6, 8]

僅僅解釋一下 range(0,9,2)

  • 如果是從 0 開始,步長為 1,可以寫成 range(9)的樣子,但是,如果步長為 2,寫成 range(9,2)的樣子,計算機就有點糊涂了,它會認(rèn)為 start=9,stop=2。所以,在步長不為 1 的時候,切忌,要把 start 的值也寫上。
  • start=0,step=2,stop=9.list 中的第一個值是 start=0,第二個值是 start+1step=2(注意,這里是 1,不是 2,不要忘記,前面已經(jīng)講過,不論是 list 還是 str,對元素進行編號的時候,都是從 0 開始的),第 n 個值就是 start+(n-1)step。直到小于 stop 前的那個值。

熟悉了上面的計算過程,看看下面的輸入誰是什么結(jié)果?

>>> range(-9)

我本來期望給我返回[0,-1,-2,-3,-4,-5,-6,-7,-8],我的期望能實現(xiàn)嗎?

分析一下,這里 start=0,step=1,stop=-9.

第一個值是 0;第二個是 start+1*step,將上面的數(shù)代入,應(yīng)該是 1,但是最后一個還是 -9,顯然出現(xiàn)問題了。但是,Python 在這里不報錯,它返回的結(jié)果是:

>>> range(-9)
[]
>>> range(0,-9)
[]
>>> range(0)
[]

報錯和返回結(jié)果,是兩個含義,雖然返回的不是我們要的。應(yīng)該如何修改呢?

>>> range(0,-9,-1)
[0, -1, -2, -3, -4, -5, -6, -7, -8]
>>> range(0,-9,-2)
[0, -2, -4, -6, -8]

有了這個內(nèi)置函數(shù),很多事情就簡單了。比如:

>>> range(0,100,2)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]

100 以內(nèi)的自然數(shù)中的偶數(shù)組成的 list,就非常簡單地搞定了。

思考一個問題,現(xiàn)在有一個列表,比如是["I","am","a","Pythoner","I","am","learning","it","with","qiwsir"],要得到這個 list 的所有序號組成的 list,但是不能一個一個用手指頭來數(shù)。怎么辦?

請沉思兩分鐘之后,自己實驗一下,然后看下面。

>>> pythoner
['I', 'am', 'a', 'pythoner', 'I', 'am', 'learning', 'it', 'with', 'qiwsir']
>>> py_index = range(len(pythoner))     #以 len(pythoner)為 stop 的值
>>> py_index
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

再用手指頭指著 Pythoner 里面的元素,數(shù)一數(shù),是不是跟結(jié)果一樣。

例:找出 100 以內(nèi)的能夠被 3 整除的正整數(shù)。

分析:這個問題有兩個限制條件,第一是 100 以內(nèi)的正整數(shù),根據(jù)前面所學(xué),可以用 range(1,100)來實現(xiàn);第二個是要解決被 3 整除的問題,假設(shè)某個正整數(shù) n,這個數(shù)如果能夠被 3 整除,也就是 n%3(% 是取余數(shù))為 0.那么如何得到 n 呢,就是要用 for 循環(huán)。

以上做了簡單分析,要實現(xiàn)流程,還需要細(xì)化一下。按照前面曾經(jīng)講授過的一種方法,要畫出問題解決的流程圖。

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

下面寫代碼就是按圖索驥了。

代碼:

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

aliquot = []

for n in range(1,100):
    if n%3 == 0:
        aliquot.append(n)

print aliquot

代碼運行結(jié)果:

[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

上面的代碼中,將 for 循環(huán)和 if 條件判斷都用上了。

不過,感覺有點麻煩,其實這么做就可以了:

>>> range(3,100,3)
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

能夠用來 for 的對象

所有的序列類型對象,都能夠用 for 來循環(huán)。比如:

>>> name_str = "qiwsir"
>>> for i in name_str:  #可以對 str 使用 for 循環(huán)
...     print i,
...                     
q i w s i r

>>> name_list = list(name_str)
>>> name_list
['q', 'i', 'w', 's', 'i', 'r']
>>> for i in name_list:     #對 list 也能用
...     print i,
... 
q i w s i r

>>> name_set = set(name_str)    #set 還可以用
>>> name_set
set(['q', 'i', 's', 'r', 'w'])
>>> for i in name_set:
...     print i,
... 
q i s r w

>>> name_tuple = tuple(name_str)
>>> name_tuple
('q', 'i', 'w', 's', 'i', 'r')
>>> for i in name_tuple:        #tuple 也能呀
...     print i,
... 
q i w s i r

>>> name_dict={"name":"qiwsir","lang":"python","website":"qiwsir.github.io"}
>>> for i in name_dict:             #dict 也不例外,這里本質(zhì)上是將字典的鍵拿出來,成為序列后進行循環(huán)
...     print i,"-->",name_dict[i]
... 
lang --> Python
website --> qiwsir.github.io
name --> qiwsir

在用 for 來循環(huán)讀取字典鍵值對上,需要多說幾句。

有這樣一個字典:

>>> a_dict = {"name":"qiwsir", "lang":"python", "email":"qiwsir@gmail.com", "website":"www.itdiffer.com"}

曾記否?在《字典(2)》中有獲得字典鍵、值的函數(shù):items/iteritems/keys/iterkeys/values/itervalues,通過這些函數(shù)得到的是鍵或者值的列表。

>>> for k in a_dict.keys():
...     print k, a_dict[k]
... 
lang python
website www.itdiffer.com
name qiwsir
email qiwsir@gmail.com

這是最常用的一種獲得字典鍵/值對的方法,而且效率也不錯。

>>> for k,v in a_dict.items():
...     print k,v
... 
lang python
website www.itdiffer.com
name qiwsir
email qiwsir@gmail.com

>>> for k,v in a_dict.iteritems():
...     print k,v
... 
lang python
website www.itdiffer.com
name qiwsir
email qiwsir@gmail.com

這兩種方法也能夠?qū)崿F(xiàn)同樣的效果,但是因為有了上面的方法,一般就少用了。但是,用也無妨,特別是第二個 iteritems(),效率也是挺高的。

但是,要注意下面的方法:

>>> for k in a_dict.keys():
...     print k, a_dict[k]
... 
lang python
website www.itdiffer.com
name qiwsir
email qiwsir@gmail.com

這種方法其實是不提倡的,雖然實現(xiàn)了同樣的效果,但是效率常常是比較低的。切記。

>>> for v in a_dict.values():
...     print v
... 
python
www.itdiffer.com
qiwsir
qiwsir@gmail.com

>>> for v in a_dict.itervalues():
...     print v
... 
python
www.itdiffer.com
qiwsir
qiwsir@gmail.com

單獨取 values,推薦第二種方法。


總目錄   |   上節(jié):語句(2)   |   下節(jié):語句(4)

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

上一篇:類(4)下一篇:語句(5)