lambda表示式與eval(str)函式
阿新 • • 發佈:2019-02-11
lambda的一般形式是關鍵字lambda後面跟一個或多個引數,緊跟一個冒號,以後是一個表示式。lambda是一個表示式而不是一個語句。它能夠出現在Python語法不允許def出現的地方。作為表示式,lambda返回一個值(即一個新的函式)。lambda用來編寫簡單的函式,而def用來處理更強大的任務。
- f = lambda x,y,z : x+y+z
- print f(1,2,3)
- g = lambda x,y=2,z=3 : x+y+z
- print g(1,z=4,y=5)
- 6
- 10
2,lambda表示式常用來編寫跳轉表(jump table),就是行為的列表或字典。例如:
- L = [(lambda x: x**2),
- (lambda x: x**3),
- (lambda x: x**4)]
- print L[0](2),L[1](2),L[2](2)
- D = {'f1':(lambda: 2+3),
- 'f2':(lambda: 2*3),
- 'f3':(lambda: 2**3)}
- print D['f1'](),D['f2'](),D['f3']()
- 4816
- 568
3,lambda表示式可以巢狀使用,但是從可讀性的角度來說,應儘量避免使用巢狀的lambda表示式。
4,map函式可以在序列中對映函式進行操作。例如:
- def inc(x):
- return x+10
- L = [1,2,3,4]
- print map(inc,L)
- print map((lambda x: x+10),L)
- [11, 12, 13, 14]
- [11, 12, 13, 14]
5,列表解析可以實現map函式同樣的功能,而且往往比map要快。例如:
- print [x**2for x in range(10)]
- print map((lambda x: x**2), range(10))
-
[0, 1, 4, 9, 16, 25, 36, 49,
- [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6,列表解析比map更強大。例如:
- print [x+y for x in range(5) if x%2 == 0for y in range(10) if y%2 ==1]
- [1, 3, 5, 7, 9, 3, 5, 7, 9, 11, 5, 7, 9, 11, 13]
7,生成器函式就像一般的函式,但它們被用作實現迭代協議,因此生成器函式只能在迭代語境中出現。例如:
- def gensquares(N):
- for i in range(N):
- yield i**2
- for i in gensquares(5):
- print i,
- 014916
8,所有的迭代內容(包括for迴圈、map呼叫、列表解析等等)將會自動呼叫iter函式,來看看是不是支援了迭代協議。
9,生成器表示式就像列表解析一樣,但它們是擴在圓括號()中而不是方括號[]中。例如:
- for num in (x**2for x in range(5)):
- print num,
- 014916
10,列表解析比for迴圈具有更好的效能。儘管如此,在編寫Python程式碼時,效能不應該是最優先考慮的。
11,沒有return語句時,函式將返回None物件。
12,函式設計的概念:
- 耦合性:只有在真正必要的情況下才使用全域性變數
- 耦合性:不要改變可變型別的引數,除非呼叫者希望這樣做
- 耦合性:避免直接改變另一個檔案模組中的變數
- 聚合性:每一個函式都應有一個單一的、統一的目標
13,最後給個預設引數和可變引數的例子:
- def saver(x=[]):
- x.append(1)
- print x
- saver([2])
- saver()
- saver()
- saver()
- [2, 1]
- [1]
- [1, 1]
-
eval(str)函式很強大,官方解釋為:將字串str當成有效的表示式來求值並返回計算結果。所以,結合math當成一個計算器很好用。
-
eval()函式常見作用有:
1、計算字串中有效的表示式,並返回結果>>> eval('pow(2,2)') 4 >>> eval('2 + 2') 4 >>> eval("n + 4") 85
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2、將字串轉成相應的物件(如list、tuple、dict和string之間的轉換)
>>> a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" >>> b = eval(a) >>> b [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]] >>> a = "{1:'xx',2:'yy'}" >>> c = eval(a) >>> c {1: 'xx', 2: 'yy'} >>> a = "(1,2,3,4)" >>> d = eval(a) >>> d (1, 2, 3, 4)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3、將利用反引號轉換的字串再反轉回物件
>>> list1 = [1,2,3,4,5] >>> `list1` '[1, 2, 3, 4, 5]' >>> type(`list1`) <type 'str'> >>> type(eval(`list1`)) <type 'list'> >>> a = eval(`list1`) >>> a [1, 2, 3, 4, 5]