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()