python3 常见问题解决

本文总结了Python编程中遇到的常见问题,如类方法中的self使用、默认参数共享、迭代中修改对象、解包顺序、浮点数精度、不可哈希类型、split处理和pymysql库的使用注意事项等,并提供了相应的修正方法。
摘要由CSDN通过智能技术生成

彩笔编程时遇到的问题总结一下。

常见问题解决

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值