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
c3yangliu
V2EX  ›  Python

怎么自己实现 if?

  •  
  •   c3yangliu · 2019-01-12 18:49:59 +08:00 via Android · 3604 次点击
    这是一个创建于 2149 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不用 if 关键字,达到 if 的效果
    14 条回复    2019-01-12 21:47:07 +08:00
    aijam
        1
    aijam  
       2019-01-12 19:35:39 +08:00
    这是你想要的吗?
    >>> def _if(predict, b1, b2):
    ... predict and b1()
    ... predict or b2()
    ...
    >>> _if(True, lambda: print(1), lambda: print(2))
    1
    >>> _if(False, lambda: print(1), lambda: print(2))
    2

    还是想玩 lambda calculus ?
    >>> _True = lambda x, y: x
    >>> _False = lambda x, y: y
    >>> def _if(predict, b1, b2):
    ... predict(b1, b2)()
    ...
    >>> _if(_True, lambda: print(1), lambda: print(2))
    1
    >>> _if(_False, lambda: print(1), lambda: print(2))
    2
    laziji
        2
    laziji  
       2019-01-12 19:36:27 +08:00   ❤️ 2
    js 中应该可以用 map 实现
    ```
    let m = {
    true:function(){},
    false:function(){}
    }

    m[a || b]()

    ```
    aijam
        3
    aijam  
       2019-01-12 19:42:50 +08:00
    @laziji 诶,这也是一种办法
    >>> def _if(predict, b1, b2):
    ... d = {True: b1, False: b2}
    ... return d[predict]()
    ...
    >>> _if(True, lambda: print(1), lambda: print(2))
    1
    >>> _if(False, lambda: print(1), lambda: print(2))
    2
    zhustec
        4
    zhustec  
       2019-01-12 19:44:21 +08:00 via iPad
    @aijam 用 python 玩 lambda 演算怕不是玩自己
    aijam
        5
    aijam  
       2019-01-12 20:01:30 +08:00
    @zhustec 不用 python 也是玩自己呀。
    iwtbauh
        6
    iwtbauh  
       2019-01-12 20:31:48 +08:00 via Android
    修改 cpython,自己创建一个关键字等同于 if 的效果就行了。
    FrankHB
        7
    FrankHB  
       2019-01-12 20:45:29 +08:00
    嫌 Church boolean 不够 dt 的,参考 http://www.madore.org/~david/programs/unlambda/#howto_bool。
    Wicked
        8
    Wicked  
       2019-01-12 20:48:49 +08:00 via iPhone
    英特尔 CPU 手册里面有跳转指令
    yucao
        9
    yucao  
       2019-01-12 20:59:34 +08:00
    对于最底层来说分支指令也是最基本的三步:比较,置位,beq
    直接艹汇编呗 233
    junjieyuanxiling
        10
    junjieyuanxiling  
       2019-01-12 21:00:02 +08:00 via Android
    用 while else ?
    Mutoo
        11
    Mutoo  
       2019-01-12 21:04:13 +08:00   ❤️ 2
    要知道汇编语言是没有 if 语句的,在汇编里只有寄存器跳转指令 jz 或 jnz。
    所以本质上你需要 goto 语句来做这件事。但有趣的是 python 也没有 goto 语句。
    不过如果你深挖的话,可以发现 try except 可以用来做流控制。所以可以这样玩:
    https://gist.github.com/mutoo/b84af24688377d857f4aaede8bfefa6c
    c3yangliu
        12
    c3yangliu  
    OP
       2019-01-12 21:09:29 +08:00 via Android
    问这个主要还是想怎么用程序自己控制控制流,最近一直在想怎么在 python 里实现 call/cc
    Mutoo
        13
    Mutoo  
       2019-01-12 21:18:52 +08:00
    @c3yangliu 不太了解 call/cc,不过查了一圈我感觉你要的应该是 generator 和 yield 吧
    watchjulia
        14
    watchjulia  
       2019-01-12 21:47:07 +08:00
    函数指针可以实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2626 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:50 · PVG 18:50 · LAX 02:50 · JFK 05:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.