所以我有这行代码:
fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(fc_no_rocks/100, 3)
它接受一个变量,其类型应该是浮点数。当我使用 type() 测试变量类型时,它返回:
>>>type(fc_no_rocks)
<type 'float'>
但我不断收到一条错误消息,提示“/:str 和 int 的操作数类型不受支持。
所以我有这行代码:
fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(fc_no_rocks/100, 3)
它接受一个变量,其类型应该是浮点数。当我使用 type() 测试变量类型时,它返回:
>>>type(fc_no_rocks)
<type 'float'>
但我不断收到一条错误消息,提示“/:str 和 int 的操作数类型不受支持。
显然,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,所以我必须添加小数点才能正确除法。哎呀!
有一个 for 循环改变了变量,所以 fc_no_rocks 被设置为 None。这使得将 fc 变量切换到左侧时的逻辑,其中我替换的变量之一也是一个字符串。抱歉混淆了
为什么不只是确保fc_no_rocks
是一个浮动?
fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(float(fc_no_rocks)/100, 3)
还有一件事。
round((1+5*100)/100, 3)
没有什么要四舍五入的,因为数字文字都是整数,并且这个(1+5*100)/100
包含除法的整数方程的结果是5,而不是您期望的5.01 。要修复它,您必须在每次十进制计算中使用所有十进制文字:
round((1.0+5.0*100.0)/100.0, 3)
编辑:repaired 语句将导致 5.01,因此您应该小心代码的其他部分。