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

小白问一个 python 入门的问题

  •  
  •   kangsgo · 2016-08-12 11:29:44 +08:00 · 3965 次点击
    这是一个创建于 3061 天前的主题,其中的信息可能已经有所发展或是发生改变。

    获取了一个变量 s,如果 s 的值属于如下范围,对应有 x 的值

    1<s<2
    x=1
    2<s<3
    x=2
    3<s<4
    x=5
    

    我只知道用 if 语句来实现,有什么更好的更简洁办法吗?

    第 1 条附言  ·  2016-08-12 20:18:01 +08:00

    #补充:

    应为判定条件太多了,有10多个变量,每个变量都类似上面这种有一些取值范围对应不同的值,然后对这些最后的值加和。如果都是一个一个写if感觉代码维护非常麻烦,所以问下有没有简便方法.

    27 条回复    2016-08-13 13:53:52 +08:00
    q397064399
        1
    q397064399  
       2016-08-12 11:37:49 +08:00 via iPhone   ❤️ 1
    没有 你能想到的 就是最简单的 代码是给人看的 不是用来炫技
    kangsgo
        2
    kangsgo  
    OP
       2016-08-12 12:35:08 +08:00
    @q397064399 因为条件太多了,所以问一下有没有简单方法,有很多判定条件
    Mistwave
        3
    Mistwave  
       2016-08-12 12:45:23 +08:00 via iPhone   ❤️ 1
    如果区间都是 1 ,可以用 round()或 int()映射之后用 dict 取值。
    以你的例子:
    d = {1:1, 2:2, 3:5}
    x = d[int(s)]
    dongfang
        4
    dongfang  
       2016-08-12 12:46:01 +08:00   ❤️ 1
    用 lambda 表达式也可以
    def f(s):
    L = [(lambda :1),
    (lambda :2),
    (lambda :5),]
    x = L[int(s)-1]()
    return x
    dongfang
        5
    dongfang  
       2016-08-12 12:54:05 +08:00
    这样也可以
    x = int(s)**2 -2*int(s) +2
    tumb8r
        6
    tumb8r  
       2016-08-12 12:58:47 +08:00
    if s>min and s<max:
    x=min
    tumb8r
        7
    tumb8r  
       2016-08-12 12:59:14 +08:00
    好吧,我错了
    mazyi
        8
    mazyi  
       2016-08-12 13:01:43 +08:00   ❤️ 1
    @Mistwave 你的这个答案应该是比较符合 python 编程的风格的, python 的作者不喜欢 switch 也不喜欢很多个 if else ,而是建议用 dict 完成 switch 的工作。

    题主学习的时候要多注意呀。
    xiaoc19
        10
    xiaoc19  
       2016-08-12 13:18:03 +08:00   ❤️ 1
    我跟楼上的思路不太一样啊,既然这么有规律 抓住 规律好了

    def test(a):
    return int(a-1)

    print test(s)


    这样当 s 为 1.5 ,输出就是 1 ,,为 2.5 ,输出不就是 2
    xiaoc19
        11
    xiaoc19  
       2016-08-12 13:18:34 +08:00
    额 接楼上 return 那行的缩紧 不知道为啥 回复后没了
    lostsquirrel
        12
    lostsquirrel  
       2016-08-12 13:20:11 +08:00
    用 dict
    xiaoc19
        13
    xiaoc19  
       2016-08-12 13:23:46 +08:00
    原来 V2EX 回复会自动缩紧,那改成
    x = int(s-1)
    print x
    xiaoc19
        14
    xiaoc19  
       2016-08-12 13:26:53 +08:00
    额,原来看错了,
    3<s<4
    x=5
    这没有规律了,
    那为了可读性 还是用 if 吧
    xvx
        15
    xvx  
       2016-08-12 13:54:32 +08:00
    @Mistwave 思路不错。+1
    q397064399
        16
    q397064399  
       2016-08-12 15:14:52 +08:00 via iPhone
    @kangsgo 那就把所有条件弄出来
    bravecarrot
        17
    bravecarrot  
       2016-08-12 18:22:40 +08:00
    @mazyi xue 到了!
    eliteYang
        18
    eliteYang  
       2016-08-12 19:16:36 +08:00
    如果找不到规律就用 dict 或者 if
    czheo
        19
    czheo  
       2016-08-12 19:23:11 +08:00
    @xvx
    @Mistwave 思路不错+ 1 。 jump table 的思想。
    zhicheng
        20
    zhicheng  
       2016-08-12 19:34:20 +08:00 via Android
    加个 if 加个缩进这代码就有了,还问个啥。。。
    hard2reg
        21
    hard2reg  
       2016-08-12 19:42:09 +08:00
    @q397064399 同意
    @Mistwave 感谢,学习一个!
    hinkal
        22
    hinkal  
       2016-08-12 19:52:02 +08:00 via Android
    x = 1 if 1<s<2 else 2 if 2<s<3 else 5 if 3<s<4 else x
    lichy
        23
    lichy  
       2016-08-12 20:02:25 +08:00
    学习了
    xujinkai
        24
    xujinkai  
       2016-08-12 20:09:27 +08:00 via Android   ❤️ 1
    条件特别多又没规律甚至经常变的话可以写个表,然后通过解析表来赋值,代码稍微多一些。好处是万能。比如
    1,2,1
    2,3,2
    3,4,5
    ……
    这样,然后一行一行读,符合就赋值。
    lll9p
        25
    lll9p  
       2016-08-13 03:49:28 +08:00
    每个变量打个表,规定 s 取值范围对应的变量即可,求指正。

    https://gist.github.com/lll9p/148d4b04417edc0c0df2a9eea8ce5cd9
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2892 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:45 · PVG 21:45 · LAX 05:45 · JFK 08:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.