使用闭包方式嵌套函数
闭包就是函数里面内置函数,返回的也是函数
def outer():
x = 1
def inner():
nonlocal x #nonlocal允许内嵌的函数来修改闭包变量
x = x+100
return x
return inner
f = outer()
f()
用@time使得简便化
import time
def timer(func):
def inner(*args, **kwargs):#*接受任意多的普通参数,**接收任意多的字典参数
print("inner run")
start = time.time()
func(*args, **kwargs)
end = time.time()
print("{} 函数运行用时{:.2f}秒".format(func.__name__, (end-start)))
return inner
@timer # 相当于实现了f1 = timer(f1)
def f1(n):
print("f1 run")
time.sleep(n)
f1(2)
用timer的优势
import time
def timer(func):
def inner():
print("inner run")
start = time.time()
func()
end = time.time()
print("{} 函数运行用时{:.2f}秒".format(func.__name__, (end-start)))
return inner
@timer # 相当于实现了f1 = timer(f1)
def f1():
time.sleep(1)
print("f1 run")
print(f1.__name__) #return 是 inner所以函数属性改变了``
如何保证内部属性不变,使用weaps
import time
from functools import wraps
def timer(func):
@wraps(func) #保证函数属性用了不变
def inner():
print("inner run")
start = time.time()
func()
end = time.time()
print("{} 函数运行用时{:.2f}秒".format(func.__name__, (end-start)))
return inner
@timer # 相当于实现了f1 = timer(f1)
def f1():
time.sleep(1)
print("f1 run")
print(f1.__name__)
f1()
用生成器的一个例子
def odd_list():
n=1
while True:
n+=2
yield n
def is_no_prime(n):
return lambda x : x%n #返回一个隐藏函数 等于返回x x=x%n
def prime():
yield 2
it=odd_list()
while True:
b=next(it)
yield b
it=filter(is_no_prime(b),it)#过滤器,把不符合第一个条件的参数(第一个条件要是True才行)从it里面删除
def is_prime(num):
for i,x in enumerate(prime()):#enumerate是形成一个带索引的列表1,x,2,y这样
if i > num:
break
else:
print(x)
is_prime(100);