TypeError: pas tous les arguments convertis pendant le formatage des chaînes de caractères python

le programme est censé prendre deux noms, et s'ils sont de la même longueur, il devrait vérifier s'ils sont le même mot. Si c'est le même mot, il affichera "les noms sont les mêmes" . S'ils sont de la même longueur mais avec des lettres différentes, il affichera "les noms sont différents mais de la même longueur" . La partie avec laquelle j'ai un problème est dans les 4 lignes du bas.

#!/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 j'exécute ce code il affichages:

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

toute suggestion est très appréciée.

134
demandé sur evtoh 2013-08-05 12:15:57

6 réponses

vous mélangez différentes fonctions de format.

à L'ancienne % formatage utilise % codes pour la mise en forme:

'It will cost $%d dollars.' % 95

Le nouveau style {} formatage utilise {} codes " et le .format méthode

'It will cost "151910920" dollars.'.format(95)

notez qu'avec le formatage ancien, vous devez spécifier plusieurs arguments en utilisant un tuple:

'%d days and %d nights' % (40, 40)

dans votre cas, puisque vous utilisez les spécificateurs de format {} , utilisez .format :

"'{0}' is longer than '{1}'".format(name1, name2)
153
répondu nneonneo 2013-08-05 08:19:49

l'erreur est dans votre formatage de chaîne.

la bonne façon d'utiliser le formatage traditionnel des chaînes de caractères en utilisant l'opérateur ' % 'est d'utiliser une chaîne de format de style printf (documentation Python pour ceci 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 déprécié dans le futur . Le nouveau PEP 3101 la façon de faire les choses est comme ceci:

"'{0}' is longer than '{1}'".format(name1, name2)
38
répondu leonh 2013-08-05 08:31:19

pour moi, cette erreur a été causée quand j'ai essayé de passer dans un tuple dans la méthode de format de chaîne.

j'ai trouvé la solution à partir de cette question/réponse

copier et coller la réponse correcte à partir du lien (pas mon travail) :

>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)

Faire un singleton tuple avec le n-uplet d'intérêt comme le seul élément, c'est-à-dire la partie (thetuple,) est le plus important ici.

32
répondu Nick Brady 2017-05-23 12:34:30

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 ils doivent commencer par "elif" et sans indentations. Si vous le mettez dans la première condition (en lui donnant quatre indentations de la marge), il finit par être contradictoire parce que 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))
4
répondu GuyP 2013-11-26 07:27:27

dans mon cas, c'est parce que je n'ai besoin que d'un seul %s , je manque les valeurs entrées.

4
répondu ParisNakitaKejser 2018-02-25 05:36:36

je rencontre l'erreur ainsi,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

mais lister args fonctionne bien.

j'utilise mysqlclient python lib. La lib ne semble pas accepter tuple args. Pour passer liste args comme ['arg1', 'arg2'] fonctionnera.

0
répondu Victor Choy 2018-02-19 13:29:20