1. 裝飾器
關於Python裝飾器的講解,網上一搜有很多資料,有些資料講的很詳細。因此,我不再詳述,我會給出一些連線,幫助理解。
案例1
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print("列印傳入引數func的名字:{}".format(func.__name__))
return func(*args, **kw)
return wrapper
@log
def new():
print(`2018-11-24`)
new()
列印傳入引數func的名字:new
2015-3-25
案例2
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(`Calling decorated function...`)
return func(*args, **kwargs)
return wrapper @my_decorator
def example():
"""Docstring"""
print(`Called example function`)
print(example.__name__, example.__doc__)
example Docstring
案例3
def logger(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print("logger傳入的引數text:{}".format(text))
print("列印傳入引數func的名字:{}".format(func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@logger(`DEBUG`)
def today():
print(`2018-11-24`)
today()
print(`-------------`)
print(today.__name__)
logger傳入的引數text:DEBUG
列印傳入引數func的名字:today
2018-11-24
-------------
today
2. filter 過濾器
案例1
def is_odd(n):
return n % 2 == 1
L = range(100)
print(L)
print(list(filter(is_odd, L)))
range(0, 100)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
案例2
def not_empty(s):
return s and s.strip()
print(list(filter(not_empty, [`A`, ``, `b`, None, `c`, ` `])))
[`A`, `b`, `c`]
3. map 對映
def f(x):
return x*x
print(list(map(f, [1, 2, 3, 4, 5])))
[1, 4, 9, 16, 25]
4. partial 偏導雛形
partial具有固定引數的功能
案例1
固定say中的man引數
import functools
def say(man, words):
print(`say`, words, `to`, man)
# say(`boss`, `hello`) # say hello to boss
say2boss = functools.partial(say, `boss`)
say2boss(`good morning`)
say good morning to boss
案例2
固定基,固定二進位制,也就是將二進位制函式中的基固定為2
import functools
int2 = functools.partial(int, base=2)
print(`1000000 =`, int2(`1000000`))
print(`1010101 =`, int2(`1010101`))
1000000 = 64
1010101 = 85
案例3
def add(a,b):
return a + b + 10
add3 = functools.partial(add,3)
add5 = functools.partial(add,5)
print("固定add函式中一個引數3,結果為3+4+10 = {} ".format(add3(4)))
print("固定add函式中一個引數5,結果為5+10+10 = {} ".format(add5(10)))
固定add函式中一個引數3,結果為3+4+10 = 17
固定add函式中一個引數5,結果為5+10+10 = 25
5. reduce
案例1
import functools
S = range(1,6)
print(functools.reduce(lambda x, y: x+y, S))
15
案例2 字串數字轉化為整型
from functools import reduce
CHAR_TO_INT = {
`0`:0,
`1`:1,
`2`:2,
`3`:3,
`4`:4,
`5`:5,
`6`:6,
`7`:7,
`8`:8,
`8`:9
}
def str2int(s):
ints = map(lambda ch: CHAR_TO_INT[ch], s)
return reduce(lambda x, y: x*10 + y, ints)
print(str2int(`0`))
print(str2int(`12300`))
print(str2int(`0012345`))
0
12300
12345
案例3 字串數字轉化為浮點型
CHAR_TO_FLOAT = {
`0`: 0,
`1`: 1,
`2`: 2,
`3`: 3,
`4`: 4,
`5`: 5,
`6`: 6,
`7`: 7,
`8`: 8,
`9`: 9,
`.`: -1
}
def str2float(s):
nums = map(lambda ch: CHAR_TO_FLOAT[ch], s)
point = 0
def to_float(f, n):
nonlocal point
if n == -1:
point = 1
return f
if point == 0:
return f * 10 + n
else:
point = point * 10
return f + n / point
return reduce(to_float, nums, 0.0)
print(str2float(`0`))
print(str2float(`123.456`))
print(str2float(`123.45600`))
print(str2float(`0.1234`))
print(str2float(`.1234`))
print(str2float(`120.0034`))
0.0
123.456
123.456
0.12340000000000001
0.12340000000000001
120.0034
6. sorted
案例1 簡單排序
L = [`bob`, `about`, `Zoo`, `Credit`]
print(sorted(L))
print(sorted(L, key=str.lower))
[`Credit`, `Zoo`, `about`, `bob`]
[`about`, `bob`, `Credit`, `Zoo`]
案例2 根據要求排序
from operator import itemgetter
students = [(`Bob`, 75), (`Adam`, 92), (`Bart`, 66), (`Lisa`, 88)]
print(sorted(students, key=itemgetter(0)))
print(sorted(students, key=lambda t: t[1]))
print(sorted(students, key=itemgetter(1), reverse=True))
[(`Adam`, 92), (`Bart`, 66), (`Bob`, 75), (`Lisa`, 88)]
[(`Bart`, 66), (`Bob`, 75), (`Lisa`, 88), (`Adam`, 92)]
[(`Adam`, 92), (`Lisa`, 88), (`Bob`, 75), (`Bart`, 66)]
7. 返回函式
案例1
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f = lazy_sum(1, 2, 3, 4, 5, 6, 7, 8, 9)
print(f)
print(f())
<function lazy_sum.<locals>.sum at 0x000001C8F8CF69D8>
45
案例2
def count():
fs = []
for i in range(1, 4):
def f():
return i * i
fs.append(f)
return fs
f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
9
9
9
案例3
def count():
fs = []
def f(n):
def j():
return n * n
return j
for i in range(1, 4):
fs.append(f(i))
return fs
f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
1
4
9
8. 素數
def main():
for n in primes():
if n < 50:
print("{}是1——100之間的素數。".format(n))
else:
break
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):
return lambda x: x % n > 0
def primes():
yield 2
it = _odd_iter()
while True:
n = next(it)
yield n
it = filter(_not_divisible(n), it)
if __name__ == `__main__`:
main()
2是1——100之間的素數。
3是1——100之間的素數。
5是1——100之間的素數。
7是1——100之間的素數。
11是1——100之間的素數。
13是1——100之間的素數。
17是1——100之間的素數。
19是1——100之間的素數。
23是1——100之間的素數。
29是1——100之間的素數。
31是1——100之間的素數。
37是1——100之間的素數。
41是1——100之間的素數。
43是1——100之間的素數。
47是1——100之間的素數。
參考文獻
- http://y.tsutsumi.io/dry-principles-through-python-decorators.html
- http://wklken.me/posts/2013/08/18/python-extra-functools.html
- https://github.com/michaelliao/learn-python3/tree/master/samples/functional