所以我正在学习用Python编写代码(以前没有学过另一种语言),并且在做第二个练习:http://cscircles.cemc.uwaterloo.ca/15b-python-pushups/
我做了一个代码,但我忍不住觉得一定有一种方法可以用更少的行来完成,下面是我目前的解决方案:
def check(S):
a = S.replace(' ', '')
if len(S) != 19:
return False
try:
int(a)
except ValueError:
return False
lister = []
for i in range (0, len(a)):
lister.append(int(a[i]))
if sum(lister)%10 != 0:
return False
if sum(lister) == 0:
return False
return True
第一名: 有没有更好的方法来检查所有的字符都是数字?我知道.isdigit()方法,但不知道该如何实现它,这样行吗? 对于a.isdigit(): 如果为假: 返回False
第二点: 有没有更好的方法可以使用“or”立即检查条件,例如我的代码的以下部分:
if sum(lister)%10 != 0:
return False
if sum(lister) == 0:
return False
我能把两者结合起来吗?你知道吗
不需要将所需的字符串格式硬编码到数组索引或正则表达式中。您只需获取给定的格式字符串并使用它来解析数字。然后,您可以根据各自的格式分别检查每个字符,并使用这些数字添加到校验和中。你知道吗
举个例子:
供参考:
S
的检查之前,不要创建a
。你知道吗try: int(a)
代码还接受一些它应该拒绝的内容。例如,如果字符串以-
开头,则此检查将通过,但函数稍后在执行int(a[0])
时将抛出异常。在这种情况下,它应该返回False
,而不是抛出异常。你知道吗if sum(lister) == 0: return False
从问题描述来看似乎是错误的,因为没有什么要说0000 0000 0000 0000
应该被拒绝。我假设这不是一个真实的信用卡号码,但这与所说的问题无关;-)在评论中回答您的问题,是的,您可以比创建一个列表更简洁地总结。以下内容称为“生成器理解”,您应该在Python参考中查找:
最后,当您有一个函数以以下结尾时:
考虑一下是否写得更好:
答案并非总是说这样会更好,但肯定更简洁。你知道吗
把所有东西放在一起:
注意,调用
int()
检查字符是否是数字(如果不是,则抛出异常),但它接受非英语数字,如UnicodeU+0660
,“阿拉伯-印度数字零”。问题语句没有说明是否允许这样做,但如果不允许,则需要对此代码进行额外检查。另一方面,Matt的正则表达式专门测试ASCII数字。你知道吗您可以将行更改为:
最后一行将
return True
如果条件是True
或False
如果两者都不是True
您也可以只迭代一个并使用列表comp:
您还可以进一步优化,只需使用generator expression计算一次和:
您的初始检查可以使用all函数和str.isdigit检查所有数字,这样您就可以删除
try/except
:所以你的最终功能是:
使用try/除了使用map:
相关问题 更多 >
编程相关推荐