所以我有这行代码:
fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(fc_no_rocks/100, 3)
接受一个变量,其类型应该是float。当我使用type()测试变量类型时,它返回:
>>>type(fc_no_rocks)
<type 'float'>
但是我一直收到一条错误,上面写着“/ str和int。
不支持的操作数类型答案 0 :(得分:3)
显然,fc_no_rocks
是一个字符串。那个错误在你身上。最好检查几个案例:
fc_no_rocks
是一个数字fc_no_rocks
是一个表示数字的字符串fc_no_rocks
既不是上述您检查以确保fc_no_rocks
不是None
,但它可能是任何。因此,最好先检查一下,然后让你的else
案例成为所有案例,即上述两者都没有。
在三元链的一个大混乱中,就是这样:
fc = round(float(fc_no_rocks)/100.0, 3) if isinstance(fc_no_rocks, str) and unicode(fc_no_rocks.replace('.','',1)).isnumeric() else round(fc_no_rocks/100.0, 3) if isinstance(fc_no_rocks, float) or isinstance(fc_no_rocks, int) else round((1+5*100)/100.0, 3)
最好用多行编写,imo,但是单行编写起来非常有趣。这就像把一桶水放在门上,你知道其他人会走过去。很难成为维护代码的人......! (顺便说一句,确保你在写完这类东西之后辞掉你的工作,这样你就不必成为维护它的人。)
无论如何,输出:
>>> fc_no_rocks = "2.3"
>>> fc = ...
>>> fc
0.023
>>> fc_no_rocks = "foobar"
>>> fc = ...
>>> fc
5.01
>>> fc_no_rocks = 1.3
>>> fc = ...
>>> fc
0.013
>>> fc_no_rocks = 6340
>>> fc = ...
>>> fc
63.4
如果你想在该声明的中间调试,我有个好消息:
>>> import sys
>>> fc_no_rocks = "foobar"
>>> fc = round(float(fc_no_rocks)/100.0, 3) if sys.stdout.write(str(type(fc_no_rocks))+"\n") or isinstance(fc_no_rocks, str) and unicode(fc_no_rocks.replace('.','',1)).isnumeric() else round(fc_no_rocks/100.0, 3) if isinstance(fc_no_rocks, float) or isinstance(fc_no_rocks, int) else round((1+5*100)/100.0, 3)
<type 'str'>
>>> fc
5.01
您可以滥用布尔or
运算符的行为以及write()
方法始终返回None
的事实!万岁!如果你想看到它的表示,你也可以写repr(fc_no_rocks)
- 对于获取字符串的内容和指示是有用的,它是一个字符串。
编辑:我正在运行Python 2.7.2,所以我必须添加小数点才能正确划分。 Woops!的
答案 1 :(得分:1)
为什么不确保fc_no_rocks
是浮点数?
fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(float(fc_no_rocks)/100, 3)
答案 2 :(得分:1)
有一个for循环更改了变量,因此fc_no_rocks设置为None。这在将fc变量开关设置到左侧时产生了逻辑,其中我替换的其中一个变量也是一个字符串。抱歉混淆
答案 3 :(得分:0)
还有一件事。
round((1+5*100)/100, 3)
没有什么可以舍入,因为数字文字都是整数,包含除法的整数等式(1+5*100)/100
的结果是 5 ,而不是 5.01 < / strong>正如您所料。要修复它,你必须在每个十进制计算中使用所有十进制文字:
round((1.0+5.0*100.0)/100.0, 3)
编辑:修复后的语句会产生5.01,所以你应该小心代码的其他部分。