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

评论

此博客中的热门博文

拜厄练习曲44, 45

拜厄练习曲38, 39