J'ai des difficultés dans un cours d'informatique pour débutants au collège et j'ai juste besoin d'une aide aux devoirs simple.
Maintenant, nous travaillons actuellement sur des définitions de fonctions, et je dois écrire un programme qui lit une liste d'entiers et indique si la liste contient tous les nombres pairs, impairs ou aucun. L'entrée commence par un entier indiquant le nombre d'entiers dans la liste. Le premier entier n'est pas dans la liste (il indique simplement la longueur de la liste).
Mon programme doit définir et appeler les deux fonctions suivantes. def is_list_even()
retourne vrai si tous les entiers de la liste sont pairs et faux sinon. def is_list_odd()
retourne vrai si tous les entiers de la liste sont impairs et faux sinon. Si la liste est toute paire, je dois aussi imprimer «tout pair». Si la liste est impaire, je dois imprimer «tous impairs». Si la liste contient les deux, je dois imprimer «pas pair ou impair».
J'ai pu insérer tous les nombres entiers dont j'ai besoin dans la liste, mais les définitions sont ce avec quoi je me débat (formatage, retour, etc.). J'ai collé le code que j'ai jusqu'à présent ci-dessous (ce site Web a changé le format de celui-ci) mais mon programme ne produit aucune sortie. Toute aide serait appréciée. Merci.
n = int(input()) my_list =[] for i in range(n): num = int(input()) my_list.append(num) def IsListEven(my_list): for i in range(len(my_list)): if my_list[i] % 2 == 0: return True else: return False def IsListOdd(my_list): for i in range(len(my_list)): if my_list[i] % 2 == 1: return True else: return False def GetUserValues(): if IsListOdd(my_list) == True: print("all odd") elif IsListEven(my_list) == True: print("all Even") else: print("not even or odd")
4 Réponses :
Utilisez un indicateur pour vérifier si toutes les valeurs satisfont à la condition. Exemple :
def IsListEven(my_list): answer = True for i in range(len(my_list)): if my_list[i] % 2 == 0: # As pointed in comment, use != for isEven answer = False break return answer
C'est inutile. Vous pouvez simplement return False
dans la boucle et return True
à la fin.
@Brian non, ici il faut renvoyer le drapeau booléen, mais le mieux est d'utiliser all()
La logique ici est incorrecte, elle devrait l'être if my_list[i] % 2 != 0
@WasifHasan Il n'y a pas besoin de drapeau. Voir la réponse acceptée.
@Brian la réponse acceptée est la mienne!
@Wasif je pense que bbnumber2 avait la réponse acceptée quand j'ai posté ça.
return
interrompra immédiatement la boucle, utilisez donc une variable booléenne de maintien comme:
my_list = [1,3,5] print(all(x % 2 == 1 for x in my_list))
Mais vos fonctions peuvent être une seule ligne si vous utilisez all()
, un exemple pour vérifier si tout est impair
def IsListEven(my_list): allEven = True for i in range(len(my_list)): if my_list[i] % 2 != 0: allEven = False return allEven def IsListOdd(my_list): allOdd = True for i in range(len(my_list)): if my_list[i] % 2 != 1: allOdd = False return allOdd def GetUserValues(): if IsListOdd(my_list) == True: print("all odd") elif IsListEven(my_list) == True: print("all Even")
Le dernier one-liner pourrait être simplifié pour print(all(x % 2 == 1 for x in my_list))
Il y a une erreur logique majeure et quelques corrections syntaxiques mineures.
Actuellement, les fonctions IsListEven()
et IsListOdd()
retournent immédiatement lorsqu'elles trouvent un élément pair ou impair, respectivement. Cela conduit à ce que les listes soient marquées comme «paires» même si seul le tout premier élément est pair (et vice versa). Une façon de résoudre ce problème est de renvoyer false lorsque le contraire est trouvé, et true sinon:
if IsListOdd(my_list): print("all odd") elif IsListEven(my_list): print("all Even") else: print("not even or odd")
et
def IsListEven(my_list): for i in my_list: if i % 2 == 1: return False else: return True
Plus explicitement, cela peut être défini avec une instruction for-else
(bien que cela ne soit pas complètement nécessaire ici):
def IsListEven(my_list): for i in range(len(my_list)): if my_list[i] % 2 == 0: return False else: return True
En termes de syntaxe, il n'y a pas beaucoup de raison d'utiliser l'indexation de liste dans les boucles for. Une méthode plus simple consiste à accéder directement aux numéros:
def IsListOdd(my_list): for i in range(len(my_list)): if my_list[i] % 2 == 0: return False return True
De plus, les vérifications finales peuvent être simplifiées car les valeurs renvoyées sont des booléens:
def IsListEven(my_list): for i in range(len(my_list)): if my_list[i] % 2 == 1: return False return True
Je pense que vous êtes sur la bonne voie, il vous suffit de simplifier un peu la logique de vos boucles for:
Enter the number of elements: 4 Enter element 1: 1 Enter element 2: a Error: Enter an integer, try again... Enter element 2: 2 Enter element 3: 1 Enter element 4: 7 [1, 2, 1, 7] mix of evens and odds
Exemple d'utilisation 1:
Enter the number of elements: 3 Enter element 1: 2 Enter element 2: 2 Enter element 3: 2 [2, 2, 2] all even
Exemple d'utilisation 2:
Enter the number of elements: 5 Enter element 1: 1 Enter element 2: 1 Enter element 3: 1 Enter element 4: 1 Enter element 5: 1 [1, 1, 1, 1, 1] all odd
Exemple d'utilisation 3:
def get_int_input(prompt): num = -1 while True: try: num = int(input(prompt)) break except: print("Error: Enter an integer, try again...") return num def is_list_even(lst): for x in lst: if x % 2 != 0: return False return True def is_list_odd(lst): for x in lst: if x % 2 == 0: return False return True def main(): num_elements = get_int_input("Enter the number of elements: ") my_list = [] for i in range(num_elements): my_list.append(get_int_input(f"Enter element {i + 1}: ")) print(my_list) if is_list_even(my_list): print("all even") elif is_list_odd(my_list): print("all odd") else: print("mix of evens and odds") if __name__ == "__main__": main()
return
met immédiatement fin à une fonction. Vous avez unreturn
dans vos bouclesfor
qui garantit qu'elles ne boucleront jamais sur toutes les valeurs. Par exemple,IsListEven
commence de manière prometteuse, mais lors de la première itération de la boucle for, elle retourne True ou False indépendamment de l'origine de nombreux éléments que vous aviez l'intention d'examiner.Quel est le problème avec votre code actuel en particulier?
peut utiliser
all
fonctions intégrées pour vérifier si tous les nombres sonteven
ouodd
. Par exemple, déterminer si une liste contient uniquementodd
nombresodd
, peut faire:all(map(lambda x: x%2, my_list))
J'ai besoin que le programme produise une sortie "tout pair", "tout impair" ou "pas pair ou impair". Quand je l'exécute, aucune sortie n'est produite. Il ne me montre aucune erreur. Je vais essayer de déplacer les déclarations de retour, mais je suis un peu confus sur la façon de le faire. (Je m'excuse, mon professeur d'informatique n'a pas été très doué pour expliquer les choses à la classe.)
Avez-vous un débogueur? C'est un problème facile lorsque vous voyez ce que fait réellement votre code.