# 彿°è¿é¶ï¼åæ°ä¼ éï¼é«é¶å½æ°ï¼lambda å¿å彿°ï¼global åéï¼éå½
## 彿°æ¯åºæ¬ç±»å
å¨ `Python` ä¸ï¼å½æ°æ¯ä¸ç§åºæ¬ç±»åç对象ï¼è¿æå³ç
* å¯ä»¥å°å½æ°ä½ä¸ºåæ°ä¼ ç»å¦ä¸ä¸ªå½æ°
* å°å½æ°ä½ä¸ºåå
¸çå¼å¨å
* å°å½æ°ä½ä¸ºå¦ä¸ä¸ªå½æ°çè¿åå¼
In [1]:
```py
def square(x):
"""Square of x."""
return x*x
def cube(x):
"""Cube of x."""
return x*x*x
```
ä½ä¸ºåå
¸çå¼ï¼
In [2]:
```py
funcs = {
'square': square,
'cube': cube,
}
```
ä¾åï¼
In [3]:
```py
x = 2
print square(x)
print cube(x)
for func in sorted(funcs):
print func, funcs[func](x)
```
```py
4
8
cube 8
square 4
```
## 彿°åæ°
### å¼ç¨ä¼ é
`Python` ä¸ç彿°ä¼ 鿹弿¯ `call by reference` å³å¼ç¨ä¼ éï¼ä¾å¦ï¼å¯¹äºè¿æ ·çç¨æ³ï¼
```py
x = [10, 11, 12]
f(x)
```
ä¼ éç»å½æ° `f` çæ¯ä¸ä¸ªæå `x` æå
å«å
容çå¼ç¨ï¼å¦ææä»¬ä¿®æ¹äºè¿ä¸ªå¼ç¨ææåå
容çå¼ï¼ä¾å¦ `x[0]=999`ï¼ï¼é£ä¹å¤é¢ç `x` çå¼ä¹ä¼è¢«æ¹åãä¸è¿å¦ææä»¬å¨å½æ°ä¸èµç» `x` ä¸ä¸ªæ°çå¼ï¼ä¾å¦å¦ä¸ä¸ªå表ï¼ï¼é£ä¹å¨å½æ°å¤é¢ç `x` çå¼ä¸ä¼æ¹åï¼
In [4]:
```py
def mod_f(x):
x[0] = 999
return x
x = [1, 2, 3]
print x
print mod_f(x)
print x
```
```py
[1, 2, 3]
[999, 2, 3]
[999, 2, 3]
```
In [5]:
```py
def no_mod_f(x):
x = [4, 5, 6]
return x
x = [1,2,3]
print x
print no_mod_f(x)
print x
```
```py
[1, 2, 3]
[4, 5, 6]
[1, 2, 3]
```
### é»è®¤åæ°æ¯å¯åçï¼
彿°å¯ä»¥ä¼ éé»è®¤åæ°ï¼é»è®¤åæ°çç»å®åçå¨å½æ°å®ä¹çæ¶åï¼ä»¥åæ¯æ¬¡è°ç¨é»è®¤åæ°æ¶é½ä¼ä½¿ç¨åä¸ä¸ªå¼ç¨ã
è¿æ ·çæºå¶ä¼å¯¼è´è¿ç§æ
åµçåçï¼
In [6]:
```py
def f(x = []):
x.append(1)
return x
```
ç论ä¸è¯´ï¼æä»¬å¸æè°ç¨ `f()` æ¶è¿åçæ¯ `[1]`ï¼ ä½äºå®ä¸ï¼
In [7]:
```py
print f()
print f()
print f()
print f(x = [9,9,9])
print f()
print f()
```
```py
[1]
[1, 1]
[1, 1, 1]
[9, 9, 9, 1]
[1, 1, 1, 1]
[1, 1, 1, 1, 1]
```
èæä»¬å¸æçå°çåºè¯¥æ¯è¿æ ·ï¼
In [8]:
```py
def f(x = None):
if x is None:
x = []
x.append(1)
return x
print f()
print f()
print f()
print f(x = [9,9,9])
print f()
print f()
```
```py
[1]
[1]
[1]
[9, 9, 9, 1]
[1]
[1]
```
## é«é¶å½æ°
以彿°ä½ä¸ºåæ°ï¼æè
è¿åä¸ä¸ªå½æ°ç彿°æ¯é«é¶å½æ°ï¼å¸¸ç¨çä¾åæ `map` å `filter` 彿°ï¼
`map(f, sq)` 彿°å° `f` ä½ç¨å° `sq` çæ¯ä¸ªå
ç´ ä¸å»ï¼å¹¶è¿åç»æç»æçå表ï¼ç¸å½äºï¼
```py
[f(s) for s in sq]
```
In [9]:
```py
map(square, range(5))
```
Out[9]:
```py
[0, 1, 4, 9, 16]
```
`filter(f, sq)` 彿°çä½ç¨ç¸å½äºï¼å¯¹äº `sq` çæ¯ä¸ªå
ç´ `s`ï¼è¿åææ `f(s)` 为 `True` ç `s` ç»æçå表ï¼ç¸å½äºï¼
```py
[s for s in sq if f(s)]
```
In [10]:
```py
def is_even(x):
return x % 2 == 0
filter(is_even, range(5))
```
Out[10]:
```py
[0, 2, 4]
```
ä¸èµ·ä½¿ç¨ï¼
In [11]:
```py
map(square, filter(is_even, range(5)))
```
Out[11]:
```py
[0, 4, 16]
```
`reduce(f, sq)` 彿°æ¥åä¸ä¸ªäºå
æä½å½æ° `f(x,y)`ï¼å¹¶å¯¹äºåºå `sq` æ¯æ¬¡å并两个å
ç´ ï¼
In [12]:
```py
def my_add(x, y):
return x + y
reduce(my_add, [1,2,3,4,5])
```
Out[12]:
```py
15
```
ä¼ å
¥å æ³å½æ°ï¼ç¸å½äºå¯¹åºåæ±åã
è¿åä¸ä¸ªå½æ°ï¼
In [13]:
```py
def make_logger(target):
def logger(data):
with open(target, 'a') as f:
f.write(data + '\n')
return logger
foo_logger = make_logger('foo.txt')
foo_logger('Hello')
foo_logger('World')
```
In [14]:
```py
!cat foo.txt
```
```py
Hello
World
```
In [15]:
```py
import os
os.remove('foo.txt')
```
## å¿å彿°
å¨ä½¿ç¨ `map`ï¼ `filter`ï¼`reduce` ç彿°çæ¶åï¼ä¸ºäºæ¹ä¾¿ï¼å¯¹ä¸äºç®åç彿°ï¼æä»¬é常使ç¨å¿å彿°çæ¹å¼è¿è¡å¤çï¼å
¶åºæ¬å½¢å¼æ¯ï¼
```py
lambda