Python Credit Card Validation
Ich bin ein Anfänger-Python-Anfänger, und ich bin derzeit auf Luhn-Algorithmus zum prüfen der credit card validation. Ich schrieb die meisten der code, aber ich bin stecken mit 2 Fehler, die ich bekommen 1. ist num verwiesen wird vor der Zuweisung. 2. ich bin immer object ist vom Typ '_io.TextIOWrapper' has no len(). Weitere Hilfe/Beratung wird sehr geschätzt.
Diese Schritte sind für Luhn-Algorithmus (Mod10 Check)
- Doppel-jedes zweite Ziffer von rechts nach Links. Wenn diese "Verdoppelung" Ergebnisse in eine zwei-stellige Zahl, fügen Sie die zwei-stellige
Zahl um eine einzelne Ziffer. - Nun fügen Sie alle einstelligen zahlen von Schritt 1.
- Fügen Sie alle Ziffern in den ungeraden Plätze von rechts nach Links in die Nummer der Kreditkarte.
- Summe der Ergebnisse aus den Schritten 2 & 3.
- Wenn das Ergebnis von Schritt 4 ist durch 10 teilbar, wird die Kartennummer gültig ist; andernfalls ist er ungültig.
Hier ist, was meine Ausgabe soll
Card Number Valid / Invalid
--------------------------------------
3710293 Invalid
5190990281925290 Invalid
3716820019271998 Valid
37168200192719989 Invalid
8102966371298364 Invalid
6823119834248189 Valid
Und hier ist der code.
def checkSecondDigits(num):
length = len(num)
sum = 0
for i in range(length-2,-1,-2):
number = eval(num[i])
number = number * 2
if number > 9:
strNumber = str(number)
number = eval(strNumber[0]) + eval(strNumber[1])
sum += number
return sum
def odd_digits(num):
length = len(num)
sumOdd = 0
for i in range(length-1,-1,-2):
num += eval(num[i])
return sumOdd
def c_length(num):
length = len(num)
if num >= 13 and num <= 16:
if num [0] == "4" or num [0] == "5" or num [0] == "6" or (num [0] == "3" and num [1] == "7"):
return True
else:
return False
def main():
filename = input("What is the name of your input file? ")
infile= open(filename,"r")
cc = (infile.readline().strip())
print(format("Card Number", "20s"), ("Valid /Invalid"))
print("------------------------------------")
while cc!= "EXIT":
even = checkSecondDigits(num)
odd = odd_digits(num)
c_len = c_length(num)
tot = even + odd
if c_len == True and tot % 10 == 0:
print(format(cc, "20s"), format("Valid", "20s"))
else:
print(format(cc, "20s"), format("Invalid", "20s"))
num = (infile.readline().strip())
main()
- Sollten Sie die traceback -, nicht nur die Fehlermeldung
even = checkSecondDigits(num)
... Aktivieren Sie das Kontrollkästchen. Was ist Zahl? Das ist Ihr Erster Fehler- Traceback (most recent call last): Zeile 58, in <module> main () - Zeile 48, die im wesentlichen auch = checkSecondDigits(num) UnboundLocalError: lokale variable 'num' referenced before assignment
- Wenn ich den code bekomme ich diesen Fehler
- überprüfen Sie Ihre
while
, wo ist diesernum
variable kommen? eval(num[i])
<-- Gute Herr, WARUM?!? Miteval
hier ist mit einer Atombombe zu swat Fliegen; es funktioniert, aber es ist eine wirklich schlechte Idee. Sie wissen, sollten die Werte werden integer-Ziffern, verwenden Sie einfachint(num[i])
; es ist schneller, sicherer und nicht aufrufen Cthulhu. In anderen Fällen, z.B.strNumber = str(number)
,number = eval(strNumber[0]) + eval(strNumber[1])
Sie tun können, Mathematik und vermeiden Sie die Konvertierung bei allen, z.B.number -= 9
(für 10-18, die Summe der zahlen ist die gleiche wie einfach nur zu subtrahieren 9) oder weniger geschicktnumber = number // 10 + number % 10
.- Gut, dass die ganze Funktion gegeben wurde, um uns alle von unserem professor, so idk lol
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nur vergessen zu initialisieren num
Dies ist eine sehr vereinfachte version von code ist es, basierend auf lunh ' s Algorithmus
Alten thread, aber die Antwort die mir sorgen... und das eigentliche Problem nicht erkannt.
Tatsächlich, der Fehler ist, dass Sie verwendet haben, die id (num) für die parameter bei der Definition checkSecondDigits als die id/der name des Arguments beim Aufruf der Funktion in der mainline. Die Funktion sollte in main() aufgerufen durch
auch = checkSecondDigits(cc), also der Wert im cc (das ist das argument) übergeben wird in num (als parameter) für die Verwendung innerhalb der Funktion.
Das gleiche rookie Fehler gemacht mit odd_digits und cc_length.
Diese Frage (und die zunächst vorgeschlagene Antwort) zeugt von einem grundsätzlichen mis-Verständnis von übergeben von Argumenten an Parameter...
Die vorgeschlagene 'Deklaration' der num-nur blendet diesen Fehler/Missverständnis und auch verbirgt die lokalen und globalen Gültigkeitsbereiche von num (soll nur lokal sein) und cc (die Globale) während also der Vorschlag funktioniert in diesem Fall, funktioniert es für den falschen Grund und ist schlechter Stil und schlechte Programmierung.
Weiter,
num nicht erscheinen sollte irgendwo in main (), wie es sein sollte lokale (nur erscheinen in der) die Funktionen aufgerufen...
Die Letzte Zeile in diesem code sollte die gleiche wie die erste, aber die Letzte Zeile weist fälschlicherweise die Daten zu num anstelle von cc
können Sie meinen code für card validation es ist 100% dynamisch, weil Sie die card-Struktur gespeichert ist, in der CSV-Datei, so ist es einfach zu aktualisieren, hier ist der code, der auf GitHub Profil, python-Datei link, code-Erläuterung-Datei link und CSV-Format für die Datendatei link
python-code:
Ersten, vielleicht sollten Sie entfernen Sie die zusätzlichen Zeichen:
Nach überprüfen, ob die Kreditkarte gültig ist, mit dem Luhn-Algorithmus: