2013-08-05 20 views
105

Programın iki ad alması gerekiyordu ve aynı uzunluktalarsa aynı sözcük olup olmadıklarını da kontrol etmeliler. Eğer aynı kelime ise yazacaktır "isimler aynı". Aynı uzunluktaysa ancak farklı harflerle yazılırsa "Adlar farklı ancak aynı uzunluktadır". Bir sorun yaşadığım bölüm, alt 4 satırda. Bu kodu çalıştırdığınızdaTypeError: dize biçimlendirmesi sırasında dönüştürülen tüm bağımsız değişkenler 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) 

o görüntüler:

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 

Herhangi bir öneri çok takdir edilmektedir.

cevap

132

Farklı biçim işlevlerini karıştırıyorsunuz.

eski tarz % biçimlendirme biçimlendirme için % kodlarını kullanır:

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

{} formatlama {} kodlarını kullanan yeni tarzı ve .format yöntem

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

Not o eski tarz biçimlendirme ile tuple:

kullanarak birden çok bağımsız değişken belirtmeniz gerekir. Senin durumunda
'%d days and %d nights' % (40, 40) 

, sen {} biçim belirteçleri kullanıyorsanız beri, .format kullanın:

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

3.6: 'f" '$ {your_variable} dolara mal olacaktır. "' – JinSnow

27

hata dize biçimlendirme içindedir. Ancak '%'

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

:

doğru yolu (: http://docs.python.org/2/library/string.html#format-string-syntax bu burada Python belgelerine) printf tarzı biçim dizesi kullanmak '%' operatörünü kullanılarak biçimlendirme geleneksel dize kullanmak operatör will probably be deprecated in the future. şeyleri yapmanın yeni PEP 3101 yolu şu şekildedir: Diğer iki cevapları ek olarak

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

scnr: "muhtemelen gelecekte kullanımdan kaldırılacak" (Python 3.5). Eski '%' sözdizimi [3.1] 'de (https://docs.python.org/3.1/whatsnew/3.1.html) ve sadece 3.2'de [kayıt modülünün yeni stil ile nasıl biçimlendirileceğini öğrendi [{ } '] (https://docs.python.org/3.2/whatsnew/3.2.html#logging). Ve aniden 3.5 [PEP 461: '%' byte için biçimlendirme] getiriyor (https://docs.python.org/3.5/whatsnew/3.5.html#pep-461-formatting-support-for-bytes-and-bytearray) . Bu bana '% 'nin gelmesinin uzun bir süre olduğunu düşünmemi sağlıyor. – cfi

+5

'%' daha özlü. Sevindim, bizimle kalıyor. –

+1

Ben concur. % daha özlü ve kaldırılması dile hiçbir yararı olmaz. – chevydog

2

, ben çentikler de son iki koşullarda yanlış olduğunu düşünüyorum. Koşullar, bir ismin diğerinden daha uzun olması ve “elif” ile başlaması ve girintiler içermemesidir. Eğer ilk koşula koyarsanız (marjdan dört tane girinti vererek), çelişkili olur, çünkü isimlerin uzunlukları aynı anda eşit ve farklı olamaz.

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

Benim için, Bu hata, bir dize biçiminde bir tuple geçirmeyi denediğimde kaynaklanmıştı.

I found the solution from this question/answer

Kopyalama ve bağlantıdan doğru cevabı (NOT MY İŞİ) yapıştırarak: Benim durumumda

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

Bu genellikle sorunun sebebidir! –

+0

Aşağıdaki ifadelerden birini kullanarak parçayı bir dizeye dönüştürmeyi tercih ederim: 'print (" bu bir tuple:% s "% str (thetuple))' veya 'print (" bu bir tuple'dır:% s "% repr (thetuple)) – AlexG

1

Ben sadece tek %s gerektiğinden, bu i var eksik değerler girişi. Ben de hata karşılaşırsanız

+0

aynı sorun burada – Taylor

0

,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Ama liste args iyi çalışmaz.

Ben mysqlclient python lib kullanırım. Lib, tuple args'i kabul etmemeye benziyor. ['arg1', 'arg2'] gibi liste geçişlerini geçmek için çalışır. Python'da

İlgili konular