首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

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

  •  
  •   youthfire · 53 天前 · 1005 次点击
    这是一个创建于 53 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    13 回复  |  直到 2018-12-29 10:46:16 +08:00
        1
    Trim21   53 天前   ♥ 1
    你没有把 x 给 return 回来
        2
    youthfire   53 天前
    写成这样我看了下也是无效

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

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

    结果不是正常的吗
        7
    likuku   53 天前   ♥ 1
    @youthfire 发新贴,选择 markdown 格式,或许好些。

    当然,写 gist 里,链接贴过来是最佳
        8
    youthfire   53 天前
    @noqwerty
    @nyanyh

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

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

    这样可以直接在 print 结果中显示需要的形式,但又不影响原来 subtotal 的数值,不会被转化为字符串
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   795 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 21:52 · PVG 05:52 · LAX 13:52 · JFK 16:52
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1