TypeError: pas assez d'arguments pour le format de chaîne de caractères à l'aide d'une Boucle While

Je suis en train de faire la vieille 99 bouteilles de chanson et d'essayer de le faire à l'aide d'une boucle While, pour m'aider à mieux apprendre que le type de la boucle.

Je me demande pourquoi je ne serais pas obtenir un TypeError alors que dans mon code ci-dessous et quels sont les arguments exactement ce que je suis absent?

Voici mon code:

# Get number of beers
bottles = int(raw_input("How many bottles of beer? "))

# return invalid response
if bottles < 1:
    print "That's not a good number"

    if bottles == 1:
        s1 = "bottle" 
        s2 = "bottles" 

    elif bottles == 2:
        s1 = "bottles" 
        s2 = "bottles" 

# sing verses
while bottles > 0:
    print "%d %s of beer on the wall," % bottles, s1
    print "%d %s of beer." % bottles, s1
    print "You take one down, pass it around,"
    print "%d %s of beer on the wall." % (bottles - 1), s2
    print
    bottles -= 1

Et voici l'erreur:

Traceback (most recent call last):
    File "beer.py", line 47, in <module>
          print "%d %s of beer on the wall," % bottles, s1
TypeError: not enough arguments for format string

J'ai essayé d'utiliser la parenthèse autour de "bouteilles, s1" après l' %, mais ne peut toujours pas aider. Des suggestions?

  • À l'aide de (bottles, s1) fonctionne pour moi.
  • Que faire si l'entrée de la bouteille est de 10. D'où vient s1 et s2 obtenir défini?
  • Votre code va générer un NameError si vous définissez bottles à quelque chose de plus grand que 2, car, dans ce cas, ni de votre if/elif à exécuter. Vous devriez changer le elif à un si. Aussi il semble que vous avez un problème d'indentation. Le if/elif ne devrait pas être sous le if bottles < 1.
  • Et il faudrait aussi ne jamais mettre à jour votre s1 et s2 chaînes, car ils ne sont évaluées une fois à partir de la saisie de l'utilisateur. La boucle while peut seulement tourner jusqu'à ce qu'il avait fait. Vous auriez besoin de les déplacer à l'intérieur de la while boucle de sorte qu'ils se définir correctement à chaque fois.
  • Je suppose que je suis toujours confus quant à la façon dont je devrais être la définition de mes conditions pour s1 et s2 et puis, la façon dont ils sont censés être appelé dans la chanson.