01-14 66—70


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM