01-14 66—70

______egon新书python全套来袭请看:https://egonlin.com/book.html

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()
posted @ 2019-10-22 19:54  小猿取经-林海峰老师  阅读(1530)  评论(1编辑  收藏  举报