一直用 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)
但发现实际用起来,根本不起作用,求教应该怎么改动?
1
Trim21 2018-12-28 21:15:01 +08:00 1
你没有把 x 给 return 回来
|
2
youthfire OP 写成这样我看了下也是无效
def fmtnb(x): x = decimal.Decimal('%.2f' % x) x = format(x, ',') return x 实际用 fmtnb(totala) 并不执行 |
3
likuku 2018-12-28 21:32:16 +08:00
lambda 或许适合你的需求
|
4
youthfire OP @likuku 语句原本是可以完成效果的,我只是想知道为什么用 def 定义后,简化就不执行了。顺便说句,提问正文和回复我都用了 tab/空格,贴上来后代码却没有保留正常的格式。
|
5
noqwerty 2018-12-28 21:44:22 +08:00
报什么错啊?我这边执行是正常的
|
6
nyanyh 2018-12-28 21:53:48 +08:00
>>> fmtnb(10111)
'10,111.00' 结果不是正常的吗 |
8
youthfire OP |
9
chenstack 2018-12-28 22:22:39 +08:00 1
弱弱地猜一下,楼主是否没弄清楚 Python 的变量传递?要这样 total = fmtnb(total) ,没有像 C++的那种引用变量,也不是宏。
|
10
noqwerty 2018-12-28 22:27:35 +08:00 1
@youthfire 这边是我的结果:
$ 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' |
11
youthfire OP @chenstack 还真是!非常感谢!
一直只把 def 用在执行过程,所以都是类似 fmtnb(total),以为这样调用就算完成了变量传递。 |
13
youthfire OP 额外扩展一点,哪天遇到需要设置千分位和保留小数的朋友可能会搜到。
楼主本质是想简化代码,现在发现更好的作法应该是采用 Python3.6 以上支持的 F-strings f'{subtotal:,.2f}' #保留 2 位小数,设置千分位 f'{subtotal:.2f}' #保留 2 位小数 f'{subtotal:.0f}' #不保留小数 这样可以直接在 print 结果中显示需要的形式,但又不影响原来 subtotal 的数值,不会被转化为字符串 |