本人在使用 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
同一楼, 别拿自己判断的做法来求思路, 直接提原始需求可以避免走弯路
|
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 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,证明没有这个操作逻辑,抛错误 |
15
ispinfx 2020-02-07 12:34:43 +08:00 via iPhone 1
x y problem
|
16
andylsr 2020-02-07 12:36:22 +08:00 4
你都会 py 了,干嘛不写另一个 py 来生成这段代码呢
|
17
sunjiayao 2020-02-07 12:41:07 +08:00 1
很好奇是什么业务逻辑
|
18
nuistzhou 2020-02-07 12:41:16 +08:00
楼上说的表驱动没错
|
19
crella 2020-02-07 12:43:03 +08:00 via Android 1
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 1
@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 1
我很好奇的是为什么有这种逻辑,难道针对 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 2
楼主不说清楚问题背景的话,又会是一个 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 2020-02-07 17:11:12 +08:00 via iPhone
难道不是
*%*%¥# 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 1
直接说原始需求吧,你这嵌套 100 个 if 八成是需求有问题
|
52
ClericPy 2020-02-07 18:25:49 +08:00 1
原来问的是模版字符串.....
关键词前面加 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 2
看了下来,我还是想贴一下这个( 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 4
说了半天,都不会说出“原始问题”,浪费众人时间的垃圾帖子。
|
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 2
一看到要生成 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
mmixxia 2020-02-08 11:44:36 +08:00
这,挺简单的,不需要复杂的机制吧。48 楼的思路就可以了
|