V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
youthfire
V2EX  ›  Python

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

  •  
  •   youthfire · 2018-12-28 21:10:50 +08:00 · 1953 次点击
    这是一个创建于 2160 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直用 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
    Trim21
        1
    Trim21  
       2018-12-28 21:15:01 +08:00   ❤️ 1
    你没有把 x 给 return 回来
    youthfire
        2
    youthfire  
    OP
       2018-12-28 21:20:32 +08:00
    写成这样我看了下也是无效

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

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

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

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

    没报任何错误,就是根本没执行。
    我直接定义后,接下来直接用 fmtnb(10111)倒是执行的。在离开这个定义几百行以外的地方用,没有执行,目标不是具体数值,而是一个变量,类似于用了 fmtnb(total)。
    chenstack
        9
    chenstack  
       2018-12-28 22:22:39 +08:00   ❤️ 1
    弱弱地猜一下,楼主是否没弄清楚 Python 的变量传递?要这样 total = fmtnb(total) ,没有像 C++的那种引用变量,也不是宏。
    noqwerty
        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'
    youthfire
        11
    youthfire  
    OP
       2018-12-28 22:42:07 +08:00
    @chenstack 还真是!非常感谢!
    一直只把 def 用在执行过程,所以都是类似 fmtnb(total),以为这样调用就算完成了变量传递。
    Trim21
        12
    Trim21  
       2018-12-29 02:24:46 +08:00
    @chenstack #9 万万没想到...
    youthfire
        13
    youthfire  
    OP
       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 的数值,不会被转化为字符串
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3429 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 11:31 · PVG 19:31 · LAX 03:31 · JFK 06:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.