Exercism: ISBN Verifier (Python)
验证ISBN码,很好的一个实际问题。题目很简单,主要看怎么把代码写的简练。我使用了三步:1)验证长度 2)验证单个数值 3)验证总和%11。提交后果然发现又有更简单的方法。用正侧表达式来做第一步和第二步一起, [^[0-9]{9,9}[0-9X]$]。
原版:
def is_valid(isbn):
isbn_vals = [val for val in isbn if val != "-"]
if len(isbn_vals) != 10:
return False
if isbn_vals[-1] == "X":
isbn_vals[-1] = 10
try:
isbn_vals = [int(val) for val in isbn_vals]
except:
return False
sum_values = sum(val * (10 - i) for i, val in enumerate(isbn_vals))
return sum_values % 11 == 0
优化版:
import re
def is_valid(isbn):
match = re.search("^[0-9]{9,9}[0-9X]$", isbn.replace("-", ""))
if not match:
return False
isbn_vals = [10 if "X" == val else int(val) for val in isbn if val != "-"]
sum_values = sum(val * (10 - i) for i, val in enumerate(isbn_vals))
return sum_values % 11 == 0
评论
发表评论