Python技巧100题(九)

在这里插入图片描述

1.不使用递归,怎么高效写出阶乘表达式

from functools import reduce
from operator import mul
def fact(n):
    return reduce(nul, range(1 ,n+1))
print(fact(5))
120    

2.Python什么时候执行装饰器

registry = []

def register(func):
    print('running register(%s)' % func)
    registry.append(func)
    return func

@register
def f1():
    print('running f1()')

@register
def f2():
    print('running f2()')

def f3():
    print('running f3()')

def main():
    print('running main()')
    print('registry ->', registry)
    f1()
    f2()
    f3()

if __name__ == '__main__':
    main()

running register(<function f1 at 0x0000027913AA8708>)
running register(<function f2 at 0x0000027913AA8E58>)
running main()
registry -> [<function f1 at 0x0000027913AA8708>, <function f2 at 0x0000027913AA8E58>]
running f1()
running f2()
running f3()

3.判断下面语句执行是否会报错

b = 3
def fun(a):
    print(a)
    print(b)
    b = 7
fun(2)    

4.怎么强制把函数中局部变量变成全局变量

b = 3
def fun(a):
    global b
    print(a)
    print(b)
    b = 7
b = 5
fun(2)
2
5    

5.闭包中怎么对数字、字符串、元组等不可变元素更新

def make_averager:
    count = 0
    total = 0
def averager(new_value):
    nonlocal count, total
    count += 1
    total += new_value
    return total / count
return averager
avg = make_averager()
avg(10)
10.0        

6.Python2怎么解决访问外部变量报错的问题

https://www.python.org/dev/peps/pep-3104/

7.测试代码运行的时间

import time
t0 = time.time()
for i in range(10000):
    pass
t1 = time.time()
print(t1 - t0) 

t0 = time.perf_count()
for i in range(10000):
    pass
t1 = time.perf_count()
print(t1 - t0)       

8.怎么优化递归算法,减少执行时间

import functools
@functools.lru_cache()
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-2)+fibonacci(n-1)
fibonacci(6)
8        

9.比较两个对象的值(对象中保存的数据)是否相等

a = [1, 2, 3]
b = [1, 2, 3]
a == b
True

10.比较两个对象的内存地址id是否相等

a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)
False
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值