我正在创建一个超级简单的程序,它从命令行中给出的字符串中删除偶数或奇数。例如:
$ test.py 1 1234
13
$ test.py 2 1234
24
问题是我无法让它发挥作用。它打印用法而不是预期的数字。
$ test.py 1 1234
Usage: test.py [option] [number], etc..
此外,这应该打印出用法,但不做任何事情:
$ python2.7 test.py 1
$
为什么程序没有输出用法? len(sys.argv)
是< 2
所以应该打印用法,对吗?
def oddtarray(num):
tlist = map(int, str(num))
tnum = [x for x in tlist if (x % 2) != 0]
return tnum
def eventarray(num):
tlist = map(int, str(num))
tnum = [x for x in tlist if (x % 2) == 0]
return tnum
def transform():
try:
odd = int(''.join(map(str, eventarray(sys.argv[2]))))
even = int(''.join(map(str, oddtarray(sys.argv[2]))))
if len(sys.argv) == 3:
if sys.argv[1] == 1:
print odd
elif sys.argv[1] == 2:
print even
else:
usage()
else:
usage()
except IndexError:
if len(sys.argv) < 2:
usage()
def usage():
print 'Usage: test.py [option] [number]'
print 'Options: \n[1] - Remove even numbers\n[2] - Remove odd numbers'
transform()
答案 0 :(得分:4)
sys.argv[1] == 1
是不可能的。你的意思是:sys.argv[1] == "1"
。这些是字符串,而不是数字。
你的论证解析需要一些清理。不需要所有这些检查和例外来完成这么简单的任务。
请允许我进行“代码审核”&amp;修复你的代码(我专注于arg解析部分,通过try / except ValueError
打印用法保护整数解析并测试参数的数量):
import sys
def oddtarray(num):
tlist = map(int, str(num))
tnum = [x for x in tlist if (x % 2) != 0]
return tnum
def eventarray(num):
tlist = map(int, str(num))
tnum = [x for x in tlist if (x % 2) == 0]
return tnum
def transform():
if len(sys.argv) < 3:
# not enough arguments: print usage and that's it!
usage()
else:
try:
command = int(sys.argv[1]) # convert to integer
odd = int(''.join(map(str, eventarray(sys.argv[2]))))
even = int(''.join(map(str, oddtarray(sys.argv[2]))))
if command == 1:
print(odd)
elif command == 2:
print(even)
else:
usage()
except ValueError as e:
# some string to integer went wrong: display detailed exception
# just in case, then usage
print(str(e))
usage()
def usage():
print('Usage: test.py [option] [number]')
print('Options: \n[1] - Remove even numbers\n[2] - Remove odd numbers')
transform()
现在它真的“非常简单”,作为奖励,它有效:)
答案 1 :(得分:1)
与OP和目前为止的另一个答案不同,我不知道为什么你会计算奇数和偶数列表,知道你只需要其中一个 - 它的短距离来自&#34;简单&#34;到&#34;效率低下&#34;。我们如何推迟艰苦的工作&#34;在我们完成&#34;轻松工作之前,简化列表!对参数进行解码:
import sys
def oddtarray(digits):
tlist = map(int, digits)
tnum = [x for x in tlist if (x % 2) != 0]
return int(''.join(map(str, tnum)))
def eventarray(digits):
tlist = map(int, digits)
tnum = [x for x in tlist if (x % 2) == 0]
return int(''.join(map(str, tnum)))
def transform():
if len(sys.argv) == 3:
try:
if sys.argv[1] == "1":
print oddtarray(sys.argv[2])
elif sys.argv[1] == "2":
print eventarray(sys.argv[2])
else:
usage()
except ValueError:
usage()
else:
usage()
def usage():
print 'Usage: test.py [option] [number]'
print 'Options: \n[1] - Remove even numbers\n[2] - Remove odd numbers'
transform()
原始计划的具体问题:odd
和even
变量已被撤消;命令行参数被视为数字而不是看起来像数字的字符串;命令行参数列表的长度的有效性正在 项目已经从中提取之后进行测试 - 它应该在之前进行测试;由于程序员错误而不是用户错误,可能会出现IndexError异常 - ValueError异常更可能是由于用户错误(输入非数字)。