如何学习python

这个很难, python很难

Queue是一个线程安全的类吗


wrapper的一个用处,给函数打日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time
from functools import wraps

def log(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("func {}, param {}, time {}, return {}".format(func.__name__, (args, kwargs), end_time - start_time, result))
return result
return wrapper

@log
def bar():
return "hello"

if __name__ == '__main__':
bar()

运行结果:

1
func bar, param ((), {}), time 0.0, return hello

function的属性

1
__name__

偏函数 Partial, 柯里化 Currying

补充一下刚才的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import time
from functools import wraps, partial


def logger(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print("func {}, param {}, time {}, return {}".format(func.__name__, (args, kwargs),
end - start, result))
return result

return wrapper


@logger
def add(a, b):
return a + b


add3 = partial(add, 3)

if __name__ == '__main__':
print(add3.__class__)
add3(2)
1
2
<class 'functools.partial'>
func add, param ((3, 2), {}), time 0.0, return 5

Uncurrying

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@logger
def add(a):
@logger
def add(b):
@logger
def add(c):
return a + b + c
return add

return add


if __name__ == '__main__':
print(add(1)(2)(3))
1
2
3
4
func add, param ((1,), {}), time 0.0, return <function add.<locals>.add at 0x0000001567C500D0>
func add, param ((2,), {}), time 0.0, return <function add.<locals>.add.<locals>.add at 0x00000015678267B8>
func add, param ((3,), {}), time 0.0, return 6
6

如何写一个满足add(2)至无穷个括号的函数?
0x0000001567C500D0是内存地址?
可以操作内存吗?


Generator

1
2
3
4
5
6
7
8
9
a_generator = (item**2 for item in range(200))


if __name__ == '__main__':
print(next(a_generator))
print(next(a_generator))
print(next(a_generator))
print(next(a_generator))
print(next(a_generator))
1
2
3
4
5
0
1
4
9
16

生成质数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
log_next = logger(next)


def prime():
base = 2
while True:
is_prime = True
for j in range(2, int(math.sqrt(base)) + 1):
if base % j == 0:
is_prime = False
break
if is_prime:
yield base
base += 1


if __name__ == '__main__':
prime_generator = prime()
for i in range(10):
log_next(prime_generator)
1
2
3
4
5
6
7
8
9
10
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 2
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 3
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 5
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 7
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 11
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 13
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 17
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 19
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 23
func next, param ((<generator object prime at 0x000000450FF4A728>,), {}), time 0.0, return 29

eval, compile,code ?