Le programme est supposé prendre deux noms et, s'ils ont la même longueur, il convient de vérifier s'ils sont identiques. Si c'est le même mot, il sera imprimé "Les noms sont les mêmes" . Si elles ont la même longueur mais avec des lettres différentes, le résultat sera imprimé "Les noms sont différents mais de même longueur" . La partie avec laquelle j'ai un problème est dans les 4 dernières lignes.
#!/usr/bin/env python
# Enter your code for "What's In (The Length Of) A Name?" here.
name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
len(name1)
len(name2)
if len(name1) == len(name2):
if name1 == name2:
print ("The names are the same")
else:
print ("The names are different, but are the same length")
if len(name1) > len(name2):
print ("'{0}' is longer than '{1}'"% name1, name2)
Elif len(name1) < len(name2):
print ("'{0}'is longer than '{1}'"% name2, name1)
Quand je lance ce code, il affiche:
Traceback (most recent call last):
File "program.py", line 13, in <module>
print ("'{0}' is longer than '{1}'"% name1, name2)
TypeError: not all arguments converted during string formatting
Toutes les suggestions sont très appréciées.
Vous mélangez différentes fonctions de format.
Le formatage %
à l'ancienne utilise les codes %
pour le formatage:
'It will cost $%d dollars.' % 95
La mise en forme {}
de style nouveau utilise les codes {}
et la méthode .format
'It will cost ${0} dollars.'.format(95)
Notez qu'avec la mise en forme à l'ancienne, vous devez spécifier plusieurs arguments à l'aide d'un tuple:
'%d days and %d nights' % (40, 40)
Dans votre cas, puisque vous utilisez des spécificateurs de format {}
, utilisez .format
:
"'{0}' is longer than '{1}'".format(name1, name2)
L'erreur est dans votre formatage de chaîne.
La manière correcte d'utiliser le formatage de chaîne traditionnel à l'aide de l'opérateur '%' consiste à utiliser une chaîne de format de style printf (la documentation Python à ce sujet est disponible ici: http://docs.python.org/2/library/string.html format-string-syntax ):
"'%s' is longer than '%s'" % (name1, name2)
Cependant, l'opérateur '%' sera probablement obsolète à l'avenir . La nouvelle PEP 3101 est la suivante:
"'{0}' is longer than '{1}'".format(name1, name2)
Pour moi, cette erreur a été provoquée lorsque je tentais de transmettre un tuple à la méthode de formatage de chaîne.
J'ai trouvé la solution de cette question/réponse
Copier et coller la bonne réponse à partir du lien (NOT MY WORK):
>>> thetuple = (1, 2, 3)
>>> print "this is a Tuple: %s" % (thetuple,)
this is a Tuple: (1, 2, 3)
Faire un singleton Tuple avec le Tuple d’intérêt comme unique objet, c’est-à-dire la partie (le), est la clé ici.
Dans mon cas, c'est parce que je n'ai besoin que d'un seul %s
, les valeurs manquantes étant entrées.
En plus des deux autres réponses, je pense que les indentations sont également incorrectes dans les deux dernières conditions ... Les conditions sont qu'un nom est plus long que l'autre et qu'il doit commencer par "Elif" et sans indentation. Si vous le placez dans la première condition (en lui donnant quatre indentations dans la marge), cela finit par être contradictoire car les longueurs des noms ne peuvent pas être égales et différentes en même temps.
else:
print ("The names are different, but are the same length")
Elif len(name1) > len(name2):
print ("{0} is longer than {1}".format(name1, name2))
Il existe une combinaison de problèmes, comme indiqué dans quelques-unes des autres réponses.
J'ai fourni à la fois l'exemple de .format et la transmission de nuplets au spécificateur d'argument de% s. Dans les deux cas, l'indentation a été corrigée. Par conséquent, les vérifications sont inférieures ou supérieures à la longueur. Les instructions if suivantes ont également été modifiées pour Elif afin qu'elles ne s'exécutent que si l'instruction précédente de même niveau était False.
name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
len(name1)
len(name2)
if len(name1) == len(name2):
if name1 == name2:
print ("The names are the same")
else:
print ("The names are different, but are the same length")
Elif len(name1) > len(name2):
print ("{0} is longer than {1}".format(name1, name2))
Elif len(name1) < len(name2):
print ("{0} is longer than {1}".format(name2, name1))
name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
len(name1)
len(name2)
if len(name1) == len(name2):
if name1 == name2:
print ("The names are the same")
else:
print ("The names are different, but are the same length")
Elif len(name1) > len(name2):
print ("%s is longer than %s" % (name1, name2))
Elif len(name1) < len(name2):
print ("%s is longer than %s" % (name2, name1))
Django raw sql query in view
"SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to)
models.py
class VehicleDamage(models.Model):
requestdate = models.DateTimeField("requestdate")
vendor_name = models.CharField("vendor_name", max_length=50)
class Meta:
managed=False
views.py
def location_damageReports(request):
#static date for testing
date_from = '2019-11-01'
date_to = '2019-21-01'
vehicle_damage_reports = VehicleDamage.objects.raw("SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to))
damage_report = DashboardDamageReportSerializer(vehicle_damage_reports, many=True)
data={"data": damage_report.data}
return HttpResponse(json.dumps(data), content_type="application/json")
Note: en utilisant python 3.5 et Django 1.11
Je rencontre aussi l'erreur,
_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting
Mais la liste des arguments fonctionne bien.
J'utilise mysqlclient python lib. La lib ne semble pas accepter les arguments de Tuple. Passer des arguments de liste comme ['arg1', 'arg2']
fonctionnera.