[零基礎學python]不可思議的for

看這個標題,有點匪夷所思嗎?爲何for是不可思議的呢?由於在python中,它的確是很經常使用並且很強悍,強悍到以致於另一個被稱之爲迭代的東西,在python中就有點相形見絀了。在別的語言中,for的地位歷來沒有如同python中這麼高的。python

廢話少說,上幹活。git

for的基本操做

for是用來循環的,是從某個對象那裏依次將元素讀取出來。看下面的例子,將已經學習過的數據對象用for循環一下,看看哪些可以使用,哪些不能使用。同時也是複習一下過往的內容。github

>>> 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,這在前面有專門的《不要紅頭文件》兩篇文章講解有關如何用for來讀取文件對象的內容。看官若忘記了,可去瀏覽。web

for在list解析中,用途也不可小覷,這在講解list解析的時候,業已說明,不過,仍是再複習一下爲好,所謂學而時常複習之,不亦哈哈乎。segmentfault

>>> 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循環,歸納一下,就是下圖所示:spa

請輸入圖片描述

用一個文字表述:code

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循環語句在後面還會常常用到,其實前面已經用了不少了。因此,看官應該不感到太陌生。

相關文章
相關標籤/搜索