Python中这段Def定义为何无法生效?

一直用 def 定义一段执行过程,那能否定义一段文字呢?

经常需要对某些数字作保留 2 位小数和千分位处理,于是想 def 一个,以帮助简化代码

def fmtnb(x): x = decimal.Decimal('%.2f' % x) x = format(x, ',')

后续例如写这 4 行的时候

totala = decimal.Decimal('%.2f' % totala) totala = format(totala, ',')

totalb = decimal.Decimal('%.2f' % totalb) totalb = format(totalb, ',')

可以直接写成 fmtnb(totala) fmtnb(totalb)

但发现实际用起来,根本不起作用,求教应该怎么改动?


Python中这段Def定义为何无法生效?

13 回复

你没有把 x 给 return 回来


我无法理解你的问题。

写成这样我看了下也是无效

def fmtnb(x):
x = decimal.Decimal(’%.2f’ % x)
x = format(x, ‘,’)
return x

实际用 fmtnb(totala) 并不执行

lambda 或许适合你的需求

语句原本是可以完成效果的,我只是想知道为什么用 def 定义后,简化就不执行了。顺便说句,提问正文和回复我都用了 tab/空格,贴上来后代码却没有保留正常的格式。

>>> fmtnb(10111)
'10,111.00’

结果不是正常的吗

发新贴,选择 markdown 格式,或许好些。

当然,写 gist 里,链接贴过来是最佳




没报任何错误,就是根本没执行。
我直接定义后,接下来直接用 fmtnb(10111)倒是执行的。在离开这个定义几百行以外的地方用,没有执行,目标不是具体数值,而是一个变量,类似于用了 fmtnb(total)。

弱弱地猜一下,楼主是否没弄清楚 Python 的变量传递?要这样 total = fmtnb(total) ,没有像 C++的那种引用变量,也不是宏。

这边是我的结果:

$ ipython
In [1]: import decimal

In [2]: def fmtnb(x):
…: x = decimal.Decimal(’%.2f’ % x)
…: x = format(x, ‘,’)
…: return x
…:

In [3]: x = 10111

In [4]: y = fmtnb(x)

In [5]: y
Out[5]: ‘10,111.00’

还真是!非常感谢!
一直只把 def 用在执行过程,所以都是类似 fmtnb(total),以为这样调用就算完成了变量传递。

#9 万万没想到…

额外扩展一点,哪天遇到需要设置千分位和保留小数的朋友可能会搜到。
楼主本质是想简化代码,现在发现更好的作法应该是采用 Python3.6 以上支持的 F-strings

f’{subtotal:,.2f}’ #保留 2 位小数,设置千分位
f’{subtotal:.2f}’ #保留 2 位小数
f’{subtotal:.0f}’ #不保留小数

这样可以直接在 print 结果中显示需要的形式,但又不影响原来 subtotal 的数值,不会被转化为字符串

回到顶部