J'écris un programme de base en Python qui invite l'utilisateur à entrer 5 scores de test. Le programme convertira ensuite chaque score de test en un point de grade (c'est-à-dire 4.0, 3.0, 2.0 ...), puis ensuite prendre la moyenne de ces chiffres.
J'ai attribué à chaque score de test sa propre variable, et je 'M Les nourrissez-les dans une boucle comme suit: P>
for num in [score1, score2, score3, score4, score5]:
if num >= 90
print('Your test score is a 4.0)
elif num < 90 and >= 80
.
.
and so on for each grade point.
4 Réponses :
«Il semblerait stupide que Python aurait pas ce genre de capacité, parce que sinon vous ne seriez pas en mesure de redéfinir une variable passée à travers une boucle si elle fait partie d'une liste qui est passé par " em> -. C'est ainsi que le travail la plupart des langages de programmation. Pour permettre à cette capacité serait mauvais parce que cela créerait quelque chose appelé effets secondaires, qui font obtuse de code De plus, c'est un piège de programmation commune parce que vous devez conserver les données sur les noms de variables strong>:. Voir http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html (en particulier la liste des questions similaires, même si vous ne traitez pas avec des noms de variables, vous êtes au moins essayer de faire face à l'espace de noms de variables). Le remède est de travailler à « un niveau supérieur »: une liste ou un ensemble dans ce cas. Voilà pourquoi votre question initiale est pas raisonnable. (Certaines versions de Python vous permettent de pirater le Vous pouvez cependant forcer python d'utiliser des effets secondaires comme ceci: p> locals () code> dictionnaire, mais ce comportement est non pris en charge et sans papier et le style très pauvre.) P>
class Score(object):
def __init__(self, points):
self.points = points
def __repr__(self):
return 'Score({})'.format(self.points)
scores = [Score(i) for i in [99.1, 78.3, ...]]
for s in scores:
s.points += 5 # adds 5 points to each score
J'apprécie tous les conseils, et je pense que j'obtiens ce que vous dites de faire le code obtus. Je trouve que cela est intéressant, je peux voir comment cela pourrait causer des erreurs inattendues, même si je serais intéressé à entendre exactement pourquoi. D'autre part, je cherche réellement à redéfinir les variables au lieu de les modifier ou de provoquer des changements globaux comme une courbe, que votre message fait un excellent travail de décrivant comment faire. Merci
@Dustinburns: Les effets secondaires causent des erreurs inattendues car à moins qu'elles soient contrôlées d'effets secondaires, vous perdez la possibilité de modulariser votre code. Appeler une fonction avec un effet secondaire est mauvais car il fait plus que «retourner» une valeur. Vous ne pouvez donc pas facilement tester les fonctions avec des effets secondaires. Appeler une fonction avec des effets secondaires deux fois peut ne pas renvoyer la même valeur; La sortie peut dépendre des données existantes en dehors de la fonction. Il fait de grandes quantités de code un gâchis.
Le problème est que lorsque vous écrivez ceci: Ce qui se passe est que vous créez une liste qui comporte cinq éléments définis par les valeurs du score1 à la score 5 au niveau de la note temps que vous commencez à itération. Changer l'un de ces éléments ne change pas la variable d'origine, car vous avez créé une liste contenant des copies de ces valeurs. P> Si vous exécutez le script suivant: p> score1 = 2
score2 = 3
for num in [score1, score2]:
num = 1
for num in [score1, score2]:
print(num)
Ouais. Je comprends que lorsque la boucle de la boucle commence et appelle ces valeurs spécifiques, cela va tirer ces valeurs de l'extérieur de la boucle pour la boucle. Les modifications internes n'auront donc aucun effet lors de la réinitiativement de la boucle. Pour cette raison, il serait plus facile de définir la liste en dehors de la boucle, alors vous pourriez alors modifier la liste en dehors de la boucle avant d'envoyer les valeurs dans. Je suis curieux, si vous savez un moyen de modifier le Contenu d'une liste, puis renvoyer ces nouvelles valeurs à la fonction principale / corps du code. Ce ne serait pas exactement ce que je cherche à faire, mais je me demande si vous pouvez le faire
[3.4, 3.7, 1.5, 2.5, 3.0] Average GPA is: 2.82
Je me demandais simplement si vous pouviez mettre une telle conversion directement dans la boucle pour, au lieu de devoir écrire une autre fonction pour faire une conversion séparée. Cette option fonctionnera très bien, j'étais juste curieux quelles étaient mes limites lors de la rédaction d'une boucle. Merci beaucoup :)
Je pense que, au lieu de le faire, je vais simplement convertir la moyenne à une GPA comme indiqué ci-dessus. Donc, lorsque je prends la moyenne de la liste des scores, je vais le convertir en une GPA dans la fonction qui prend la moyenne.
Oui, de toute façon fonctionne. Parfois, ce pourrait être une bonne idée de tout décomposer. En fonction de vos besoins.
Première règle: Lorsque vous traitez avec un groupe d'éléments similaires, ne em> pas em> utiliser un groupe de variables nommées - utilisez un tableau (liste, ensemble, dictionnaire, tout ce qui est le plus sens possible). < p> Deuxième règle: sauf si vous êtes vraiment pressé pour l'espace, ne pas écraser vos variables de cette façon - vous essayez de faire une étiquette (le nom de la variable) supporter deux choses différentes (marque brute et / ou GPA). Cela fait du débogage vraiment méchant. P>
Je m'excuse, je suis un peu nouveau à cela. Merci beaucoup pour le conseil. Je suis curieux, et je vais essayer de le chercher moi-même, mais lorsque vous avez la moyenne de la moyenne (LS), où tirez-vous cette variable de. Est-ce que LS signifie que toutes les valeurs de la liste prédéfinie? Si oui, cela aurait un sens. Merci encore pour votre aide!
Oh, attends, je vois ce que tu as fait là-bas. Vous avez appelé la fonction plus tard dans la principale et mettez la LS dans les fonctions définies afin que vous ne limitez pas les variables que vous avez pu appuyer sur la fonction. Frais.
"Il semblerait idiot que Python n'aurait pas ce genre de capacité, car sinon vous ne seriez pas en mesure de redéfinir une variable passée à une boucle si elle fait partie d'une liste qui est transmise." I> - C'est ainsi que la plupart des langues de programmation fonctionnent. Pour permettre que cette capacité serait mauvaise car elle créerait quelque chose appelé effets secondaires, ce qui rend le code obtus.