[python] TypeError : 문자열 형식을 지정하는 동안 모든 인수가 변환되는 것은 아닙니다

프로그램은 두 가지 이름을 취해야하며 길이가 같으면 같은 단어인지 확인해야합니다. 같은 단어이면 “이름이 같습니다”라고 인쇄됩니다 . 길이가 같지만 글자 가 다른 경우 “이름이 다르지만 길이는 같습니다”라고 인쇄됩니다 . 내가 문제가있는 부분은 맨 아래 4 줄에 있습니다.

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

이 코드를 실행하면 다음이 표시됩니다.

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

모든 제안은 높이 평가됩니다.



답변

다른 형식 기능을 혼합하고 있습니다.

구식 %형식은 다음 과 같은 형식의 %코드를 사용합니다 .

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

새로운 스타일의 {}서식은 {}코드와 .format방법을 사용합니다.

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

구식 형식에서는 튜플을 사용하여 여러 인수를 지정해야합니다.

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

귀하의 경우 {}형식 지정자를 사용하고 있으므로 .format다음을 사용하십시오 .

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


답변

문자열 형식에 오류가 있습니다.

‘%’연산자를 사용하여 기존 문자열 형식을 사용하는 올바른 방법은 printf 스타일 형식 문자열을 사용하는 것입니다 (Python 설명서 : http://docs.python.org/2/library/string.html#format- 문자열 구문 ) :

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

그러나 ‘%’연산자 는 앞으로 더 이상 사용되지 않을 것입니다 . 새로운 PEP 3101 방식은 다음과 같습니다.

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


답변

나를 위해,이 오류는 문자열 형식 방법으로 튜플을 전달하려고 할 때 발생했습니다.

이 질문 / 답변에서 해결책을 찾았습니다.

링크에서 정답을 복사하여 붙여 넣기 (내 작품이 아님) :

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

관심있는 튜플을 유일한 항목, 즉 (튜플) 부분으로 사용하여 싱글 톤 튜플을 만드는 것이 여기서 핵심입니다.


답변

제 경우에는 단일 %s입력 값이 필요 없기 때문 입니다.


답변

다른 두 가지 대답 외에도 마지막 두 가지 조건에서 들여 쓰기가 잘못되었다고 생각합니다. 조건은 하나의 이름이 다른 이름보다 길며 ‘elif’로 시작하고 들여 쓰기없이 시작해야합니다. 첫 번째 조건 내에 넣으면 (여백에서 4 개의 들여 쓰기를함으로써) 이름의 길이가 동시에 같고 다를 수 없기 때문에 모순이됩니다.

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


답변

다른 답변 중 일부에서 지적한 것처럼 문제의 조합이 있습니다.

  1. nneonneo가 지적한 것처럼 다른 문자열 형식화 방법을 혼합하고 있습니다.
  2. GuyP가 지적했듯이 들여 쓰기도 꺼져 있습니다.

.format 예제와 튜플을 % s의 인수 지정자에 전달했습니다. 두 경우 모두 들여 쓰기가 길이가 일치 할 때 수표가 너무 크거나 작게 수정되었습니다. 또한 후속 if 문을 elif로 변경하여 이전의 동일한 수준 명령문이 False 인 경우에만 실행됩니다.

.format으로 문자열 형식화

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

% s 및 튜플을 사용한 문자열 형식화

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


답변

파이썬 3.7 이상에서는 새롭고 쉬운 방법이 있습니다. 구문은 다음과 같습니다.

name = "Eric"
age = 74
f"Hello, {name}. You are {age}."

산출:

Hello, Eric. You are 74.