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

本人在使用 python 语言进行 if 循环的代码编写中,需要多次写入 if 判断语句,而且每次的判断数字都是依次递增 1 的,人工手写起来太耗时了,而且出错的话不好回过头来检查是哪里出错,所以想向大神请教下,不知是否有批量生成这种语句的代码?在这里小生先谢谢了!真心希望能得到大神的回答
1 ipwx Feb 7, 2020 啥意思,没看懂。能不能把原始需求说一下 |
2 jugelizi Feb 7, 2020 难道 if(id==1) ... if(id==2) ... if(id==100) 这样的? |
3 ClericPy Feb 7, 2020 同一楼, 别拿自己判断的做法来求思路, 直接提原始需求可以避免走弯路 |
4 cassyfar Feb 7, 2020 ctrl c ctrl v? |
5 reus Feb 7, 2020 via Android 说出你原本要解决的问题 |
6 suifengingo OP 首先谢谢各位大佬的热心解答, 正如二路所说的那样,这个 if 判断语句的需求就是类似于如下这样的: if(id==1) ... if(id==2) ... if(id==100) 需要判断的数字远远多于 100,不知是否有批量生成这种循环语句的代码?再次谢谢大佬! |
7 suifengingo OP @ClericPy 首先谢谢大佬的热心解答, 正如二楼所说的那样,这个 if 判断语句的需求就是类似于如下这样的: if(id==1) ... if(id==2) ... if(id==100) 需要判断的数字远远多于 100,不知是否有批量生成这种循环语句的代码?再次谢谢大佬! |
8 suifengingo OP |
9 suifengingo OP @cassyfar 可是它每次判断时候比较的数字是依次递增 1 的呀,复制粘贴的话还要再一次一次地人工去修改每个判断语句的数字,还是很麻烦 |
10 freed Feb 7, 2020 循环... |
11 reself Feb 7, 2020 via Android 醉了。。。表驱动了解一下 |
12 keepeye Feb 7, 2020 每个 if 块里的逻辑不一样? |
13 lairdnote Feb 7, 2020 map 难道不行? |
14 hakono Feb 7, 2020 你这,每个 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,证明没有这个操作逻辑,抛错误 |
15 ispinfx Feb 7, 2020 via iPhone x y problem |
16 andylsr Feb 7, 2020 你都会 py 了,干嘛不写另一个 py 来生成这段代码呢 |
17 luman Feb 7, 2020 很好奇是什么业务逻辑 |
18 flgn88 Feb 7, 2020 楼上说的表驱动没错 |
19 crella Feb 7, 2020 via Android excel 自动填充,虽然功能简陋,但是搭配 note Xpad2 的正则表达式 没什么做不到的 |
20 suifengingo OP @hakono 谢谢您,这个每一块 if 语句代码的逻辑都是相同的,正如您所说的,是每个不同 id 都通用的代码,只是不知如何用计算机代替人工去批量生成 id 从 1 到上千数字的这些逻辑相同的 if 代码块,虚心向您请教 |
21 ma6254 Feb 7, 2020 via Android 你还是没有说明白原需求 14 楼说的没错,表驱动是正解 这样不复杂的业务逻辑没必要上 AST 生成 |
22 suifengingo OP @andylsr 的确是这么想的,可是能力不足,不知道如何用 python 来批量写出这种自增的 if 循环语句,所以虚心向大佬请教 |
23 suifengingo OP 要实现的 if 判断语句的需求是如下这样的: if(id==1) n + 1; if(id==2) n+2; ... if(id==100) n+1000 想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句 |
24 Sylv Feb 7, 2020 via iPhone while/for 循环学习一下 |
25 suifengingo OP @ma6254 谢谢您,想要实现的 if 判断语句的需求是如下这样的: if(id==1) n + 1; if(id==2) n+2; ... if(id==1000) n+1000 想要通过计算机来批量生成这些 id 依次增加 1 的 if 判断语句 |
26 ho121 Feb 7, 2020 via Android @suifengingo n+id 不就好了? |
27 allenloong Feb 7, 2020 “批量生成这种语句的代码”,"数字都是依次递增 1 的"-把这些数字提前存起来 “每一块 if 语句代码的逻辑都是相同的”-拿到一个数字然后看看这个数字在不在 |
28 TangMonk Feb 7, 2020 这个时候就需要 Ruby 的元编程了 |
29 wysnylc Feb 7, 2020 via Android 1,双重循环 2,map 循环 |
30 jmc891205 Feb 7, 2020 for id in range(1, 1001) ....n = n + id |
31 ayase252 Feb 7, 2020 via iPhone 我很好奇的是为什么有这种逻辑,难道针对 1000 种 case 有 1000 种完全不同的处理方法? |
32 webshe11 Feb 7, 2020 楼主还是没有说清原始需求,只说了自己想出来的解决方法。根据“这个每一块 if 语句代码的逻辑都是相同的”猜测用 for 循环就可以了 |
33 Juszoe Feb 7, 2020 via Android if id >= 1 and id <= 1000: n + id 一样的逻辑为什么要那么多 if |
34 binux Feb 7, 2020 if id in [1, 2, 3, 4] |
35 henryhu Feb 7, 2020 如果有 1000 个 case,每个 case 的处理都不一样,那么,写 case 里的处理所花的时间远远大于写 copy/paste and edit case 条件的时间,为啥会在意这一点点时间? 如果 case 处理都是类似的话,我相信有更好的处理方式,而不是简单重复代码。 |
36 jiezhi Feb 7, 2020 vim 宏 |
37 hxse Feb 7, 2020 为啥不直接 n+id |
38 ClericPy Feb 7, 2020 我如果没有理解错的话, 这个的需求是... 生成代码, 而不是拿到代码的执行结果... https://paste.ubuntu.com/p/TVWrjgYfpq/ 虽然感觉这样生成代码挺没有意义的 PS: 题外话, 如果拿结果, 一个函数甚至是 lambda 函数就够了, operate = lambda id, n: id+n. 上面表驱动什么的说的都不像是讲生成代码的... |
39 fool079 Feb 7, 2020 via iPhone 看了 lz 的需求,表驱动完全可以满足,建议学习一下 |
40 Baymaxbowen Feb 7, 2020 via iPhone 最蠢的办法不就是自动生成代码吗 |
41 xbtlin Feb 7, 2020 楼主是认真的吗? 循环 or 表驱动(查表) 无论用什么编程语言,写成这样还不优化,都不适合当程序员。 |
42 reself Feb 7, 2020 via Android 楼主不说清楚问题背景的话,又会是一个 X-Y Problem |
43 suifengingo OP 上面的只是打个比方,想要实现语句比这个要复杂的多,每个 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 判断语句 |
44 suifengingo OP @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 判断语句 想再次向您请教 |
45 suifengingo OP @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 判断语句 |
46 suifengingo OP @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 的变化而变化的代码,所以不知该如何用循环来批量生成,还望多多指点 |
47 tairan2006 Feb 7, 2020 你这个不是直接应该用 str(id).rjust(3, '0')直接生成 dir 么,如果只有这个的话 |
48 SingeeKing PRO 难道不是 *%*%¥# cv2.imwrite("./dir/%03d/" % id+ k, img) |
49 wutiantong Feb 7, 2020 现在写 python 的同学连函数都不用知道了么? |
50 suifengingo OP 谢谢各位大佬,这个代码刚刚已经成功实现了 |
51 cominghome Feb 7, 2020 直接说原始需求吧,你这嵌套 100 个 if 八成是需求有问题 |
52 ClericPy Feb 7, 2020 原来问的是模版字符串..... 关键词前面加 Python 一搜几百万条结果 f-string template format string %s |
53 crella Feb 7, 2020 via Android text = '' (1 .. 1000).each do |_x| text << " if (id== #{_x}) #{_x}+ 1 end " end eval(text) |
54 Dvel Feb 7, 2020 |
55 ipwx Feb 7, 2020 “if 判断块内部还有其余要随着 id 的变化而变化的代码”?你能不能一次性说完? - - - - 直接点说,很少很少很少需要生成一堆代码。你思路一开始就是错的。 bonus:要产生 00x,只要:'{:03d}'.format(id) 就行。 |
56 miao Feb 7, 2020 via Android php 程序员表示我竟然每一条回复都看完了。 |
57 ExplorerLog Feb 7, 2020 要学会抽象 |
58 zhanghb Feb 7, 2020 看了下来,我还是想贴一下这个( XY problem ): https://coolshell.cn/articles/10804.html https://en.wikipedia.org/wiki/XY_problem |
59 ma6254 Feb 7, 2020 |
60 zhujinhe Feb 7, 2020 既然你这个 id 和目录一直, 为啥不省略 if 呢? 直接 ``` cv2.imwrite("./dir/{:03d}/".format(id) + k, img) ``` |
61 icbmicbm Feb 7, 2020 via iPhone 再写个脚本咯 |
62 UnknownR Feb 7, 2020 看你的需求是 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) } ``` |
63 reus Feb 7, 2020 via Android 说了半天,都不会说出“原始问题”,浪费众人时间的垃圾帖子。 |
64 Elliota Feb 7, 2020 使用代码片段,然后在结合按键精灵吧 |
65 secondwtq Feb 7, 2020 |
66 terence4444 Feb 7, 2020 via iPhone 一看到要生成 if 代码就知道方向 90% 错了。 |
67 wangyzj Feb 8, 2020 看原始需求把 你这个要是每个判断都逻辑不一样 那也只能自己生成 但真没见过这样的逻辑 |
68 muzuiget Feb 8, 2020 问个原始需求这么遮遮掩掩。 |
69 MiracleKagari Feb 8, 2020 via Android 不知道 Python 有没有 map,key 是 case,value 是 function |
70 Qzier Feb 8, 2020 via iPhone 看的人一头雾水 |
71 1nakaELYBbsXbZxY Feb 8, 2020 这,挺简单的,不需要复杂的机制吧。48 楼的思路就可以了 |