-4
votes

définition de fonction python pour trouver si toutes les valeurs d'une liste sont paires ou impaires

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")


5 commentaires

return met immédiatement fin à une fonction. Vous avez un return dans vos boucles for 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 sont even ou odd . Par exemple, déterminer si une liste contient uniquement odd nombres odd , 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.


4 Réponses :


2
votes

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


6 commentaires

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.



1
votes

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")


1 commentaires

Le dernier one-liner pourrait être simplifié pour print(all(x % 2 == 1 for x in my_list))



1
votes

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


0 commentaires

1
votes

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()


0 commentaires