1、使用*號來展開序列,*是序列展開,每個元素都當做一個參數。
ls = (1, 2, 3);
foo(ls),這樣foo只有一個參數,就是ls這個列表本身
foo(*ls), foo得到3個參數,分別為1 2 3,等價於foo(1,2,3)
2、python 讀寫文件中 w與wt ; r與rt 有何區別?
't' 表示‘text mode’, 相對應的是"binary mode'
就是說你是以文本模式打開,還是二進制模式打開。因為默認就是文本模式,所以'rt' 等價於'r'
3、int64與int的區別?
1)int是python的基本類型,而int64是numpy中引入的一個類,即 numpy.int64 ;
2)使用numpy模塊中的numpy.sum()方法得到的結果是int64,而使用默認的sum()得到結果的int類型;
下面代碼中,雖然執行結果a和b的數值都是6,但是類型不同
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 的數據類型(int64、float64等)比python的基本類型(int、float等)功能強大,計算能力更強,可以有nan、inf等結果
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
4、type()函數可用於返回某個數據的數據類型;
1 a = 1 2 type(a)
5、& 跟 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
6、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
來源:知乎
不談形式化的 λ 演算,只說有實際用途的匿名函數。先舉一個普通的 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)])
進一步講,匿名函數本質上就是一個函數,它所抽象出來的東西是一組運算。這是什么意思呢?類比
a = [1, 2, 3]
f = lambda x : x + 1
現在回頭來看 map() 函數,它可以將一個函數映射到一個可枚舉類型上面。沿用上面給出的 a 和 f,可以寫:
map(f, a)
map( lambda x : x + 1, [1, 2, 3] )
a = [1, 2, 3] r = [] for each in a: r.append(each+1)
和其他很多語言相比,Python 的 lambda 限制多多,最嚴重的當屬它只能由一條表達式組成。這個限制主要是為了防止濫用,因為當人們發覺 lambda 很方便,就比較容易濫用,可是用多了會讓程序看起來不那么清晰,畢竟每個人對於抽象層級的忍耐 / 理解程度都有所不同。
首先注意這些函數不只是跟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
7、字典的排序:(使用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
8、Python文件夾與文件的操作
參考:【python文件夾與文件的操作】
作用:創建一個目錄,可以是相對或者絕對路徑,mode的默認模式是0777。
如果目錄有多級,則創建最后一級。如果最后一級目錄的上級目錄有不存在的,則會拋出一個OSError。
makedirs( path [,mode] )
作用: 創建遞歸的目錄樹,可以是相對或者絕對路徑,mode的默認模式也是0777。
如果子目錄創建失敗或者已經存在,會拋出一個OSError的異常,Windows上Error 183即為目錄已經存在的異常錯誤。如果path只有一級,與mkdir一樣。例如: