Binnen het ISBN-10 (International Standard Book Numbering) systeem dat tot eind 2006 gebruikt werd, kreeg elk boek een unieke code toegewezen die bestaat uit 10 cijfers. De eerste 9 daarvan geven informatie over het boek zelf, terwijl het laatste louter een controlecijfer is dat dient om foutieve ISBN-10 codes te detecteren.
Als $$x_1, \ldots, x_9$$ de eerste 9 cijfers van een ISBN-10 code voorstellen, dan wordt het controlecijfer $$x_{10}$$ als volgt berekend: \[x_{10} = (x_1+ 2x_2+ 3x_3+ 4x_4+ 5x_5+ 6x_6+ 7x_7+ 8x_8+ 9x_9)\!\!\!\!\mod{11}\,\] Het controlecijfer $$x_{10}$$ kan m.a.w. de waarden 0 tot en met 10 aannemen. Als het controlecijfer gelijk is aan 10, dan wordt dit in de ISBN-10 code genoteerd als de letter X. Op die manier wordt het controlecijfer altijd door één enkel karakter voorgesteld.
Binnen het nieuwe ISBN-13 systeem krijgt elk boek een unieke code bestaande uit 13 cijfers. De eerste 12 daarvan geven informatie over het boek zelf, terwijl het laatste louter een controlecijfer is dat dient om foutieve ISBN-13 codes te detecteren. Als $$x_1, \ldots, x_{12}$$ de eerste 12 cijfers van een ISBN-13 code voorstellen, dan wordt het controlecijfer $$x_{13}$$ als volgt berekend: \[\begin{align} o &= x_1 + x_3 + x_5 + x_7 + x_9 + x_{11} \\ e &= x_2 + x_4 + x_6 + x_8 + x_{10} + x_{12} \\ x_{13} &= (10 - (o + 3e)\!\!\!\!\mod{10})\!\!\!\!\!\mod{10}\end{align}\] Het controlecijfer $$x_{13}$$ kan m.a.w. de waarden 0 tot en met 9 aannemen, waardoor ISBN-13 codes uitsluitend uit cijfers bestaan.
Schrijf een functie isISBN waaraan een string $$c$$ (str) moet doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven, die aangeeft of $$c$$ een geldige ISBN-code is. De functie heeft ook nog een optionele tweede parameter isbn13 waaraan een Booleaanse waarde (bool) kan doorgegeven worden die aangeeft of het om een ISBN-10 code (False) of om een ISBN-13 code (True, standaardwaarde) moet gaan.
Schrijf een functie zijnISBN waaraan een lijst (list) met $$n \in \mathbb{N}$$ codes moet doorgegeven worden. De functie moet voor alle codes uit die lijst aangegeven of ze geldige ISBN-codes voorstellen. De functie heeft ook nog een tweede optionele parameter isbn13 waaraan een Booleaanse waarde (bool) kan doorgegeven worden die aangeeft of het om ISBN-10 codes (False) of om ISBN-13 codes (True) moet gaan.
Als er niet expliciet een waarde wordt doorgegeven aan de parameter isbn13, dan moet het type van elke code uit de lijst bepaald worden op basis van de lengte van die code. Als een code geen string (str) is, dan wordt die a priori als ongeldig bestempeld. Voor codes van lengte 13 moet getest worden of het geldige ISBN-13 codes zijn, en voor codes van lengte 10 of het geldige ISBN-10 codes zijn. Codes met afwijkende lengtes (geen 10 en geen 13) worden ook a priori als ongeldige ISBN-codes bestempeld.
De functie moet een nieuwe lijst (list) met $$n$$ Booleaanse waarden (bool) teruggeven, die aangeven of de code op de corresponderende positie in de gegeven lijst een geldige ISBN-code is.
>>> isISBN('9789027439642', False)
False
>>> isISBN('9789027439642', True)
True
>>> isISBN('9789027439642')
True
>>> isISBN('080442957X')
False
>>> isISBN('080442957X', False)
True
>>> codes = ['0012345678', '0012345679', '9971502100', '080442957X', 5, True, 'The Practice of Computing Using Python', '9789027439642', '5486948320146']
>>> zijnISBN(codes)
[False, True, True, True, False, False, False, True, False]
>>> zijnISBN(codes, True)
[False, False, False, False, False, False, False, True, False]
>>> zijnISBN(codes, False)
[False, True, True, True, False, False, False, False, False]
In onderstaande video legt Pythia uit hoe je deze opgave kunt aanpakken. Bekijk deze video als opstapje naar het oplossen van de oefeningen over geavanceerde functies en modules1.