彩笔编程时遇到的问题总结一下。
1. 不是类方法不要多加self
def fun(self,*a):
return a
print(fun(*(1,2,3,4,5,6)))
#(2, 3, 4, 5, 6)
2. 传递一个可变对象(如列表)作为默认参数,那么这个对象将在函数定义时被创建,并在所有的函数调用中被共享。
def demo(new,old=[]):#第一次调用时创建列表添加元素后old为['a'],第二次调用添加一个元素后为['a','b']
old.append(new)
return old
print(demo('a'))#['a']
print(demo('b'))#['a', 'b']
#改正
def demo(new, old=None):
if old is None:
old = []
old.append(new)
return old
print(demo('a'))#['a']
print(demo('b'))#['b']
3. 在循环中试图修改正在迭代的对象容易出问题。
x=[1,2,1,2,1,2]
for i in x:
x.remove(i)
print(x)#[2, 2, 2]
#正确写法
x=[1,2,1,2,1,2]
for i in x[::]:#x[::]是x的副本
x.remove(i)#[]
4. 解包优先问题
def fun(a,b,c):
print(a,b,c)
fun(a=1,*(2,3))#报错,因为先解包a=2,b=3,然后a=1,a被重复赋值了,所以报错
fun(c=3,*(1,2))
5. 浮点数计算错误
print(1.5*1.1234)
#1.6850999999999998
#正确
import decimal
a=decimal.Decimal('1.1234')
b=decimal.Decimal('1.5')
print("%s"%(str(a*b).rstrip('0')))#计算并去掉小数点后最右边多余的0
#1.6851