Python學習筆記——部分經常使用/特殊用法


一、使用*號來展開序列,*是序列展開,每一個元素都當作一個參數
ls = (1, 2, 3);
foo(ls),這樣foo只有一個參數,就是ls這個列表自己
foo(*ls), foo獲得3個參數,分別爲1 2 3,等價於foo(1,2,3)html

 

二、python 讀寫文件中 w與wt ; r與rt 有何區別?python

't' 表示‘text mode’, 相對應的是"binary mode'編程

就是說你是以文本模式打開,仍是二進制模式打開。由於默認就是文本模式,因此'rt' 等價於'r'app

 

三、int64與int的區別?函數式編程

1)int是python的基本類型,而int64是numpy中引入的一個類,即 numpy.int64 函數

2)使用numpy模塊中的numpy.sum()方法獲得的結果是int64,而使用默認的sum()獲得結果的int類型工具

下面代碼中,雖然執行結果a和b的數值都是6,可是類型不一樣post

1 import numpy as np
2 # a 的類型是int64
3 a = np.sum([1,2,3])
4 # b 的類型是int
5 b = sum([1,2,3])

3)int64不會報除0的錯誤(事實上numpy中的其餘類型也不會報錯,好比float64等);而int會報除0錯誤(其餘基本類型也會,好比float等)測試

測試以下:代表numpy 的數據類型(int6四、float64等)比python的基本類型(int、float等)功能強大,計算能力更強,能夠有nan、inf等結果url

 1 import numpy as np
 2 #--------  int 例子 -------------
 3 # 也能夠寫int(1),也可不寫,由於默認是int類型
 4 a = 1
 5 b = 0
 6 c = 0
 7 
 8 #下面都會報 int 不能除0錯誤
 9 r1 = a / b 
10 r2 = b / c
11 #下面都會報 float 不能除0錯誤
12 r3 = a *1.0 / b 
13 r4 = b *1.0 / c
14 
15 #--------- int64 例子  -----------
16 
17 a = np.int64(1)
18 b = np.int64(0)
19 c = np.int64(0)
20 
21 #下面語句不會除0報錯,會提示,但不報錯和中斷
22 # 運行結果: r1 = 0 , r2 = 0
23 r1 = a / b 
24 r2 = b / c
25 
26 #運行結果: r3 = inf ,r4 = nan
27 #inf 表示無窮大,nan表示not a number ,不是數字
28 r3 = a *1.0 / b 
29 r4 = b *1.0 / c

 

 

四、type()函數可用於返回某個數據的數據類型;

1 a = 1
2 type(a)

 

五、& 跟 and 的區別?

& 是位運算;and 是邏輯運算。
>>> a = 1
>>> b = 2
>>> #1 的二進制是 01,2的二進制是 10
>>> a&b
0
>>> a and b
2

 &雖然是位運算,可是若是操做數是0或1的話,也相似於邏輯運算;

>>> a=1
>>> b=1
>>> c=0
>>> a & b
1
>>> a & c
0

 

六、Lambda 表達式有何用處?如何使用?

  【引言】這是python支持一種有趣的語法,它容許你快速定義單行的最小函數(請記住它本質就是個函數),相似C語言中的宏,能夠用在任何須要函數的地方,示例以下:

>>> g = lambda x: x * 2 >>> g(3) 6 >>> (lambda x: x * 2)(3) 6

  咱們也能夠把filter map reduce 和lambda結合起來用,函數就能夠簡單的寫成一行。例如

>>>kmpathes = filter(lambda kmpath: kmpath, map(lambda kmpath: string.strip(kmpath), string.split(l, ':')))

  看起來麻煩,其實就像用語言來描述問題同樣,很是優雅。
  對 l 中的全部元素以':'作分割,得出一個列表。對這個列表的每個元素作字符串strip,造成一個列表。對這個列表的每個元素作直接返回操做(這個地方能夠加上過濾條件限制),最終得到一個字符串被':'分割的列表,列表中的每個字符串都作了strip,並能夠對特殊字符串過濾。

著做權歸做者全部。
商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
做者:濤吳
連接:http://www.zhihu.com/question/20125256/answer/14058285
來源:知乎

簡單來講,編程中提到的 lambda 表達式,一般是在 須要一個函數,可是又不想費神去命名一個函數的場合下使用,也就是指 匿名函數。這一用法跟所謂 λ 演算(題目說明裏的維基連接)的關係,有點像原子彈和質能方程的關係,差異其實仍是挺大的。

不談形式化的 λ 演算,只說有實際用途的匿名函數。先舉一個普通的 Python 例子:將一個 list 裏的每一個元素都平方:
map( lambda x: x*x, [y for y in range(10)] ) 
這個寫法要好過
def sq(x): return x * x map(sq, [y for y in range(10)]) 
,由於後者多定義了一個(污染環境的)函數,尤爲若是這個函數只會使用一次的話。並且第一種寫法實際上更易讀,由於那個映射到列表上的函數具體是要作什麼,很是一目瞭然。若是你仔細觀察本身的代碼,會發現這種場景其實很常見:你在某處就真的只須要一個能作一件事情的函數而已,連它叫什麼名字都可有可無。Lambda 表達式就能夠用來作這件事。

進一步講,匿名函數本質上就是一個函數,它所抽象出來的東西是一組運算。這是什麼意思呢?類比
a = [1, 2, 3]

f = lambda x : x + 1
,你會發現,等號右邊的東西徹底能夠脫離等號左邊的東西而存在,等號左邊的 名字只是右邊之 實體的標識符。若是你能習慣 [1, 2, 3] 單獨存在,那麼 lambda x : x + 1 也能單獨存在其實也就不難理解了,它的意義就是給「某個數加一」這一運算自己。

如今回頭來看 map() 函數,它能夠將一個函數映射到一個可枚舉類型上面。沿用上面給出的 a 和 f,能夠寫:
map(f, a) 
也就是將函數 f 依次套用在 a 的每個元素上面,得到結果 [2, 3, 4]。如今用 lambda 表達式來替換 f,就變成:
map( lambda x : x + 1, [1, 2, 3] ) 
會不會以爲如今很一目瞭然了?尤爲是類比
a = [1, 2, 3] r = [] for each in a: r.append(each+1) 
這樣的寫法時,你會發現本身若是能將「遍歷列表,給遇到的每一個元素都作某種 運算」的過程從一個循環裏抽象出來成爲一個函數 map,而後用 lambda 表達式將這種 運算做爲參數傳給 map 的話,考慮事情的思惟層級會高出一些來,須要顧及的細節也少了一點。Python 之中,相似能用到 lambda 表達式的「高級」函數還有 reduce、filter、sorted 等等,不少語言也都有這樣的工具(不過這些特性最好不要在 Python 中用太多,緣由詳見 的評論部分)。這種可以接受一個函數做爲參數的函數叫作「高階函數」(higher-order function),是來自函數式編程(functional programming)的思想。

和其餘不少語言相比,Python 的 lambda 限制多多,最嚴重的當屬它只能由一條表達式組成。這個限制主要是爲了防止濫用,由於當人們發覺 lambda 很方便,就比較容易濫用,但是用多了會讓程序看起來不那麼清晰,畢竟每一個人對於抽象層級的忍耐 / 理解程度都有所不一樣。
 
【附高級函數filter、map、reduce等】

首先注意這些函數不僅是跟lambda表達式搭配,還能夠跟def定義的函數搭配,以下:

filter

filter(function, sequence):

對sequence中的item依次執行function(item),將執行結果爲True的item組成一個List/String/Tuple(取決於sequence類型)返回,示例以下:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23] >>> def f(x): return x != 'a' >>> filter(f, "abcdef") 'bcdef'

map

map(function, sequence):

對sequence中的item依次執行function(item),將執行結果組成一個List返回
另外map也支持多個sequence,固然這也要求function支持相應數量的參數輸入,示例以下:

>>> def cube(x): return x*x*x >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] >>> def cube(x) : return x + x >>> def add(x, y): return x+y >>> map(add, range(8), range(8)) [0, 2, 4, 6, 8, 10, 12, 14]

reduce(概括)

reduce(function,sequence,starting_value):

對sequence中的item順序迭代調用function,若是有starting_value,還能夠做爲初始值調用,例如能夠用來對List求和,示例以下:

>>> def add(x,y): return x + y >>> reduce(add, range(1, 11)) (注:1+2+3+4+5+6+7+8+9+10) >>> reduce(add, range(1, 11), 20) (注:1+2+3+4+5+6+7+8+9+10+20)

sorted:對sequence進行排序,直接看例子

s = [('a', 3), ('b', 2), ('c', 1)]

sorted(s, key=lambda x:x[1])>>>>>>
s = [('a', 3), ('b', 2), ('c', 1)]
更多例子...
>>> l = ['foo', 'bar', 'far'] >>> map(lambda x: x.upper(), l) ['FOO', 'BAR', 'FAR'] >>> filter(lambda x: 'f' in x, l) ['foo', 'far'] >>> map(lambda x: x.upper(), filter(lambda x: 'f' in x, l)) ['FOO', 'FAR'] >>> reduce(lambda a, b: a * b, xrange(1, 5)) # 計算 1*2*3*4 = 24 24
  

七、字典的排序:(使用lambda)

 python 字典(dict)的特色就是無序的,按照鍵(key)來提取相應值(value),若是咱們須要字典按值排序的話,那能夠用下面的方法來進行:


1)下面的是按照value的值從大到小的順序來排序。

dic = {'a':31, 'bc':5, 'c':3, 'asd':4, 'aa':74, 'd':0}
dict= sorted(dic.iteritems(), key=lambda d:d[1], reverse = True)
print dict

輸出的結果:
[('aa', 74), ('a', 31), ('bc', 5), ('asd', 4), ('c', 3), ('d', 0)]

下面咱們分解下代碼
print dic.iteritems() 獲得[(鍵,值)]的列表。
而後用sorted方法,經過key這個參數,指定排序是按照value,也就是第一個元素d[1的值來排序。reverse = True表示是須要翻轉的,默認是從小到大,翻轉的話,那就是從大到小。

2)對字典按鍵(key)排序:
dic = {'a':31, 'bc':5, 'c':3, 'asd':4, 'aa':74, 'd':0}
dict= sorted(dic.iteritems(), key=lambda d:d[0]) d[0]表示字典的鍵
print dict

 

 八、Python文件夾與文件的操做

參考:【python文件夾與文件的操做

   【python判斷文件和文件夾是否存在、建立文件夾

(1)判斷文件夾是否存在
>>> import os
>>> os.path.exists('d:/assist')
True
(2)判斷文件是否存在
>>> os.path.exists('d:/assist/getTeacherList.py')
True
(3)判斷是不是文件
>>> os.path.isfile('d:/assist')
False
>>> os.path.isfile('d:/assist/getTeacherList.py')
True
(4)建立文件夾
mkdir( path [,mode] ) 
      做用:建立一個目錄,能夠是相對或者絕對路徑,mode的默認模式是0777。 

      若是目錄有多級,則建立最後一級。若是最後一級目錄的上級目錄有不存在的,則會拋出一個OSError。

>>> os.mkdir('d:/assist/set')
 

 makedirs( path [,mode] )
      做用: 建立遞歸的目錄樹,能夠是相對或者絕對路徑,mode的默認模式也是0777。
      若是子目錄建立失敗或者已經存在,會拋出一個OSError的異常,Windows上Error 183即爲目錄已經存在的異常錯誤。若是path只有一級,與mkdir同樣。例如:

>>> os.makedirs('d:/assist/set')
>>> os.path.exists('d:/assist/set')
True
相關文章
相關標籤/搜索