1. 程式人生 > >python菜鳥日記3

python菜鳥日記3

1. 對於切片,可以進行切片的物件有字串,列表,元組,當我們定義了一個以上三種物件其中一個,變數為a,對a這個變數所對應的物件進行切片,a[n:m:q],其中n,m表示索引,q表示步長,當我們反向(從後往前)切片的時候,最後一個數的索引是-1


2. 在Python中,迭代是通過for ... in來完成的,判斷某個物件是否可迭代,引入模組,呼叫函式進行判斷:  

     >>> from collections import Iterable

    >>> isinstance('123assdasd',Iterable)
          True
3. 預設情況下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同時迭代key和value,可以用for k, v in d.items()


4. 而對於列表進行迭代的時候,如果要求同時有列表的索引和值的情況下,我們就需要利用函式enumerate()來進行輸出了,

           例如:>>> a=[1,2,33,3]

                       >>> for i,values in enumerate(a):
                       print(i,values)
                              0 1
                             1 2
                             5 33
                             6 3
5. 在python中連線符+,就是把+左右兩邊的變數或字串分開看,如果沒有了這個連線符,python就會把這兩個看成一個整體


6. 在python中使用isinstance()函式來進行判斷變數型別,比如:isinstance(’aaa222‘,(int,str)),或者isinstance(a,b)判斷a是否是由b類生存,isinstance(a,tuple),判斷a是否是元組型別,同時也可以用type來進行判斷,>>> type(a)==int,判斷a是否是int型別,但一般都不會用type進行判斷的


7. 列表生成器:[object for .... in .... for ...in....if....],object表示最終列表中需要生成的資料,for....in....用來生成資料來源,列表中可以有多個object,所以可以有兩層for迴圈
  if 篩選條件,比如:>>> [m+n for m in 'aef' for n in 'dbc' if (m+n) not in ('ab','de')]
                                               ['ad', 'ac', 'ed', 'eb', 'ec', 'fd', 'fb', 'fc']


8. 在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator,生成生成器的方法有兩種
     ①、當推斷的演算法比較簡單的時候可以使用列表生成式來生成,只需把[]換成()即可,比如:>>>a=(m+n for m in 'aef' for n in 'dbc' if (m+n) not in ('ab','de')),那麼a就是一個生成器了,

    ②、當演算法比較複雜的時候就用函式來生成,在函式中我們一般將每次迴圈中需要輸出的值用print輸出,而將print換成yield,那麼這個函式就變成了生成器

 8.1 個人理解:生存器的出現其實就是為了減少記憶體的佔用,因為列表會一直存在記憶體在,而生成器則在我們for迴圈輸出完一次後,再次for的時候就不存在了,當我們再次生存這個生成器的時候,他又會出現了,就好像我們需要這個生成器的時候就要在磁碟中呼叫一次,當在記憶體中使用完一次的時候,他又消失了,對於普通函式呼叫完以後返回的是一樣函式值,而對於生成器函式呼叫後返回的是一個生成器物件


9. 生成物件一定是迭代物件,迭代物件是惰性序列,只能一次輸出一個,不像list可以直接全部輸出,而它要麼用next()函式進行一個一個輸入,要麼就用for迴圈進行全部輸出,當然,我們也可以把這個迭代物件用list()函式強制轉換為list型別,就可以全部輸出了


10.我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種:一類是集合資料型別,如list、tuple、dict、set、str等;一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭代物件:Iterable。




11. 凡是可作用於for迴圈的物件都是Iterable型別;凡是可作用於next()函式的物件都是Iterator型別,它們表示一個惰性計算的序列;集合資料型別如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函式獲得一個Iterator物件。


12. 在python中函式名其實也是一個變數,當我們把這個變數指向其他物件的時候會發生什麼呢?

              例如:>>> sum=20

                          >>> sum(20)
                      Traceback (most recent call last):
                      File "<pyshell#79>", line 1, in <module>
                      sum(20)
                      TypeError: 'int' object is not callable
 這時函式名就是一個指向20物件的一個變量了,如果想恢復sum,重啟一下python就行了


13. 高階函式:當一個函式裡面的引數可以是一個變了,也可以是一個函式的時候,那麼這個函式就是高階函式
          例如:>>> def a(x,y,f):
                                   return f(x)+f(y)
                  >>> a(-55,-33,abs)
                          88


14. map(函式名,可迭代性物件),map函式裡面有兩個引數,一個是函式,一個是Iterable,map函式返回map將傳入的函式依次作用到序列的每個元素,並把結果作為新的迭代物件返回。注意生存的是迭代物件


15.reduce()函式,reduce把一個函式作用在一個序列[x1, x2, x3, ...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是: reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)