@jekyllvshyde: Dein Problem ist, dass der Rückgabewert der Rekursiven Aufrufe nicht verwendet wird.
Der Funktionsname ist superschlecht, der Funktionsname sollte eine Tätigkeit beschreiben, was die Funktion macht, nämlich prüfen, ob in einer verschachtelten Liste nur Zahlen enthalten sind, also are_only_ints_in_list_of_lists.
Variablennamen schreibt man wie Funktionen in Python komplett klein, einbuchstabige Namen sind im allgemeinen schlecht, weil nichtssagen.
Direkte Typ-Prüfung macht man nicht, wenn es wirklich nötig ist, würde man isinstance benutzen.
Die Reihenfolge der if-Abfragen ist schlecht, weil im ersten if etwas geprüft wird, was im zweiten if nochmal gemacht wird.
Über einen Index iteriert man in Python nicht, sondern über die Elemente der Liste direkt. `item` ist auch der verwirrendste Name, den es gibt, für einen Index.
Datentypen haben in einer Variable nichts verloren, das Bool gehört also weg, und das int ist dann nicht wirklich das, was die Variable enthält.
Was soll eigentlich passieren, wenn L keine Liste ist?
Das ganze mal ohne rekursiven Aufruf:
Code: Alles auswählen
def are_only_ints_in_list_of_lists(lists):
to_be_checked = [lists]
while to_be_checked:
for item in to_be_checked.pop():
if isinstance(item, list):
to_be_checked.append(item)
elif not isinstance(item, int):
return False
return True
test_data = [1,3,[4.3,5]]
print(are_only_ints_in_list_of_lists(test_data))
Die explizite Typprüfung macht aber das Duck-Typing kaputt, so dass man andere iterierbare Container nicht verwenden kann, und die Frage ist, ob wirklich nur int oder alle Ganzzahlen erlaubt sein sollen.
Code: Alles auswählen
from numbers import Integral
def are_only_ints_in_list_of_lists(lists):
to_be_checked = [lists]
while to_be_checked:
iterable = to_be_checked.pop()
for item in iterable:
if item is iterable:
return False
elif not isinstance(item, Integral):
try:
iter(item)
except TypeError:
# no iterable
return False
else:
to_be_checked.append(item)
return True