Je suis nouveau sur python! J'ai fait mes études, parcouru plusieurs livres et tenté maintenant des défis dans les écoles. Terminé Les variables et les types de données avec succès, mais la question 7 du sujet 2 (Fonctions) me donne l'enfer.

J'utilise Eclipse avec Python (ver 3.2). dans mon éclipse, j'obtiens les réponses 100, 51 et 525. Ce sont les mêmes réponses que pyschools attend mais cela montre que ma fonction renvoie 100, 0 et 500.

Voici la question (j'espère pouvoir la poster ici!):
Écrivez un pourcentage de fonction (valeur, total) qui prend deux nombres comme arguments et renvoie la valeur en pourcentage sous forme d'entier.
Et ci-dessous est ma fonction

    def percent (value, total):
        a = value
        b = total
        return(int((a / b) * 100))
    percent(70, 70)
    percent(46, 90)
    percent(63, 12)

Quelqu'un peut-il me dire ce que les écoles de formation veulent vraiment que je fasse ou où je vais mal?

Merci!

2
lukik 6 déc. 2011 à 06:22

4 réponses

Meilleure réponse

Vous utilisez Python 3.x et ils utilisent Python 2.x. Dans Python 2.x, l'opération / est toujours une division entière lorsque les arguments sont des nombres entiers. 1/2 est 0. Utilisez donc float() pour remplacer l'un de vos arguments par un nombre à virgule flottante, tel que int((float(a) / b) * 100). Alors a/b aura une partie fractionnaire.

Ou, en supposant qu'ils utilisent une version récente de Python 2.x, vous pouvez simplement l'ajouter au début de votre script et cela devrait fonctionner sur le site:

from __future__ import division

En passant, pourquoi attribuez-vous vos paramètres d'entrée à des variables? Ce sont déjà des variables. Si vous voulez les nommer a et b, recevez-les simplement de cette façon:

def percent(a, b):
    return int((float(a) / b) * 100)
9
kindall 6 déc. 2011 à 02:28

Vous pouvez utiliser la division tronquée, comme ceci:

def percent(value, total):
    return value * 100 // total

Avantages:

(0) Fonctionne avec tous les Pythons à partir de la version 2.2.

(1) Le lecteur sait ce que fait une ligne sans avoir à deviner quelle version de Python est exécutée et sans avoir à inspecter le début du module pour la magie from __future__.

(2) Évite tout problème potentiel en virgule flottante.

(3) Évite d'utiliser float et int c'est-à-dire enregistre deux appels de fonction (relativement coûteux).

Remarquez attentivement: // fonctionne aussi bien sur float objets que sur int objets. La question indique que les arguments sont des "nombres" (peuvent inclure des objets float) et que le résultat doit être un "entier" (pas nécessairement un objet int). Cela vous donne une licence considérable.

>>> percent(63.001, 11.9999)
525.0 # That's an integer

S'ils insistent pour que la valeur de retour soit un objet int, alors bien sûr, vous aurez besoin d'un int().

0
John Machin 6 déc. 2011 à 03:58

Python effectue des opérations mathématiques sur des entiers avec des mathématiques strictement entières, tronquant les parties fractionnaires.

Pour éviter cela, multipliez l'une des entrées par 1,0 avant de diviser.

0
Larry Lustig 6 déc. 2011 à 02:52

Car il utilise python 2.x, vous devez au moins convertir une valeur en float

def percent(number, total):
    return int((float(number)/total)  * 100)

Cela fonctionnera bien

1
ammar 13 mars 2012 à 19:30
8394602