2013-08-05 22 views
105

Program powinien przyjmować dwie nazwy, a jeśli mają tę samą długość, powinien sprawdzić, czy są to te same słowa. Jeśli jest to to samo słowo, wydrukuje "Nazwy są takie same". Jeśli mają tę samą długość, ale z różnymi literami, będą drukować "Nazwy są różne, ale mają tę samą długość". Część, z którą mam problem, znajduje się w dolnych 4 liniach.TypeError: nie wszystkie argumenty zostały przekonwertowane podczas formatowania znaków Python

#!/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) 

Kiedy uruchomić ten kod wyświetla:

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 

Wszelkie sugestie są bardzo mile widziane.

Odpowiedz

132

Miksujesz różne funkcje formatowania.

Stary styl % formatowania wykorzystuje % kody formatowania:

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

Nowy stylu {} formatowania wykorzystuje {} kody i metoda .format

'It will cost ${0} dollars.'.format(95) 

Należy zauważyć, że z formatowaniem w starym stylu , musisz podać wiele argumentów używając krotki:

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

W twoim przypadku, ponieważ używasz {} specyfikatory formatu użyć .format:

"'{0}' is longer than '{1}'".format(name1, name2) 
+4

w python 3.6: 'f" 'Będzie to kosztować $ {your_variable} dolarów. "' – JinSnow

27

Błąd znajduje się w formatowaniu strun.

Prawidłowy sposób na wykorzystanie tradycyjnej ciąg formatowanie za pomocą operatora „%” jest użycie ciąg formatu printf stylu (dokumentacja Pythona do tego tutaj: http://docs.python.org/2/library/string.html#format-string-syntax):

"'%s' is longer than '%s'" % (name1, name2) 

Jednakże, „%” operator will probably be deprecated in the future. Nowy PEP 3101 sposób robienia rzeczy jest tak:

"'{0}' is longer than '{1}'".format(name1, name2) 
+7

scnr: "prawdopodobnie będzie przestarzałe w przyszłości" nie miało miejsca (Python 3.5). Stara składnia "%" nie została uznana za przestarzałą w [3.1] (https://docs.python.org/3.1/whatsnew/3.1.html) i tylko w wersji 3.2 [moduł logowania nauczył się formatować w nowym stylu '{ } '] (https://docs.python.org/3.2/whatsnew/3.2.html#logging). I nagle 3.5 przynosi [PEP 461: formatowanie "%" dla bajtów] (https://docs.python.org/3.5/whatsnew/3.5.html#pep-461-formatowanie-support-for-bytes-and-bytearray) . To sprawia, że ​​myślę, że '%' pozostaje przez długi czas. – cfi

+5

'%' jest bardziej zwięzły. Cieszę się, że zostaje z nami. –

+1

Zgadzam się. % jest bardziej zwięzły, a usunięcie nie przyniosłoby korzyści językowi. – chevydog

2

Oprócz dwóch innych odpowiedzi, myślę, że wgłębienia są również nieprawidłowe w ciągu ostatnich dwóch warunków. Warunki są takie, że jedna nazwa jest dłuższa od drugiej i musi zaczynać się od "elif" bez wcięć. Jeśli umieścisz go w pierwszym warunku (przez podanie czterech wcięć z marginesu), kończy się to sprzecznością, ponieważ długości nazw nie mogą być równe i różne w tym samym czasie.

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)) 
23

Dla mnie ten błąd był spowodowany kiedy próbował przejść w krotce do metody format string.

I found the solution from this question/answer

Kopiowanie i wklejanie poprawną odpowiedź z linkiem (NOT MY pracy):

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

Making a singleton tuple with the tuple of interest as the only item, i.e. the (thetuple,) part, is the key bit here.

+0

To często jest przyczyną problemu! –

+0

Wolałbym przekonwertować krotkę na ciąg znaków za pomocą jednej z następujących instrukcji: 'print (" to jest krotka:% s "% str (thetuple))' lub 'print (" to jest krotka:% s "% repr (thetuple)) ' – AlexG

1

W moim przypadku, to dlatego, że muszę tylko jeden %s, i brakujące wartości wejściowe.

+0

ten sam problem tutaj – Taylor

0

spotykam błąd, jak również,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Ale lista args działa dobrze.

Używam mysqlclient python lib. Wygląda na to, że lib nie akceptuje argumentów krotki. Aby przejść, będą działać argumenty z listy, takie jak ['arg1', 'arg2'].

Powiązane problemy