zoukankan      html  css  js  c++  java
  • 容易犯错的常见python题

    第一.

    print(99.9 - 90)
    print(99.9-90.9 == 9.0)
    print(99.9-90.0 == 9.9)
    

    以上三句代码分别输出结果是什么?python中浮点数间怎么判断是否相等

    参考答案:
    输出结果为: 9.90000000...     
                 True
                 False
    浮点数在计算机里是二进制表示的,10进制能取整的数,比如5.98 6.35等,用二进制表示都是循环小数,有误差。
    	所以虽然显示的都是0.37和0.37,它们就出现误差了。
    好比三进制的0.1 0.2对应10进制的0.3333333.... 0.6666666......
    	那么三进制的0.1+0.2和1.0比较,虽然都是1.0,但是用10进制计算,就是0.999999....和1.0,前者<后者
    
    第二行print为True是因为左边等式小数部分一样,所以减出来等于右边;
    第三行为False参考第一行答案;
    
    浮点数怎么判断相等:
    一般如果需要判断浮点数相等时,我们会采用误差法,比如两个浮点数a-b < 较小的误差值 则认为它们相等。
    

    第二.

    请输出下面代码的数据结果,并阐明原因

    def f(x, l=[]):
        for i in range(x):
            l.append(i*i)
        print(l)
    f(2)
    f(3, [3, 2, 1])
    f(3)
    

    以上函数的输出结果是?为什么
    参考答案:
    输出结果:
    [0, 1] # 使用l的默认值[]
    [3, 2, 1, 0, 1, 4] # 此时有传参, 不使用默认值
    [0, 1, 0, 1, 4] # l为列表,内容在上述第一行情况已被改变

    第三.

    lass A(object):
        x = 1
    
    class B(A):
        pass
    
    class C(A):
        pass
    
    print(A.x, B.x, C.x)
    B.x = 2
    print(A.x, B.x, C.x)
    A.x = 3
    print(A.x, B.x, C.x)
    

    以上函数的输出结果是?为什么
    参考答案:
    输出结果 1 1 1 # 继承的父类的成员
    1 2 1 # 子类赋值后只改变子类的值
    3 2 3 # 父类值发生变化后,没有赋值的子类成员发生改变

    第四.

    session_cache = [10000, 10001, 10002]
    def add_session(session_id):
        session_cache.append(session_id)
    
    def add_session2(session_id):
        session_cache += [session_id]
    
    add_session(10003)
    print(session_cache)
    
    add_session2(10004)
    print(session_cache)
    

    以上代码输出结果是什么?请说明原因
    参考答案:
    代码在add_session2函数报错,因为在add_session2中对session_cache有赋值操作(=),此时会发现局部变量没有定义,故报错,add_session函数中的append不是赋值操作,所以不会报错。

    第五.

    get_node_index = lambda x: int(x % 10)
    temp = [n for n in range(10)]
    for i in range(len(temp)):
        if get_node_index(temp[i]):
            del temp[i]
    print(temp)
    

    以上代码输出结果是什么?请说明原因
    参考答案:
    会报异常:list index out of range , 因为在遍历列表时删除了列表中的元素,列表元素个数已经发生了变化。

    第六.

    def test():
        return [lambda x: i*x for i in range(5)]
    for ret in test():
        print(ret(2))
    

    以上代码输出结果是什么?请说明原因
    参考答案:
    8
    8
    8
    8
    8
    这是因为python的延迟绑定原则,也就是说只有内部函数被调用时才会搜索闭包中变量的值。所以在上述代码中,每次调用return函数时,会在附近作用域中查询变量i的值。

    第七.

    a.py文件
    
    mport b
    def f():
        return b.x
    print(f())
    
    
    b.py文件
    
    import a
    x=1
    def g():
        print(a.f())
    
    

    此时在第三个python文件中import a, 会报错吗?为什么
    假使在第四个文件中import b, 又会报错吗?请说明原因
    参考答案:
    import a时不会报错,因为python中如果一个模块已经被导入,python会自动识别而不会再导入,a文件中import b时并不会执行b.py文件中g()函数内部的代码,所以不会报循环引用错误;
    import b时会报错,因为在b文件中import a时会执行return b.x,而此时b文件x尚未定义;

    第八.

    a = 1
    try:
        a += 1
    except:
        a += 1
    else:
        a += 1
    finally:
        a += 1
    print(a)
    

    以上输出结果是什么?请说明原因
    参考答案:
    输出结果: 4
    因为else执行的条件是没有异常发生,而finally是无论有无异常其代码都会执行。

    第九.

    i = 5
    def f2(k=i):
        print(k)
    i = 6
    f2()
    

    以上输出结果是什么?请说明原因
    参考答案:
    输出结果:5 # 因为python中函数的默认值只会执行一次,k默认值第一次执行时是5

    第十.

    temp = [[]]*3
    temp[0].append(10)
    temp[1].append(20)
    temp[2].append(30)
    print(temp)
    

    以上代码输出结果是?请说明原因
    参考答案:
    输出结果:[[10, 20, 30], [10, 20, 30], [10, 20, 30]]
    因为在使用*运算符时,是直接复制被乘数的引用,temp中是列表,所以其实temp[0], temp[1], temp[2]实际指向的都是同一个列表内容。

  • 相关阅读:
    Springboot+bootstrap界面版之增删改查及图片上传
    springboot整合Redis
    springboot配置数据库连接池druid、整合mybatis、整合pagehelper
    springboot模板
    springboot入门及配置文件介绍
    java自定义注解
    Git集成idea
    Git的基本操作
    Shiro授权及注解式开发
    《算法》-- 总结
  • 原文地址:https://www.cnblogs.com/wshlym/p/11342141.html
Copyright © 2011-2022 走看看