彩笔编程时遇到的问题总结一下。
常见问题解决
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
6. 试图将一个可变类型的对象放入集合或作为字典的键
集合和字典中的元素需要是可哈希的(hashable),也就是不能够被改变的。列表是可变类型,其内容可以被改变,所以它是不可哈希的。
l=[]
for i in range(1):
l.append(list(input().split()))
s={x for x in l}
print(s)#TypeError: unhashable type: 'list'
#正确
l=[]
for i in range(1):
l.append(tuple(input().split()))#元组不可改
s={x for x in l}
print(s)
7.split()后列表含有空元素
s="abc,,,def,ghi"
print(s.split(","))#['abc', '', '', 'def', 'ghi']
#正确
print(list(filter(None,s.split(","))))
#['abc', 'def', 'ghi']
8. pymysql库容易出现的问题
pymysql是一个愚蠢的库,只能写局限的存储过程,指令也得一条一条执行。
1. 尽量用cursor.fetchall()代替cursor.fetchone(),避免之前的select的结果没读完。
2. 使用变量接收cursor.fetchall()返回值,直接cursor.fetchall()[0][0]容易出问题。
a=cursor.fetchall()
if a[0][0]==0:
print(666)
3. 注意引号
sql="select * from tb1 where id1=%s"
cursor.execute(sql,"\"6654\"")
db.commit()
print(cursor.fetchall()) #(('"6654"', 's', 2.0),)
sql="select * from tb1 where id1=%s"
cursor.execute(sql,"6654")
db.commit()
print(cursor.fetchall()) #(('6654', '546', 666.0),)
sql="insert into tb1 values(%s,%s,%s)"
cursor.execute(sql,("7758","4",'99'))#7758 4 99
db.commit()
sql="insert into tb1 values(%s,%s,%s)"
cursor.execute(sql,("\"7758\"","4",'99'))#"7758" 4 99