• 第四次测试题+答案



    一. 回答题


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

    本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)

    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[4].append('c') #修改对象a中的['a', 'b']数组对象

    print('a = ', a)
    print('b = ', b)
    print('c = ', c)
    print('d = ', d)

    a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
    b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
    c = [1, 2, 3, 4, ['a', 'b', 'c']]
    d = [1, 2, 3, 4, ['a', 'b']]

    3. 打印代码的值,并解释其原因。

    a = 1
    def fun(a):
    a = 2
    return a
    print(fun(a))
    print(a)

    # 2 1

    4. 打印代码的值,并解释其原因。

    a = []
    def fun(a):
    a.append(1)
    return a
    print(fun(a))
    print(a)

    # [1] [1]

    5. L = [x*x for x in range(10)] 和 g = (x*x for x in range(10))的结果分别为:

    # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] <generator object <genexpr> at 0x0000028F8B774200>


    6. 将列表生成式中[]改成() 之后数据结构是否改变?请说明原因。

    是,从列表变为生成器

    通过列表生成式,可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含百万元素的列表,不仅是占用很大的内存空间,如:我们只需要访问前面的几个元素,后面大部分元素所占的空间都是浪费的。因此,没有必要创建完整的列表(节省大量内存空间)。在Python中,我们可以采用生成器:边循环,边计算的机制—>generator

    7. 创建一个闭包必须满足那些条件:

    1.必须有一个内嵌函数
    2.内嵌函数必须引用外部函数中的变量



    8. 通过函数化编程实现5的阶乘 提示:在函数中使用递归 例如函数中传入5,计算出5*4*3*2*1的结果

    def func(n):
    if n == 1:
    return 1
    else:
    return n * func(n - 1)

    obj = func(3)
    print(obj)


    9. 为此函数加装饰器

    def foo():
      print('hello foo')

    (1)为此函数加一个装饰器,执行对应函数内容后,将当前时间写入一个文件做一个日志记录。
    (2)改成参数装饰器,即可以根据调用时传的参数决定是否记录时间,比如@logger(True)


    import time

    def init(func):
    def wrapper(*args,**kwargs):
    a= str(time.time()) + "执行%s " % func
    with open("record.txt","a+") as f:
    f.write(a)
    func(*args,**kwargs)
    return wrapper

    @init
    def foo():
    print('hello foo')
    return()

    foo()




    import time

    def auth(flag):
    def init(func):
    def wrapper(*args,**kwargs):
    if flag == True:
    a= str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "执行%s " % func
    with open("record.txt","a+") as f:
    f.write(a)
    func(*args,**kwargs)
    return wrapper
    return init

    @auth(True)
    def foo():
    print('hello foo')

    foo()

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

    def my_dict(dic):
    for key in dic:
    if len(dic[key]) > 2:
    dic[key] = dic[key][0:2]
    else:
    continue
    return dic
    dic = {"k1": "v1v1", "k2": [11,22,33,44]}
    res = my_dict(dic)
    print(res)

    11. 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

    def my_fun(func):
    my_count = 0
    func1 = []
    for i in func:
    my_count = my_count + 1
    if my_count % 2 == 0:
    func1.append(i)
    print(func1)
    my_fun([1,2,3,'edj'])


    12. 使用内置函数将 a="1234" 变为 [1, 2, 3, 4]

    list(map(int, '1234'))


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

    sorted(obj,key=abs)


    14. 1)提供2017-11-1 2017-11-30 打印出他们之间的日期
    例如:2017-11-01
    2017-11-02
    2017-11-03

    import time
    start_time = time.mktime(time.strptime("2017-11-01","%Y-%m-%d"))
    end_time = time.mktime(time.strptime("2017-12-01","%Y-%m-%d"))
    while start_time <= end_time:
    print(time.strftime("%Y-%m-%d",time.localtime(start_time)))
    start_time += 86400.0 

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

    import time
    start_time = time.mktime(time.strptime("2017-12-01","%Y-%m-%d"))
    end_time = time.mktime(time.strptime("2018-1-17","%Y-%m-%d"))
    w_dic = {"0":"星期日","1":"星期一","2":"星期二","3":"星期三","4":"星期四","5":"星期五","6":"星期六"}
    while start_time <= end_time:
    date_num_mode = time.strftime("%Y-%m-%d %w",time.localtime(start_time))
    date_ymd,date_w = date_num_mode.split(" ")
    print(date_ymd,w_dic[date_w])
    start_time += 86400.0


    15. 使用生成器编写foo函数,调用该函数foo(21)产生如下结果(斐波那契数列),1,1,2,3,5,8,13,21

    def fib(max):
    a = 0
    b = 1
    while b<=max:
    yield b
    b,a = a+b,b
    for i in fib(21):
    print(i,end=' ')

    16. 读取文件a.txt,匹配文中所有ip地址,将所有ip地址加入到一个列表中,打印该列表。

    import re

    li = []
    with open("a","r") as f:
    for line in f:
    result = re.findall(r'd+.d+.d+.d+', line)
    if result:
    li += result
    print(li)

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

    import re
    s = '123.33sdhf3424.34fdg323.324sss12'
    obj = re.findall(r'd+.d+|d+',s)

    start = 0
    for i in obj:
    start += float(i)
    print(start)


    18. 正则替换:

    1.将字符串中所有的数字换为大写字母A, 结果为 aakkAdddAkkA
    result=aakk123ddd55kk66

    print(re.sub("d+","A",result))

    2.将字符串的前4位数字转换为A

    print(re.sub("d","A",result,4))

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

    import random
    checkcode = ''
    for i in range(4):
    current = random.randrange(0,4)
    if current != i:
    temp = chr(random.randint(65,90))
    else:
    temp = random.randint(0,9)
    checkcode += str(temp)
    print(checkcode)


    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}
    ]


    name = list(filter(lambda x:x["price"] > 100,portfolio))
    print(name)


    21. 怎么理解迭代器和生成器?生成器有什么特点?


    22. 函数的形参有哪几种方式,各自在什么情况下使用以及存放顺序?


    23. 如下输出以下函数的执行结果

    def foo(a1, args = []):
    print("args before = %s" % (args))
    args.insert(0, 10)
    args.insert(0, 99999)
    print("args = %s " % (args))

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

    if __name__ == "__main__":
    main()


    args before = []
    args = [99999, 10]
    args before = [99999, 10]
    args = [99999, 10, 99999, 10]


    24. 解释一下是否会报错,原因是什么?要是不报错打印什么值?报错的可以怎么改就不报错

    1).
    def test():
    print(luffy)
    luffy = "the king of sea."

    2).
    def test():
    print(luffy)
    luffy = 'e'
    luffy = "the king of sea."

    3).
    def test():
    luffy = 'e'
    print(luffy)
    luffy = "the king of sea."

    4).
    def func(a,**kwargs):
    print(kwargs)
    print(a)
    for k,v in kwargs.items():
    print(k,v)
    func({"name":"alex"})

    结果:{'name': 'alex'}
    {}
    name alex


    25. 实现9*9乘法口诀表


    for i in range(1,10):
    for j in range(1,10):
    print(j, "x", i, "=", i * j," ",end="")
    if i==j:
    print("")
    break

  • 相关阅读:
    让超链接点击后不跳转,可以用href = "#",但是这个#就会锚点到页面最上边 点击链接后不跳转可以设置成
    js 小数取整的函数
    谷歌浏览器常用快捷键
    Vi问题
    UbuntuFAQ
    Ubuntu下配置C/C++开发环境
    win7硬盘安装ubuntu双系统——注意项
    怎样判断自己是否在平庸者之列?
    2012年软件开发者薪资调查报告
    VIM常用快捷键~网页上查找
  • 原文地址:https://www.cnblogs.com/mengbin0546/p/8505891.html
Copyright © 2020-2023  润新知