2013-08-05 47 views
105

Chương trình được giả định sử dụng hai tên và nếu chúng có cùng độ dài, nó sẽ kiểm tra xem chúng có cùng một từ hay không. Nếu đó là cùng một từ, nó sẽ in "Các tên giống nhau". Nếu chúng có cùng độ dài nhưng với các chữ cái khác nhau, nó sẽ in "Các tên khác nhau nhưng có cùng độ dài". Phần tôi đang gặp vấn đề nằm ở 4 dòng dưới cùng.LoạiError: không phải tất cả các đối số được chuyển đổi trong khi định dạng chuỗi 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) 

Khi tôi chạy mã này nó sẽ hiển thị:

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 

Bất kỳ lời đề nghị được đánh giá cao.

Trả lời

132

Bạn đang trộn các chức năng định dạng khác nhau.

Các kiểu cũ % định dạng sử dụng % mã để định dạng:

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

Các kiểu mới {} định dạng sử dụng {} mã và .format phương pháp

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

Lưu ý rằng với định dạng kiểu cũ , bạn phải chỉ định nhiều đối số bằng cách sử dụng bộ dữ liệu:

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

Trong trường hợp của bạn, vì bạn đang sử dụng {} định dạng specifiers, sử dụng .format:

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

trong python 3.6: 'f" 'Nó sẽ có giá $ {your_variable} đô la "." – JinSnow

27

Lỗi này là ở định dạng chuỗi của bạn.

Các cách chính xác để sử dụng chuỗi truyền thống định dạng sử dụng toán tử '%' là sử dụng một chuỗi định dạng printf kiểu (tài liệu Python cho đây này: http://docs.python.org/2/library/string.html#format-string-syntax):

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

Tuy nhiên, '%' nhà điều hành will probably be deprecated in the future. Các PEP 3101 phương pháp mới để làm những việc như thế này:

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

scnr: "có thể sẽ không được dùng nữa trong tương lai" không xảy ra cho đến nay (Python 3.5). Cú pháp '%' cũ không được chấp nhận trong [3.1] (https://docs.python.org/3.1/whatsnew/3.1.html) và chỉ trong 3.2 [mô đun ghi nhật ký học cách định dạng với kiểu mới '{ } '] (https://docs.python.org/3.2/whatsnew/3.2.html#logging). Và đột nhiên 3.5 mang đến [PEP 461: '%' định dạng cho byte] (https://docs.python.org/3.5/whatsnew/3.5.html#pep-461-formatting-support-for-bytes-and-bytearray) . Điều này khiến tôi nghĩ rằng '%' vẫn tồn tại trong một thời gian dài sắp tới. – cfi

+5

'%' ngắn gọn hơn. Vui mừng nó ở lại với chúng tôi. –

+1

Tôi đồng ý. % là ngắn gọn hơn và loại bỏ sẽ không thêm lợi ích cho ngôn ngữ. – chevydog

2

Ngoài hai câu trả lời khác, tôi nghĩ rằng vết lõm cũng không chính xác trong hai điều kiện trước. Các điều kiện là một tên dài hơn tên kia và chúng cần bắt đầu bằng 'elif' và không có dấu đầu dòng. Nếu bạn đặt nó trong điều kiện đầu tiên (bằng cách cho nó bốn thụt đầu dòng từ lề), nó kết thúc là mâu thuẫn vì chiều dài của các tên không thể bằng nhau và khác nhau cùng một lúc.

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

Đối với tôi, lỗi này xảy ra khi tôi cố chuyển một bộ vào phương thức định dạng chuỗi.

I found the solution from this question/answer

sao chép và dán các câu trả lời đúng từ liên kết (KHÔNG TÔI LÀM VIỆC):

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

Đây thường là nguyên nhân của sự cố! –

+0

Tôi thà chuyển tuple thành chuỗi bằng cách sử dụng một trong các câu lệnh sau: 'print (" đây là một tuple:% s "% str (thetuple))' hoặc 'print (" đây là tuple:% s "% repr (thetuple)) ' – AlexG

1

Trong trường hợp của tôi, đó là vì tôi cần duy nhất một %s, i thiếu giá trị đầu vào.

+0

cùng một vấn đề ở đây – Taylor

0

tôi gặp phải lỗi là tốt,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Nhưng args danh sách làm việc tốt.

Tôi sử dụng lib python mysqlclient. Các lib có vẻ như không chấp nhận tuple args. Để chuyển danh sách args như ['arg1', 'arg2'] sẽ hoạt động.