1

所以我有这行代码:

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 的操作数类型不受支持。

4

4 回答 4

3

显然,fc_no_rocks在你的情况下是一个字符串。那个虫子在你身上。最好检查几种情况:

  1. fc_no_rocks是一个数字
  2. fc_no_rocks是一个表示数字的字符串
  3. 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,所以我必须添加小数点才能正确除法。哎呀!

于 2013-07-18T21:32:46.030 回答
1

有一个 for 循环改变了变量,所以 fc_no_rocks 被设置为 None。这使得将 fc 变量切换到左侧时的逻辑,其中我替换的变量之一也是一个字符串。抱歉混淆了

于 2013-07-18T21:12:19.650 回答
1

为什么不只是确保fc_no_rocks是一个浮动?

fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(float(fc_no_rocks)/100, 3)
于 2013-07-18T20:45:44.943 回答
0

还有一件事。 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,因此您应该小心代码的其他部分。

于 2013-07-18T20:53:56.017 回答