TypeError: dize biçimlendirme python'u sırasında dönüştürülen tüm bağımsız değişkenler


192

Programın iki isim alması gerekiyor ve aynı uzunlukta iseler aynı kelime olup olmadıklarını kontrol etmelidirler. Aynı kelime ise "İsimler aynı" yazacaktır . Aynı uzunlukta ancak farklı harflerle "İsimler farklı ama aynı uzunlukta" yazdıracaktır . Sorun yaşadığım kısım alt 4 satırda.

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

Bu kodu çalıştırdığınızda 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 öneriniz çok takdir edilmektedir.

Yanıtlar:


210

Farklı format işlevlerini karıştırıyorsunuz.

Eski stil %biçimlendirmesinde biçimlendirme için %kodlar kullanılır:

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

Yeni stil {}biçimlendirmesinde {}kodlar ve .formatyöntem kullanılır

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

Eski stil biçimlendirmesiyle, bir demet kullanarak birden çok argüman belirtmeniz gerektiğini unutmayın:

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

Sizin durumunuzda, {}format belirteçlerini kullandığınız için şunu kullanın .format:

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

17
3.6 Python içinde:f"'It will cost ${your_variable} dollars."
JinSnow

51

Hata, dize biçimlendirmenizdedir.

'%' Operatörünü kullanarak geleneksel dize biçimlendirmesini kullanmanın doğru yolu printf tarzı bir biçim dizesi kullanmaktır (bunun için Python belgeleri: http://docs.python.org/2/library/string.html#format- string-syntax ) ile ilişkili olan kısmını dışarı aktarmak suretiyle yedek oluşturmanız gerekir :

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

Ancak, '%' operatörü muhtemelen gelecekte kullanımdan kaldırılacaktır . Yeni PEP 3101 işleri yapmanın yolu şöyledir:

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

9
scnr: "muhtemelen gelecekte kullanımdan kaldırılacak" şu ana kadar olmadı (Python 3.5). Eski '%' sözdizimi 3.1'de kullanımdan kaldırılmadı ve yalnızca 3.2 günlükleme modülünde yeni stille nasıl biçimlendirileceğini öğrendi{} . Ve aniden 3.5 PEP 461: %baytlar için biçimlendirme getiriyor . Bu, %kalıntıları uzun süre düşünmemi sağlıyor .
cfi

7
%daha özlü. Bizimle kalmasına sevindim.
Lenar Hoyt

3
Hemfikirim. % daha özlüdür ve kaldırılması dile hiçbir fayda sağlamaz.
chevydog

@LenarHoyt F telleri hakkında ne düşünüyorsunuz? Bunun "'%s' is longer than '%s'" % (name1, name2)daha özlü olduğunu düşünemiyorumf"'{name1}' is longer than '{name2}'"
Mark Moretto

44

Benim için, bu hata bir tuple dize biçimi yöntemine geçmeye çalışırken neden oldu.

Bu soru / cevaptan çözüm buldum

Bağlantıdan doğru cevabı kopyalayıp yapıştırma (İŞİM DEĞİL) :

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

İlgilenilen tekerleğin tek parçası olan bir tekli demet yapmak, yani (üçlü), buradaki anahtar bittir.


Aşağıdaki ifadelerden birini kullanarak tuple bir dizeye dönüştürmek istiyorum: print("this is a tuple: %s" % str(thetuple))veyaprint("this is a tuple: %s" % repr(thetuple))
AlexG


6

Diğer iki cevaba ek olarak, girintilerin son iki koşulda da yanlış olduğunu düşünüyorum. Koşullar, bir adın diğerinden daha uzun olması ve 'elif' ile başlaması ve girintisiz olması gerekir. İlk koşula koyarsanız (kenar boşluğundan dört girinti vererek), çelişkili olur çünkü adların 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))

3

Diğer cevapların birkaçında da belirtildiği gibi, sorunların bir kombinasyonu vardır.

  1. Nneonneo tarafından işaret edildiği gibi farklı Dize Biçimlendirme yöntemlerini karıştırıyorsunuz.
  2. GuyP tarafından işaret edildiği gibi, girintiniz de kapalı.

Ben hem .format örneğini sağladım hem de% s değişken belirtecine tuples geçiriyorum. Her iki durumda da girinti, uzunluk eşleştiğinde kontrollerin dışında olduğundan daha büyük / daha küçük olarak sabitlenmiştir. Ayrıca sonraki deyimleri elif 'e değiştirdiler, böylece yalnızca önceki aynı düzey deyimi Yanlışsa çalıştırılırlar.

.Format ile Dize Biçimlendirme

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 ve bir tuple ile Dize Biçimlendirme

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

2

Python 3.7 ve üzeri sürümlerde yeni ve kolay bir yol var. sözdizimi:

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

Çıktı:

Hello, Eric. You are 74.

1

Benim için, tek bir yazdırma çağrısında birçok değeri sakladığım için çözüm, verileri bir demet olarak saklamak ve ardından yazdırma işlevini çağırmak için ayrı bir değişken oluşturmaktı.

x = (f"{id}", f"{name}", f"{age}")
print(x) 

0

Ben de hatayla karşılaşıyorum,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Ancak liste argümanları iyi çalışıyor.

Mysqlclient python lib kullanıyorum. Lib, grup argümanlarını kabul etmemeye benziyor. Gibi liste argümanlar geçmek için ['arg1', 'arg2'] çalışacaktır.


0

görünümünde django ham sql sorgusu

"SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to)

models.py

class VehicleDamage(models.Model):
    requestdate = models.DateTimeField("requestdate")
    vendor_name = models.CharField("vendor_name", max_length=50)
    class Meta:
        managed=False

views.py

def location_damageReports(request):
    #static date for testing
    date_from = '2019-11-01'
    date_to = '2019-21-01'
    vehicle_damage_reports = VehicleDamage.objects.raw("SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to))
    damage_report = DashboardDamageReportSerializer(vehicle_damage_reports, many=True)
    data={"data": damage_report.data}
    return HttpResponse(json.dumps(data), content_type="application/json")

Not: python 3.5 ve django 1.11 kullanma

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.