V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
suifengingo
V2EX  ›  问与答

Python 语言的 if 循环如何批量生成,在线向大神请教!

  •  
  •   suifengingo · 2020-02-07 11:44:43 +08:00 · 4418 次点击
    这是一个创建于 1752 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人在使用 python 语言进行 if 循环的代码编写中,需要多次写入 if 判断语句,而且每次的判断数字都是依次递增 1 的,人工手写起来太耗时了,而且出错的话不好回过头来检查是哪里出错,所以想向大神请教下,不知是否有批量生成这种语句的代码?在这里小生先谢谢了!真心希望能得到大神的回答

    71 条回复    2020-02-08 11:44:36 +08:00
    ipwx
        1
    ipwx  
       2020-02-07 11:48:32 +08:00
    啥意思,没看懂。能不能把原始需求说一下
    jugelizi
        2
    jugelizi  
       2020-02-07 11:51:42 +08:00
    难道
    if(id==1)
    ...
    if(id==2)
    ...

    if(id==100)
    这样的?
    ClericPy
        3
    ClericPy  
       2020-02-07 11:52:34 +08:00   ❤️ 4
    同一楼, 别拿自己判断的做法来求思路, 直接提原始需求可以避免走弯路
    cassyfar
        4
    cassyfar  
       2020-02-07 11:52:48 +08:00
    ctrl c ctrl v?
    reus
        5
    reus  
       2020-02-07 11:53:32 +08:00 via Android
    说出你原本要解决的问题
    suifengingo
        6
    suifengingo  
    OP
       2020-02-07 12:09:50 +08:00
    首先谢谢各位大佬的热心解答,
    正如二路所说的那样,这个 if 判断语句的需求就是类似于如下这样的:
    if(id==1)
    ...
    if(id==2)
    ...

    if(id==100)
    需要判断的数字远远多于 100,不知是否有批量生成这种循环语句的代码?再次谢谢大佬!
    suifengingo
        7
    suifengingo  
    OP
       2020-02-07 12:10:46 +08:00
    @ClericPy 首先谢谢大佬的热心解答,
    正如二楼所说的那样,这个 if 判断语句的需求就是类似于如下这样的:
    if(id==1)
    ...
    if(id==2)
    ...

    if(id==100)
    需要判断的数字远远多于 100,不知是否有批量生成这种循环语句的代码?再次谢谢大佬!
    suifengingo
        8
    suifengingo  
    OP
       2020-02-07 12:11:30 +08:00
    @ipwx 首先谢谢大佬的热心解答,
    这个 if 判断语句的需求就是类似于如下这样的:
    if(id==1)
    ...
    if(id==2)
    ...

    if(id==100)
    suifengingo
        9
    suifengingo  
    OP
       2020-02-07 12:14:41 +08:00
    @cassyfar 可是它每次判断时候比较的数字是依次递增 1 的呀,复制粘贴的话还要再一次一次地人工去修改每个判断语句的数字,还是很麻烦
    freed
        10
    freed  
       2020-02-07 12:18:05 +08:00
    循环...
    reself
        11
    reself  
       2020-02-07 12:20:04 +08:00 via Android
    醉了。。。表驱动了解一下
    keepeye
        12
    keepeye  
       2020-02-07 12:30:43 +08:00
    每个 if 块里的逻辑不一样?
    lairdnote
        13
    lairdnote  
       2020-02-07 12:30:51 +08:00
    map 难道不行?
    hakono
        14
    hakono  
       2020-02-07 12:33:22 +08:00   ❤️ 2
    你这,每个 id 不同的话,执行的代码逻辑都完全彻底不相同吗? 一般这种递增的判断逻辑,每个代码块要做的事情都是有共通部分的,要做的事情就是把那一块代码逻辑写成不同 id 都通用的代码就行了。如果代码逻辑是通用的还要一个个 if。。。。。。。。


    如果 id 不同执行的操作完全不同的话,我不能理解的是楼主说的这句话的意思
    “而且出错的话不好回过头来检查是哪里出错”
    请说清楚是“什么”出错。是手贱代码写错把 id==100 写成 id == 1000 这种错误
    还是代码执行逻辑中的错误

    前者和你加多少个 if 的写法无关,也没法解决
    后者你只需要做好打 log 和异常处理就解决了
    无论是哪种问题都不出在这 if 的写法


    对了,如果操作逻辑每个都不同的话,还有个方法倒是能提升点效率和易读性(几百个 elif 的代码执行下来的效率。。。)

    建立个字典,id 做 key,要执行的逻辑的函数做 value

    function func1(){
    pass
    }
    function func2(){
    pass
    }
    id_func_map = {
    1: func1,
    2: func2
    }

    要执行了,直接从 map 里使用 id_func_map.get(id,None) 取出来对应的函数调用执行,如果取出来的是 None,证明没有这个操作逻辑,抛错误
    ispinfx
        15
    ispinfx  
       2020-02-07 12:34:43 +08:00 via iPhone   ❤️ 1
    x y problem
    andylsr
        16
    andylsr  
       2020-02-07 12:36:22 +08:00   ❤️ 4
    你都会 py 了,干嘛不写另一个 py 来生成这段代码呢
    sunjiayao
        17
    sunjiayao  
       2020-02-07 12:41:07 +08:00   ❤️ 1
    很好奇是什么业务逻辑
    nuistzhou
        18
    nuistzhou  
       2020-02-07 12:41:16 +08:00
    楼上说的表驱动没错
    crella
        19
    crella  
       2020-02-07 12:43:03 +08:00 via Android   ❤️ 1
    excel 自动填充,虽然功能简陋,但是搭配 note Xpad2 的正则表达式 没什么做不到的
    suifengingo
        20
    suifengingo  
    OP
       2020-02-07 12:43:23 +08:00
    @hakono 谢谢您,这个每一块 if 语句代码的逻辑都是相同的,正如您所说的,是每个不同 id 都通用的代码,只是不知如何用计算机代替人工去批量生成 id 从 1 到上千数字的这些逻辑相同的 if 代码块,虚心向您请教
    ma6254
        21
    ma6254  
       2020-02-07 12:54:55 +08:00 via Android
    你还是没有说明白原需求
    14 楼说的没错,表驱动是正解
    这样不复杂的业务逻辑没必要上 AST 生成
    suifengingo
        22
    suifengingo  
    OP
       2020-02-07 12:55:29 +08:00
    @andylsr 的确是这么想的,可是能力不足,不知道如何用 python 来批量写出这种自增的 if 循环语句,所以虚心向大佬请教
    suifengingo
        23
    suifengingo  
    OP
       2020-02-07 12:59:53 +08:00
    要实现的 if 判断语句的需求是如下这样的:
    if(id==1)
    n + 1;
    if(id==2)
    n+2;
    ...
    if(id==1000)
    n+1000
    想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句
    Sylv
        24
    Sylv  
       2020-02-07 13:00:13 +08:00 via iPhone
    while/for 循环学习一下
    suifengingo
        25
    suifengingo  
    OP
       2020-02-07 13:00:26 +08:00
    @ma6254 谢谢您,想要实现的 if 判断语句的需求是如下这样的:
    if(id==1)
    n + 1;
    if(id==2)
    n+2;
    ...
    if(id==1000)
    n+1000
    想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句
    ho121
        26
    ho121  
       2020-02-07 13:02:34 +08:00 via Android   ❤️ 1
    @suifengingo
    n+id 不就好了?
    allenloong
        27
    allenloong  
       2020-02-07 13:04:54 +08:00
    “批量生成这种语句的代码”,"数字都是依次递增 1 的"-把这些数字提前存起来
    “每一块 if 语句代码的逻辑都是相同的”-拿到一个数字然后看看这个数字在不在
    TangMonk
        28
    TangMonk  
       2020-02-07 13:06:06 +08:00
    这个时候就需要 Ruby 的元编程了
    wysnylc
        29
    wysnylc  
       2020-02-07 13:06:17 +08:00 via Android
    1,双重循环
    2,map 循环
    jmc891205
        30
    jmc891205  
       2020-02-07 13:18:08 +08:00
    for id in range(1, 1001)
    ....n = n + id
    ayase252
        31
    ayase252  
       2020-02-07 13:26:02 +08:00 via iPhone   ❤️ 1
    我很好奇的是为什么有这种逻辑,难道针对 1000 种 case 有 1000 种完全不同的处理方法?
    webshe11
        32
    webshe11  
       2020-02-07 13:29:51 +08:00
    楼主还是没有说清原始需求,只说了自己想出来的解决方法。根据“这个每一块 if 语句代码的逻辑都是相同的”猜测用 for 循环就可以了
    Juszoe
        33
    Juszoe  
       2020-02-07 13:31:06 +08:00 via Android
    if id >= 1 and id <= 1000:
    n + id

    一样的逻辑为什么要那么多 if
    binux
        34
    binux  
       2020-02-07 13:32:46 +08:00
    if id in [1, 2, 3, 4]
    henryhu
        35
    henryhu  
       2020-02-07 13:33:44 +08:00
    如果有 1000 个 case,每个 case 的处理都不一样,那么,写 case 里的处理所花的时间远远大于写 copy/paste and edit case 条件的时间,为啥会在意这一点点时间?

    如果 case 处理都是类似的话,我相信有更好的处理方式,而不是简单重复代码。
    jiezhi
        36
    jiezhi  
       2020-02-07 13:35:24 +08:00
    vim 宏
    hxse
        37
    hxse  
       2020-02-07 14:16:02 +08:00
    为啥不直接 n+id
    ClericPy
        38
    ClericPy  
       2020-02-07 14:49:24 +08:00
    我如果没有理解错的话, 这个的需求是... 生成代码, 而不是拿到代码的执行结果...

    https://paste.ubuntu.com/p/TVWrjgYfpq/ 虽然感觉这样生成代码挺没有意义的

    PS: 题外话, 如果拿结果, 一个函数甚至是 lambda 函数就够了, operate = lambda id, n: id+n. 上面表驱动什么的说的都不像是讲生成代码的...
    fool079
        39
    fool079  
       2020-02-07 15:14:00 +08:00 via iPhone
    看了 lz 的需求,表驱动完全可以满足,建议学习一下
    Baymaxbowen
        40
    Baymaxbowen  
       2020-02-07 15:18:18 +08:00 via iPhone
    最蠢的办法不就是自动生成代码吗
    xbtlin
        41
    xbtlin  
       2020-02-07 15:26:21 +08:00
    楼主是认真的吗?
    循环 or 表驱动(查表)
    无论用什么编程语言,写成这样还不优化,都不适合当程序员。
    reself
        42
    reself  
       2020-02-07 16:32:08 +08:00 via Android   ❤️ 2
    楼主不说清楚问题背景的话,又会是一个 X-Y Problem
    suifengingo
        43
    suifengingo  
    OP
       2020-02-07 16:45:06 +08:00
    上面的只是打个比方,想要实现语句比这个要复杂的多,每个 if 判断块里面还有代码,
    简化后的 if 判断语句的需求:

    if(id==1)
    *%*%¥#
    cv2.imwrite("./dir/001/" + k, img)

    if(id==2)
    *%*%¥#
    cv2.imwrite("./dir/002/" + k, img)
    ...

    if(id==10)
    *%*%¥#
    cv2.imwrite("./dir/010/" + k, img)

    想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句
    suifengingo
        44
    suifengingo  
    OP
       2020-02-07 16:47:48 +08:00
    @ClericPy 谢谢您!上面我所写的那些只是打个比方,真正想要实现语句比这个要复杂的多,每个 if 判断块里面还有代码,简化后的 if 判断语句的需求:

    if(id==1)
    *%*%¥#
    cv2.imwrite("./dir/001/" + k, img)

    if(id==2)
    *%*%¥#
    cv2.imwrite("./dir/002/" + k, img)
    ...

    if(id==10)
    *%*%¥#
    cv2.imwrite("./dir/010/" + k, img)

    想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句

    想再次向您请教
    suifengingo
        45
    suifengingo  
    OP
       2020-02-07 16:49:01 +08:00
    @reself 谢谢大佬,不好意思,上面说的只是打个比方,想要实现语句比这个要复杂的多,每个 if 判断块里面还有代码,
    简化后的 if 判断语句的需求:

    if(id==1)
    *%*%¥#
    cv2.imwrite("./dir/001/" + k, img)

    if(id==2)
    *%*%¥#
    cv2.imwrite("./dir/002/" + k, img)
    ...

    if(id==10)
    *%*%¥#
    cv2.imwrite("./dir/010/" + k, img)

    想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句
    suifengingo
        46
    suifengingo  
    OP
       2020-02-07 16:52:23 +08:00
    @webshe11 谢谢大佬,不好意思,上面说的只是打个比方,想要实现语句比这个要复杂的多,每个 if 判断块里面还有代码,简化后的 if 判断语句的需求:

    if(id==1)
    *%*%¥#
    cv2.imwrite("./dir/001/" + k, img)

    if(id==2)
    *%*%¥#
    cv2.imwrite("./dir/002/" + k, img)
    ...

    if(id==10)
    *%*%¥#
    cv2.imwrite("./dir/010/" + k, img)

    想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句
    由于 if 判断块内部还有其余要随着 id 的变化而变化的代码,所以不知该如何用循环来批量生成,还望多多指点
    tairan2006
        47
    tairan2006  
       2020-02-07 16:55:42 +08:00
    你这个不是直接应该用 str(id).rjust(3, '0')直接生成 dir 么,如果只有这个的话
    SingeeKing
        48
    SingeeKing  
       2020-02-07 17:11:12 +08:00 via iPhone
    难道不是

    *%*%¥#
    cv2.imwrite("./dir/%03d/" % id+ k, img)
    wutiantong
        49
    wutiantong  
       2020-02-07 17:17:00 +08:00
    现在写 python 的同学连函数都不用知道了么?
    suifengingo
        50
    suifengingo  
    OP
       2020-02-07 17:45:31 +08:00
    谢谢各位大佬,这个代码刚刚已经成功实现了
    cominghome
        51
    cominghome  
       2020-02-07 18:10:06 +08:00   ❤️ 1
    直接说原始需求吧,你这嵌套 100 个 if 八成是需求有问题
    ClericPy
        52
    ClericPy  
       2020-02-07 18:25:49 +08:00   ❤️ 1
    原来问的是模版字符串.....
    关键词前面加 Python 一搜几百万条结果
    f-string
    template
    format string
    %s
    crella
        53
    crella  
       2020-02-07 19:16:13 +08:00 via Android
    text = ''
    (1 .. 1000).each do |_x|
    text << "
    if (id== #{_x})
    #{_x}+ 1
    end
    "
    end

    eval(text)
    Dvel
        54
    Dvel  
       2020-02-07 19:42:46 +08:00
    @suifengingo #43
    @suifengingo #44
    @suifengingo #45
    @suifengingo #46
    V2EX 支持在一次回复中艾特多个人。
    ipwx
        55
    ipwx  
       2020-02-07 19:44:59 +08:00
    “if 判断块内部还有其余要随着 id 的变化而变化的代码”?你能不能一次性说完?
    - - - -

    直接点说,很少很少很少需要生成一堆代码。你思路一开始就是错的。

    bonus:要产生 00x,只要:'{:03d}'.format(id) 就行。
    miao
        56
    miao  
       2020-02-07 19:48:34 +08:00 via Android
    php 程序员表示我竟然每一条回复都看完了。
    ExplorerLog
        57
    ExplorerLog  
       2020-02-07 20:09:20 +08:00
    要学会抽象
    zhanghb
        58
    zhanghb  
       2020-02-07 20:16:02 +08:00   ❤️ 2
    看了下来,我还是想贴一下这个( XY problem ):
    https://coolshell.cn/articles/10804.html
    https://en.wikipedia.org/wiki/XY_problem
    ma6254
        59
    ma6254  
       2020-02-07 20:54:15 +08:00
    学会与人沟通,学会提一个好问题真的非常重要,节约你和大家的时间
    zhujinhe
        60
    zhujinhe  
       2020-02-07 22:30:54 +08:00
    既然你这个 id 和目录一直, 为啥不省略 if 呢? 直接
    ```
    cv2.imwrite("./dir/{:03d}/".format(id) + k, img)

    ```
    icbmicbm
        61
    icbmicbm  
       2020-02-07 23:00:07 +08:00 via iPhone
    再写个脚本咯
    UnknownR
        62
    UnknownR  
       2020-02-07 23:01:16 +08:00
    看你的需求是 foldername 根据 id 的变化来变化,那用循环不好吗
    ```
    $array = [1..100]
    for($i=0, $i -lt $array.count; $i++){
    $id = $array[$i].ToString()
    do something
    $CustomNum = ([string[]]"0" * (3 - $id.length)) + $id
    cv2.imwrite("./dir/$CustomNum" + k, img)
    }
    ```
    reus
        63
    reus  
       2020-02-07 23:08:42 +08:00 via Android   ❤️ 4
    说了半天,都不会说出“原始问题”,浪费众人时间的垃圾帖子。
    Elliota
        64
    Elliota  
       2020-02-07 23:49:08 +08:00
    使用代码片段,然后在结合按键精灵吧
    secondwtq
        65
    secondwtq  
       2020-02-07 23:54:47 +08:00
    terence4444
        66
    terence4444  
       2020-02-07 23:55:55 +08:00 via iPhone   ❤️ 2
    一看到要生成 if 代码就知道方向 90% 错了。
    wangyzj
        67
    wangyzj  
       2020-02-08 00:38:01 +08:00
    看原始需求把
    你这个要是每个判断都逻辑不一样
    那也只能自己生成
    但真没见过这样的逻辑
    muzuiget
        68
    muzuiget  
       2020-02-08 03:25:10 +08:00
    问个原始需求这么遮遮掩掩。
    MiracleKagari
        69
    MiracleKagari  
       2020-02-08 08:32:28 +08:00 via Android
    不知道 Python 有没有 map,key 是 case,value 是 function
    Qzier
        70
    Qzier  
       2020-02-08 09:39:24 +08:00 via iPhone
    看的人一头雾水
    mmixxia
        71
    mmixxia  
       2020-02-08 11:44:36 +08:00
    这,挺简单的,不需要复杂的机制吧。48 楼的思路就可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2698 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:00 · PVG 12:00 · LAX 20:00 · JFK 23:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.