I’m given some ISBN numbers e.g. 3-528-03851 (not valid) , 3-528-16419-0 (valid). I’m supposed to write a program which tests if the ISBN number is valid.
Here’ my code:
def check(isbn):
check_digit = int(isbn[-1])
match = re.search(r'(\d)-(\d{3})-(\d{5})', isbn[:-1])
if match:
digits = match.group(1) + match.group(2) + match.group(3)
result = 0
for i, digit in enumerate(digits):
result += (i + 1) * int(digit)
return True if (result % 11) == check_digit else False
return False
I’ve used a regular expression to check a) if the format is valid and b) extract the digits in the ISBN string. While it seems to work, being a Python beginner I’m eager to know how I could improve my code. Suggestions?
First, try to avoid code like this:
Flip it around, so the bulk of code isn’t nested. This gives us:
There are some bugs in the code:
So, let’s simplify this. First, remove all spaces and hyphens, and make sure the regex matches the whole line by bracing it in ‘^…$’. That makes sure it rejects strings which are too long.
Next, let’s fix the “X” check digit problem. Match the check digit in the regex as well, so the entire string is validated by the regex, then convert the check digit correctly.
Finally, using a generator expression and
maxis a more idiomatic way of doing the final calculation in Python, and the final conditional can be simplified.