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

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

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

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

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

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

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

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

    if(id==100)
    suifengingo
        9
    suifengingo   297 天前
    @cassyfar 可是它每次判断时候比较的数字是依次递增 1 的呀,复制粘贴的话还要再一次一次地人工去修改每个判断语句的数字,还是很麻烦
    freed
        10
    freed   297 天前
    循环...
    reself
        11
    reself   297 天前 via Android
    醉了。。。表驱动了解一下
    keepeye
        12
    keepeye   297 天前
    每个 if 块里的逻辑不一样?
    lairdnote
        13
    lairdnote   297 天前
    map 难道不行?
    hakono
        14
    hakono   297 天前   ❤️ 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   297 天前 via iPhone   ❤️ 1
    x y problem
    andylsr
        16
    andylsr   297 天前   ❤️ 4
    你都会 py 了,干嘛不写另一个 py 来生成这段代码呢
    sunjiayao
        17
    sunjiayao   297 天前   ❤️ 1
    很好奇是什么业务逻辑
    nuistzhou
        18
    nuistzhou   297 天前
    楼上说的表驱动没错
    crella
        19
    crella   297 天前 via Android   ❤️ 1
    excel 自动填充,虽然功能简陋,但是搭配 note Xpad2 的正则表达式 没什么做不到的
    suifengingo
        20
    suifengingo   297 天前
    @hakono 谢谢您,这个每一块 if 语句代码的逻辑都是相同的,正如您所说的,是每个不同 id 都通用的代码,只是不知如何用计算机代替人工去批量生成 id 从 1 到上千数字的这些逻辑相同的 if 代码块,虚心向您请教
    ma6254
        21
    ma6254   297 天前 via Android
    你还是没有说明白原需求
    14 楼说的没错,表驱动是正解
    这样不复杂的业务逻辑没必要上 AST 生成
    suifengingo
        22
    suifengingo   297 天前
    @andylsr 的确是这么想的,可是能力不足,不知道如何用 python 来批量写出这种自增的 if 循环语句,所以虚心向大佬请教
    suifengingo
        23
    suifengingo   297 天前
    要实现的 if 判断语句的需求是如下这样的:
    if(id==1)
    n + 1;
    if(id==2)
    n+2;
    ...
    if(id==1000)
    n+1000
    想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句
    Sylv
        24
    Sylv   297 天前 via iPhone
    while/for 循环学习一下
    suifengingo
        25
    suifengingo   297 天前
    @ma6254 谢谢您,想要实现的 if 判断语句的需求是如下这样的:
    if(id==1)
    n + 1;
    if(id==2)
    n+2;
    ...
    if(id==1000)
    n+1000
    想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句
    ho121
        26
    ho121   297 天前 via Android   ❤️ 1
    @suifengingo
    n+id 不就好了?
    allenloong
        27
    allenloong   297 天前
    “批量生成这种语句的代码”,"数字都是依次递增 1 的"-把这些数字提前存起来
    “每一块 if 语句代码的逻辑都是相同的”-拿到一个数字然后看看这个数字在不在
    TangMonk
        28
    TangMonk   297 天前
    这个时候就需要 Ruby 的元编程了
    wysnylc
        29
    wysnylc   297 天前 via Android
    1,双重循环
    2,map 循环
    jmc891205
        30
    jmc891205   297 天前
    for id in range(1, 1001)
    ....n = n + id
    ayase252
        31
    ayase252   297 天前 via iPhone   ❤️ 1
    我很好奇的是为什么有这种逻辑,难道针对 1000 种 case 有 1000 种完全不同的处理方法?
    webshe11
        32
    webshe11   297 天前
    楼主还是没有说清原始需求,只说了自己想出来的解决方法。根据“这个每一块 if 语句代码的逻辑都是相同的”猜测用 for 循环就可以了
    Juszoe
        33
    Juszoe   297 天前 via Android
    if id >= 1 and id <= 1000:
    n + id

    一样的逻辑为什么要那么多 if
    binux
        34
    binux   297 天前
    if id in [1, 2, 3, 4]
    henryhu
        35
    henryhu   297 天前
    如果有 1000 个 case,每个 case 的处理都不一样,那么,写 case 里的处理所花的时间远远大于写 copy/paste and edit case 条件的时间,为啥会在意这一点点时间?

    如果 case 处理都是类似的话,我相信有更好的处理方式,而不是简单重复代码。
    jiezhi
        36
    jiezhi   297 天前
    vim 宏
    hxse
        37
    hxse   297 天前
    为啥不直接 n+id
    ClericPy
        38
    ClericPy   297 天前
    我如果没有理解错的话, 这个的需求是... 生成代码, 而不是拿到代码的执行结果...

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

    PS: 题外话, 如果拿结果, 一个函数甚至是 lambda 函数就够了, operate = lambda id, n: id+n. 上面表驱动什么的说的都不像是讲生成代码的...
    fool079
        39
    fool079   297 天前 via iPhone
    看了 lz 的需求,表驱动完全可以满足,建议学习一下
    Baymaxbowen
        40
    Baymaxbowen   297 天前 via iPhone
    最蠢的办法不就是自动生成代码吗
    xbtlin
        41
    xbtlin   297 天前
    楼主是认真的吗?
    循环 or 表驱动(查表)
    无论用什么编程语言,写成这样还不优化,都不适合当程序员。
    reself
        42
    reself   297 天前 via Android   ❤️ 2
    楼主不说清楚问题背景的话,又会是一个 X-Y Problem
    suifengingo
        43
    suifengingo   297 天前
    上面的只是打个比方,想要实现语句比这个要复杂的多,每个 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   297 天前
    @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   297 天前
    @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   297 天前
    @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   297 天前
    你这个不是直接应该用 str(id).rjust(3, '0')直接生成 dir 么,如果只有这个的话
    SingeeKing
        48
    SingeeKing   297 天前 via iPhone
    难道不是

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

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

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

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

    ```
    icbmicbm
        61
    icbmicbm   296 天前 via iPhone
    再写个脚本咯
    UnknownR
        62
    UnknownR   296 天前
    看你的需求是 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   296 天前 via Android   ❤️ 4
    说了半天,都不会说出“原始问题”,浪费众人时间的垃圾帖子。
    Elliota
        64
    Elliota   296 天前
    使用代码片段,然后在结合按键精灵吧
    terence4444
        66
    terence4444   296 天前 via iPhone   ❤️ 2
    一看到要生成 if 代码就知道方向 90% 错了。
    wangyzj
        67
    wangyzj   296 天前
    看原始需求把
    你这个要是每个判断都逻辑不一样
    那也只能自己生成
    但真没见过这样的逻辑
    muzuiget
        68
    muzuiget   296 天前
    问个原始需求这么遮遮掩掩。
    MiracleKagari
        69
    MiracleKagari   296 天前 via Android
    不知道 Python 有没有 map,key 是 case,value 是 function
    Qzier
        70
    Qzier   296 天前 via iPhone
    看的人一头雾水
    mmixxia
        71
    mmixxia   296 天前
    这,挺简单的,不需要复杂的机制吧。48 楼的思路就可以了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3437 人在线   最高记录 5268   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 11:33 · PVG 19:33 · LAX 03:33 · JFK 06:33
    ♥ Do have faith in what you're doing.