• 第三次测试


     

     1. 写出Python查找一个变量的顺序 提示:4中作用域的顺序

    #站在全局角度上找变量 : 先找全局 再找内置
    #站在局部的角度上:先找局部 再全局 再内置
    2. 如下:Python里的拷贝,打印结果并解释。
    import copy
    a = [1, 2, 3, 4, ['a', 'b']]  #原始对象
    
    b = a                       #赋值,传对象的引用
    c = copy.copy(a)              #对象拷贝,浅拷贝
    d = copy.deepcopy(a)          #对象拷贝,深拷贝
    
    a.append(5)               #修改对象a
    a = [1, 2, 3, 4, ['a', 'b'],5]
    a[4].append('c')              #修改对象a中的['a', 'b']数组对象
    a = [1, 2, 3, 4, ['a', 'b','c'],5]
    print(id(a),id(b),id(c))
    print('a = ', a)   #a = [1, 2, 3, 4, ['a', 'b','c'],5]
    print('b = ', b)   #a = [1, 2, 3, 4, ['a', 'b','c'],5]#b是把a赋值
    print('c = ', c)   #[1, 2, 3, 4, ['a', 'b','c']] #c是浅拷贝第一层列表地址独立,第二层和a用的是一个
    print('d = ', d)   #[1, 2, 3, 4, ['a', 'b']] #d是深拷贝,每一层都是独立的

    3. 打印代码的值,并解释其原因。
    a = 1
    def fun(a):
        a = 2
        return a
    print(fun(a))  # 等于2 因为在函数内部重新赋值了
    print(a)       # 等于1 因为只能使用全局变量,局部变量不能被全局变量引用

    4. 打印代码的值,并解释其原因。
    a = []
    def fun(a):  # 在python中传递参数 或者返回值 的时候 都是 使用 地址引用
        a.append(1)  # a=[1] 空列表中添加一个[1]
        return a
    print(fun(a))   #返回的是[1]
    print(a)        #[1] 局部变量a传入的是一个可变数据类型[]空列表,局部变量只会指向那个列表的地址,列表内的数据变化时,全局也会=跟着变化
    5. L = [x*x for x in range(10)] 和 g = (x*x for x in range(10))的结果分别为:
    L=[0,1,4,...81]#列表推导式
    g是一个生成器#生成器表达式
    6. 将列表生成式中[]改成() 之后数据结构是否改变?请说明原因。
    #数据类型发生变化,一个是列表推导式。另一个是生成器表达式
    7. 创建一个闭包必须满足那些条件:
    #内部函数被外部函数变量的引用
    
    
    
    
    8. 通过函数化编程实现5的阶乘  提示:在函数中使用递归 例如函数中传入5,计算出5*4*3*2*1的结果
    def f(n):#定义函数
        if n == 1:return 1#如果n==1返回1
        return n*f(n-1)#返回n*f(n-1
    print(f(5)) 

    9. 为此函数加装饰器
    def foo():
      print('hello foo')

    (1)为此函数加一个装饰器,执行对应函数内容后,将当前时间写入一个文件做一个日志记录。
    (2)改成参数装饰器,即可以根据调用时传的参数决定是否记录时间,比如@logger(True)
    import time#引入time模块
    def logger(Flag):#定义一个函数
        def wrapper(func):#
            def inner(*args,**kwargs):#定义一个inner函数
                ret = func(*args,**kwargs)#返回一个函数接收inner的参数
                if Flag:#在函数运行之后if 为真
                    with open('log.log','a',encoding='utf-8') as f:#打开log.log文件以追加的形式
                        f.write('执行了%s函数,执行时间%s
    '%(func.__name__,time.strftime('%Y-%m-%d %H:%M:%S')))#写入日志
                return ret#返回 ret
            return inner#返回 inner
        return wrapper#返回一个 wrapper
    
    @logger(False) #调用函数装饰器  # wrapper = logger(False)  @wrapper
    def foo():print('hello foo')
    
    foo()


    10. 写函数,将字典作为参数传进函数,检查传入字典的每一个value的长度,如果大于2,
    那么仅保留前两个长度的内容,并将新内容返回给调用者。PS:字典中的value只能是字符串或列表
    dic = {"k1": "v1v1", "k2": [11,22,33,44],'k3':'1'}
    def func(dic):
    for key in dic:
    dic[key] = dic[key][:2]
    return dic
    print(func(dic))

    11. 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
    def my_fun(lst):
    return lst[1::2]
    my_fun([1,2,3,'edj'])

    12. 使用内置函数将 a="1234" 变为 [1, 2, 3, 4]
    a="1234"
    print(list(map(lambda n:int(n),a)))

    13. 使用内置函数对obj = [25, 9, -23, 9, -11]按绝对值大小排序。
    obj = [25, 9, -23, 9, -11]
    print(sorted(obj,key=abs))

    import time
    14. 1)提供2017-11-1 2017-11-30 打印出他们之间的日期
    例如:2017-11-01
    2017-11-02
    2017-11-03
    struct_time = time.strptime('2017-11-1','%Y-%m-%d')
    timestamp = time.mktime(struct_time)
    struct_time = time.strptime('2017-11-30','%Y-%m-%d')
    timestamp2 = time.mktime(struct_time)
    while timestamp <= timestamp2:
    struct_time = time.localtime(timestamp)
    print(time.strftime('%Y-%m-%d', struct_time))
    timestamp = timestamp + 60*60*24 # 加了一天


    2)打印出 2017-11-1 2017-11-30的之间日期,并打印出各自对应的星期。
    例如:2017-12-01 星期五
    2017-12-02 星期六
    2017-12-03 星期日

    struct_time = time.strptime('2017-11-1','%Y-%m-%d')
    timestamp = time.mktime(struct_time)
    struct_time = time.strptime('2017-11-30','%Y-%m-%d')
    timestamp2 = time.mktime(struct_time)
    dic = {0:'星期一',1:'星期二',2:'星期三',3:'星期四',4:'星期五',5:'星期六',6:'星期日'}
    while timestamp <= timestamp2:
    struct_time = time.localtime(timestamp)
    print('%s %s'%(time.strftime('%Y-%m-%d',struct_time),dic[struct_time.tm_wday]))
    timestamp = timestamp + 60*60*24 # 加了一天
    def fib(n):
    a = 0
    b = 1
    yield 1
    while b<n:
    yield a+b
    c = a
    a = b
    b = c+b

    g = fib(21)
    for n in g:print(n)

    16. 读取文件a.txt,匹配文中所有ip地址,将所有ip地址加入到一个列表中,打印该列表。
    import re
    l = []
    with open('a.txt') as f:
    for line in f:
    ret = re.findall(r'[d]+.[d]+.[d]+.[d]+',line)
    l.extend(ret)
    print(l)

    17. s = '123.33sdhf3424.34fdg323.324',计算字符串中所有数字的和(使用正则)
    本题结果应为:123.33+3424.34+323.32
    import re

    s = '123.33sdhf3424.34fdg323.324'
    ret = re.findall('d+.d{0,2}',s)
    print(sum([float(i) for i in ret]))

    18. 正则替换:
    1.将字符串中所有的数字换为大写字母A, 结果为 aakkAdddAkkA
    result='aakk123ddd55kk66'
    import re
    ret = re.sub('d+','A',result)
    print(ret)
    2.将字符串的前4位数字转换为A
    result='aakk123ddd55kk66'
    import re
    ret = re.sub('d','A',result,4)
    print(ret)

    19. 利用random模块随机生成四位验证码,包括字母和数字

    20. 如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格,
    用filter过滤出,单价大于100的股票有哪些
    portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
    ]
    print(list(filter(lambda dic:dic['price']>100 ,portfolio)))

    21. 怎么理解迭代器和生成器?生成器有什么特点?
    生成器就是迭代器
    迭代器的特点:遵循可迭代协议 惰性运算 可以节省内存
    生成器: python用户可以写的迭代器
    生成器函数 和 生成器表达式 是python程序员实现迭代器效果的主要途径

    22. 函数的形参有哪几种方式,各自在什么情况下使用以及定义顺序?
    位置参数 关键字(默认)参数 动态参数(*args,**kwargs)
    位置参数 *args 默认参数 **kwargs


    23. 输出以下函数的执行结果 : 默认参数的陷阱问题
    def foo(a1,args = []):
    print("args before = %s" % (args)) #[] [99999,10]
    args.insert(0, 10)
    args.insert(0, 99999)
    print("args = %s " % (args)) #[99999,10] [99999,10,99999,10]

    def main():
    foo('a')
    foo('b')

    if __name__ == "__main__":
    main()

    24. 使用代码实现 9 * 9 乘法表 如:
    1 x 1 = 1
    1 x 2 = 2 2 x 2 = 4
    1 x 3 = 3 2 x 3 = 6 3 x 3 = 9
    1 x 4 = 4 2 x 4 = 8 3 x 4 = 12 4 x 4 = 16
    1 x 5 = 5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25
    1 x 6 = 6 2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30 6 x 6 = 36
    1 x 7 = 7 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 7 x 7 = 49
    1 x 8 = 8 2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40 6 x 8 = 48 7 x 8 = 56 8 x 8 = 64
    1 x 9 = 9 2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45 6 x 9 = 54 7 x 9 = 63 8 x 9 = 72 9 x 9 = 81

    for i in range(1,10):
    for j in range(1,i+1):
    if i == j:
    print('%s x %s = %2s'%(j,i,i*j))
    else:
    print('%s x %s = %2s' % (j, i, i * j),end=' ')

    [print('%s x %s = %2s'%(j,i,i*j)) if i == j else print('%s x %s = %2s'%(j,i,i*j),end=' ')
    for i in range(1,10) for j in range(1,i+1)]
  • 相关阅读:
    03-串联
    大数据项目之电商数仓(3电商数据仓库系统)V6.1.3
    JQuery实现tab页
    Java面试题之计算字符/字符串出现的次数
    ios 苹果内购订单验证 --- nodejs实现
    ios 苹果内购订单验证 --- php实现
    Android内购订单验证 --- nodejs实现
    Android内购订单验证 --- php实现
    Google Compute Engine VM自动调节
    php性能优化 --- laravel 性能优化
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/8583907.html
Copyright © 2020-2023  润新知