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