66、什么是闭包?
闭包函数(closure function)指的是定义在一个函数内部的函数,被外层函数包裹着,其特点是可以访问到外层函数中的名字,如下inner函数就是一个闭包函数。
def outer():
num = 1
def inner():
print(num) # 内层函数中不存在num 但可以访问到外层的num
return inner # 基于函数对象的概念我们可以将内层函数返回到外界使用,从而打破函数调用的层级限制,但无论在何处调用,作用域的嵌套关系都是以定义阶段为准的,所以外界得到的不仅仅是一个函数对象(inner),在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,都是访问自己外层包裹的作用域中的名字num
func = outer() # func == inner func指向的是inner的内存地址,但是func本身确实一个全局变量,可以在任意位置调用func,但无论在何处调用func,都需要按照定义阶段作用域的嵌套关系去查找名字
num=1000
func() #输出结果:1
67、使用生成器编写 fib 函数, 函数声明为 fib(max), 输入一个参数 max 值, 使得 该函数可以这样调用。
for i in range(0,100):
print fib(1000)
# 并产生如下结果(斐波那契数列),1,1,2,3,5,8,13,21...
# 答案
def fib():
i,k=1,0
while 1:
j=i+k
yield j
i=k
k=j
for fn in fib():
if fn>1000:
break
else:
print(fn)
68、一行代码, 通过 filter 和 lambda 函数输出以下列表索引为基数对应的元素。
list_a=[12,213,22,2,2,2,22,2,2,32]
# 答案
l = filter(lambda x:x in list_a,[i for i in range(len(list_a))])
print(list(l))
69、写一个base62encode函数,62进制。
# 即:0123456789AB..Zab..z(10 个数字+26 个大写字母+26 个小写字母)。
# 答案
def base62Encode(n):
s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
lst = []
while n > 0:
lst.append(n % 62) # 58
n = n // 62
lst = lst[::-1]
result = ""
for item in lst: # 58
result += s[item]
return result
print(base62Encode(58))
# 结果
w
70、请实现一个装饰器,限制该函数被调用的频率,如10秒一次
# 答案
import time
def time_pay(func):
def inner(*args, **kwargs):
for line in range(10):
print(line + 1)
time.sleep(1)
res = func(*args, **kwargs)
return res
return inner
@time_pay
def func1():
print('from func1...')
func1()