Je suis en train de créer un programme qui décidera si vous devez mettre à jour votre ordinateur
Traceback (most recent call last):
File "F:\Free-Lance Coding\Computer Upgrading.py", line 10, in <module>
avgcalc = str((GPUcalc + CPUcalc + buyyear)/3)
TypeError: cannot concatenate 'str' and 'int' objects
En attente: une très longue description indiquant si vous devez mettre à jour votre ordinateur ou non.
Résultat:
#User inputs
CPU = int(raw_input("User, input the production year of your CPU: "))
GPU = int(raw_input("User, input the production year of your GPU, if you have a dedicated GPU: "))
buyyear = int(raw_input("User, input the year that you bought or built your desktop/laptop: "))
date = int(raw_input("User, input current year: "))
#Calculations
CPUcalc = str(date - CPU)
GPUcalc = str(date - GPU)
avgcalc = str((GPUcalc + CPUcalc + buyyear)/3)
#Outputs
if date > avg_calc:
print ("Your computer is " + avgcalc + " years old. You might not need to upgrade your laptop/desktop, but if you think your laptop/desktop is slow, you may need to upgrade.")
elif date < avg_calc:
print ("Your computer is " + avgcalc + " years old. You may need to upgrade your laptop/desktop, but if you think your laptop/desktop is not slow, you my not need to upgrade.")
else:
print "ERROR: The program didn't meet the requirements for the program to calculate if you need to upgrade or not."
print "The equation is: ((current year - CPU year) + (current year - GPU year) + bought year) divide by 3) = x"
print "If 'x' is less than 4, you may not need to upgrade"
print "If 'x' is more than 4, you may need to upgrade"
3 Réponses :
essayez ceci: avgcalc = (GPUcalc + CPUcalc + buyyear) / 3
avgcalc = int (avgcalc)
Vous convertissez vos valeurs en chaînes trop tôt, en supposant que vous souhaitiez pouvoir imprimer plus tard CPUcalc , GPUcalc et avgcalc . Vous essayez de faire un calcul avec GPUcalc et CPUcalc mais ces valeurs sont des chaînes, alors qu'elles n'ont vraiment pas besoin de l'être.
Ne convertissez les valeurs en chaînes que lorsque ils doivent être des chaînes:
import datetime # ... date = datetime.date.today().year
Vous avez également une faute de frappe, vous référencez à la fois avgcalc et avg_calc . Il n'y a probablement que avgcalc :
CPU_age = date - CPU
GPU_age = date - GPU
computer_age = date - buyyear
avg_age = (CPU_age + GPU_age + computer_age) / 3
if avg_age > 4:
# computer is old
else:
# computer is still new enough
Notez que vous n'avez pas besoin d'utiliser str () pour convertir les valeurs en strings, ce n'est nécessaire que lors de la concaténation d'objets non-string avec des chaînes. Vous pouvez demander à print de convertir les valeurs en chaînes pour vous si vous les transmettez séparément à l'instruction (à quel point print insère des espaces entre chaque élément):
if date > avgcalc:
print "Your computer is {} years old. You might not need to upgrade your laptop/desktop, but if you think your laptop/desktop is slow, you may need to upgrade.".format(avgcalc)
elif date < avgcalc:
print "Your computer is {} years old. You may need to upgrade your laptop/desktop, but if you think your laptop/desktop is not slow, you my not need to upgrade.".format(avgcalc)
else:
# ...
Vous pouvez également utiliser le formatage de chaîne, avec le str.format () méthode :
if date > avgcalc:
print "Your computer is", avgcalc, "years old. You might not need to upgrade your laptop/desktop, but if you think your laptop/desktop is slow, you may need to upgrade."
elif date < avgcalc:
print "Your computer is", avgcalc, "years old. You may need to upgrade your laptop/desktop, but if you think your laptop/desktop is not slow, you my not need to upgrade."
else:
# ...
L'espace réservé {} convertira les valeurs en une chaîne appropriée, ou vous pouvez configurer davantage la façon dont la valeur doit être traitée.
Notez que vos tests réels ( date> avgcalc , date else ne sont pas d'accord l'un avec l'autre, où vous dites que vous testez le calcul par rapport au nombre 4 .
Votre calcul n'a pas non plus beaucoup de sens, pourquoi ajouteriez-vous l'année d'achat de l'ordinateur au nombre d'années qui se sont écoulées depuis que le processeur et le GPU ont été achetés? Vous voudrez probablement utiliser (date - buyyear) dans la valeur avgcalc . J'utiliserais également le terme age dans chaque variable, pour préciser ce que les valeurs signifient:
if date > avgcalc:
print ("Your computer is " + str(avgcalc) + " years old. You might not need to upgrade your laptop/desktop, but if you think your laptop/desktop is slow, you may need to upgrade.")
elif date < avgcalc:
print ("Your computer is " + str(avgcalc) + " years old. You may need to upgrade your laptop/desktop, but if you think your laptop/desktop is not slow, you my not need to upgrade.")
else:
print "ERROR: The program didn't meet the requirements for the program to calculate if you need to upgrade or not."
print "The equation is: ((current year - CPU year) + (current year - GPU year) + bought year) divide by 3) = x"
print "If 'x' is less than 4, you may not need to upgrade"
print "If 'x' is more than 4, you may need to upgrade"
Votre branche else: n'a pas beaucoup de sens, car cela ne se produirait que si date et avgcalc étaient exactement égaux. Vous souhaitez probablement en savoir plus sur la la validation de l'entrée utilisateur et utilisez le message d'erreur.
Vous pouvez également envisager d'utiliser Python pour obtenir l'année en cours, les ordinateurs connaissent généralement déjà la date. Python a le module datetime , où datetime.date.today () vous donne la date du jour, et l'objet résultant a un attribut year :
CPUcalc = date - CPU GPUcalc = date - GPU avgcalc = (GPUcalc + CPUcalc + buyyear) / 3
Vous rencontrez les problèmes suivants:
- Différence entre l'instruction d'impression print "Test" en python 2 et print ("test") en python 3
- problème d'indentation après les instructions if else
- Non-concordance de nom de variable avgcalc et avg_calc
- Concaténation de avgcalc avec une chaîne à imprimer
etc
Voici le code de travail, mais vous devez vraiment en savoir plus sur python et la différence entre la méthode raw_input () et input () , print code > et print () en termes de versions python.
si vous utilisez Python 3:
#User inputs
CPU = int(input("User, input the production year of your CPU: "))
GPU = int(input("User, input the production year of your GPU, if you have a dedicated GPU: "))
buyyear = int(input("User, input the year that you bought or built your desktop/laptop: "))
date = int(input("User, input current year: "))
#Calculations
CPUcalc = date - CPU
GPUcalc = date - GPU
avgcalc = (GPUcalc + CPUcalc + buyyear)/3
#Outputs
if date > avgcalc:
print("Your computer is " + str(avgcalc) + " years old. You might not need to upgrade your laptop/desktop, but if you think your laptop/desktop is slow, you may need to upgrade.")
elif date < avgcalc:
print("Your computer is " + str(avgcalc) + " years old. You may need to upgrade your laptop/desktop, but if you think your laptop/desktop is not slow, you my not need to upgrade.")
else:
print("ERROR: The program didn't meet the requirements for the program to calculate if you need to upgrade or not.")
print("The equation is: ((current year - CPU year) + (current year - GPU year) + bought year) divide by 3) = x")
print("If 'x' is less than 4, you may not need to upgrade")
print("If 'x' is more than 4, you may need to upgrade")
Si vous utilisez python 2:
remplacez input () par raw_input et remplacez print ("Votre string ") avec print" your string " dans le code ci-dessus.
Les parenthèses autour de la chaîne imprimée ne posent pas vraiment de problème si elles n'utilisent pas de virgules pour séparer les éléments.
Vous avez besoin de
avgcalc = str ((int (GPUcalc) + int (CPUcalc) + buyyear) / 3))Cela ne répond pas à votre question, mais vous n'avez pas à convertir les valeurs en chaînes et à les concaténer pour les imprimer sur la même ligne.
printaccepte plusieurs arguments et ils ne doivent pas nécessairement être du même type. Par exemple,print "your computer is:", 10, "years old"est une syntaxe valide. (Dans Python 2.7)@Sheldore: non, ils doivent abandonner les appels
str ()et n'utiliser que ceux enprint. Ou utilisez simplementprint "string", intvalue, "string"au lieu de concaténation. Ou utilisez le formatage de chaîne avec"string% d string"% (intvalue,)ou"string {} string" .format (intvalue).corrigez également l'indentation de vos instructions conditionnelles si autrement
Pourquoi afficher une ERREUR lorsque
date == avg_calcet ne pas inclure ce cas dans l'un des cas de mise à niveau / non mise à niveau? Qu'est-ce que le calculavg_calc? Ne devrait-il pas êtredate - buyyear? Pourquoi demander à l'utilisateur pour l'année en cours de ne pas laisser Python le faire?