看這個標題,有點匪夷所思嗎?為什么for是難以想象的呢?因為在python中,它的確是很常用而且很強悍,強悍到以至于另外一個被稱之為迭代的東西,在python中就有點相形見絀了。在別的語言中,for的地位從來沒有如同python中這么高的。
廢話少說,上干活。
## for的基本操作
for是用來循環的,是從某個對象那里依次將元素讀取出來。看下面的例子,將已經學習過的數據對象用for循環一下,看看哪些能夠使用,哪些不能使用。同時也是復習一下過往的內容。
~~~
>>> name_str = "qiwsir"
>>> for i in name_str: #可以對str使用for循環
... 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也不例外
... print i,"-->",name_dict[i]
...
lang --> python
website --> qiwsir.github.io
name --> qiwsir
~~~
除了上面的數據類型之外,對文件也能夠用for,這在前面有專門的[《不要紅頭文件》](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/130.md)兩篇文章講解有關如何用for來讀取文件對象的內容。看官若忘記了,可去瀏覽。
for在list解析中,用途也不可小覷,這在講解list解析的時候,也已說明,不過,還是再復習一下為好,所謂學而時常復習之,不亦哈哈乎。
~~~
>>> one = range(1,9)
>>> one
[1, 2, 3, 4, 5, 6, 7, 8]
>>> [ x for x in one if x%2==0 ]
[2, 4, 6, 8]
~~~
什么也不說了,list解析的強悍,在以后的學習中會越來越體會到的,佩服佩服呀。
列位如果用python3,會發現字典解析、元組解析也是奇妙的呀。
要上升一個檔次,就得進行概括。將上面所說的for循環,概括一下,就是下圖所示:
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/20601.png)
用一個文字表述:
~~~
for iterating_var in sequence:
statements
~~~
iterating_var是對象sequence的迭代變量,也就是sequence必須是一個能夠有某種序列的對象,特別注意沒某種序列,就是說能夠按照一定的腳標獲取元素。當然,文件對象屬于序列,我們沒有用腳標去獲取每行,如果把它讀取出來,因為也是一個str,所以依然可以用腳標讀取其內容。
## zip
zip是什么東西?在交互模式下用help(zip),得到官方文檔是:
> zip(...) zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
>
> Return a list of tuples, where each tuple contains the i-th element from each of the argument sequences. The returned list is truncated in length to the length of the shortest argument sequence.
通過實驗來理解上面的文檔:
~~~
>>> a = "qiwsir"
>>> b = "github"
>>> zip(a,b)
[('q', 'g'), ('i', 'i'), ('w', 't'), ('s', 'h'), ('i', 'u'), ('r', 'b')]
>>> c = [1,2,3]
>>> d = [9,8,7,6]
>>> zip(c,d)
[(1, 9), (2, 8), (3, 7)]
>>> e = (1,2,3)
>>> f = (9,8)
>>> zip(e,f)
[(1, 9), (2, 8)]
>>> m = {"name","lang"}
>>> n = {"qiwsir","python"}
>>> zip(m,n)
[('lang', 'python'), ('name', 'qiwsir')]
>>> s = {"name":"qiwsir"}
>>> t = {"lang":"python"}
>>> zip(s,t)
[('name', 'lang')]
~~~
zip是一個內置函數,它的參數必須是某種序列數據類型,如果是字典,那么鍵視為序列。然后將序列對應的元素依次組成元組,做為一個list的元素。
下面是比較特殊的情況,參數是一個序列數據的時候,生成的結果樣子:
~~~
>>> a
'qiwsir'
>>> c
[1, 2, 3]
>>> zip(c)
[(1,), (2,), (3,)]
>>> zip(a)
[('q',), ('i',), ('w',), ('s',), ('i',), ('r',)]
~~~
這個函數和for連用,就是實現了:
~~~
>>> c
[1, 2, 3]
>>> d
[9, 8, 7, 6]
>>> for x,y in zip(c,d): #實現一對一對地打印
... print x,y
...
1 9
2 8
3 7
>>> for x,y in zip(c,d): #把兩個list中的對應量上下相加。
... print x+y
...
10
10
10
~~~
上面這個相加的功能,如果不用zip,還可以這么寫:
~~~
>>> length = len(c) if len(c)<len(d) else len(d) #判斷c,d的長度,將短的長度拿出來
>>> for i in range(length):
... print c[i]+d[i]
...
10
10
10
~~~
以上兩種寫法那個更好呢?前者?后者?哈哈。我看差不多了。還可以這么做呢:
~~~
>>> [ x+y for x,y in zip(c,d) ]
[10, 10, 10]
~~~
前面多次說了,list解析強悍呀。當然,還可以這樣的:
~~~
>>> [ c[i]+d[i] for i in range(length) ]
[10, 10, 10]
~~~
for循環語句在后面還會經常用到,其實前面已經用了很多了。所以,看官應該不感到太陌生。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python