容易犯错的常见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]实际指向的都是同一个列表内容。

posted on 2019-08-12 19:44  new_wsh  阅读(238)  评论(0编辑  收藏  举报

导航