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

2018-12-28 21:10:50 +08:00
 youthfire

一直用 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)

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

1892 次点击
所在节点    Python
13 条回复
Trim21
2018-12-28 21:15:01 +08:00
你没有把 x 给 return 回来
youthfire
2018-12-28 21:20:32 +08:00
写成这样我看了下也是无效

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

实际用 fmtnb(totala) 并不执行
likuku
2018-12-28 21:32:16 +08:00
lambda 或许适合你的需求
youthfire
2018-12-28 21:36:17 +08:00
@likuku 语句原本是可以完成效果的,我只是想知道为什么用 def 定义后,简化就不执行了。顺便说句,提问正文和回复我都用了 tab/空格,贴上来后代码却没有保留正常的格式。
noqwerty
2018-12-28 21:44:22 +08:00
报什么错啊?我这边执行是正常的
nyanyh
2018-12-28 21:53:48 +08:00
>>> fmtnb(10111)
'10,111.00'

结果不是正常的吗
likuku
2018-12-28 21:59:25 +08:00
@youthfire 发新贴,选择 markdown 格式,或许好些。

当然,写 gist 里,链接贴过来是最佳
youthfire
2018-12-28 22:18:09 +08:00
@noqwerty
@nyanyh

没报任何错误,就是根本没执行。
我直接定义后,接下来直接用 fmtnb(10111)倒是执行的。在离开这个定义几百行以外的地方用,没有执行,目标不是具体数值,而是一个变量,类似于用了 fmtnb(total)。
chenstack
2018-12-28 22:22:39 +08:00
弱弱地猜一下,楼主是否没弄清楚 Python 的变量传递?要这样 total = fmtnb(total) ,没有像 C++的那种引用变量,也不是宏。
noqwerty
2018-12-28 22:27:35 +08:00
@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'
youthfire
2018-12-28 22:42:07 +08:00
@chenstack 还真是!非常感谢!
一直只把 def 用在执行过程,所以都是类似 fmtnb(total),以为这样调用就算完成了变量传递。
Trim21
2018-12-29 02:24:46 +08:00
@chenstack #9 万万没想到...
youthfire
2018-12-29 10:46:16 +08:00
额外扩展一点,哪天遇到需要设置千分位和保留小数的朋友可能会搜到。
楼主本质是想简化代码,现在发现更好的作法应该是采用 Python3.6 以上支持的 F-strings

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/522056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX