Конкатенация строк в Python - PullRequest
       7

Конкатенация строк в Python

1 голос
/ 27 декабря 2010

Да, я знаю, что эта маленькая проблема довольно слабая, но я пробую Python и решил, что это будет довольно просто.Мне трудно понять, как нативные типы данных взаимодействуют в Python.Здесь я пытаюсь объединить различные части текста в одну длинную строку, которая будет возвращена в качестве вывода.

Ошибка, которую я получаю при попытке запустить скрипт: «Ошибка типа: невозможно объединить объекты str и tuple».Я поместил все, что не было строкой, в функцию str (), но, очевидно, что-то все еще является «кортежем» (тип данных, который я никогда раньше не использовал).

Может кто-нибудь сказать мне, как получитькакой там кортеж находится в строке, так что все будет плавно соединяться?

(PS Я использовал переменную «Копировать», потому что я не был уверен, если при уменьшении другой переменной она будет связываться сfor loop construct. Не так ли?)

#99 bottles of beer on the wall lyrics

def BottlesOfBeerLyrics(NumOfBottlesOfBeer = 99):
        BottlesOfBeer = NumOfBottlesOfBeer
        Copy = BottlesOfBeer
        Lyrics = ''

        for i in range(Copy):
                Lyrics += BottlesOfBeer, " bottles of beer on the wall, ", str(BottlesOfBeer), " bottles of beer. \n", \
                "Take one down and pass it around, ", str(BottlesOfBeer - 1), " bottles of beer on the wall. \n"

                if (BottlesOfBeer > 1):
                        Lyrics += "\n"

                BottlesOfBeer -= 1

        return Lyrics

print BottlesOfBeerLyrics(99)

Некоторые люди предлагали создать список и присоединиться к нему.Я немного отредактировал это, как я думаю, то, что вы, ребята, имели в виду, но не могли бы вы сказать мне, если это предпочтительный метод?

#99 bottles of beer on the wall lyrics - list method

def BottlesOfBeerLyrics(NumOfBottlesOfBeer = 99):
        BottlesOfBeer = NumOfBottlesOfBeer
        Copy = BottlesOfBeer
        Lyrics = []

        for i in range(Copy):
                Lyrics += str(BottlesOfBeer) + " bottles of beer on the wall, " + str(BottlesOfBeer) + " bottles of beer. \n" + \
                "Take one down and pass it around, " + str(BottlesOfBeer - 1) + " bottles of beer on the wall. \n"

                if (BottlesOfBeer > 1):
                        Lyrics += "\n"

                BottlesOfBeer -= 1

        return "".join(Lyrics)

print BottlesOfBeerLyrics(99)

Ответы [ 5 ]

5 голосов
/ 27 декабря 2010

Не используйте конкатенацию строк для этого. Поместите строки в список и присоединитесь к списку в конце. Я бы также предложил использовать str.format.

verse = "{0} bottles of beer on the wall, {0} bottles of beer.\n" \
        "Take one down and pass it around, {1} bottles of beer on the wall.\n"

def bottles_of_beer_lyrics(bottles=99):
    lyrics = []
    for x in range(bottles, 0, -1):
        lyrics.append(verse.format(x, x-1))
    return '\n'.join(lyrics)

Вы также можете получить результат более напрямую, используя выражение генератора:

def bottles_of_beer_lyrics(bottles=99):
    return '\n'.join(verse.format(x, x-1) for x in range(bottles, 0, -1))

В качестве конечного пункта вы должны отметить, что «1 бутылка» не является грамматически правильной. Возможно, вы захотите создать функцию, которая может дать вам правильную форму «бутылки» в зависимости от количества. Если интернационализация является проблемой (я знаю, что, вероятно, это не так), то вам также следует знать, что некоторые языки имеют больше форм, чем просто "единственное число" и "множественное число".

4 голосов
/ 27 декабря 2010

Разделенный запятыми список слева от Lyrics += определяет «кортеж».

Вы захотите изменить "," на "+", поскольку конкатенация строк не принимает список значений, разделенных запятыми.

Также рассмотрите возможность создания списка строкзатем объединить, используя метод "join".

3 голосов
/ 27 декабря 2010

Оператор запятой создает кортеж.Строка "Lyrics + = ..." создает кортеж с правой стороны.

Чтобы объединить строки в Python, используйте оператор "+".

Lyrics += str(BottlesOfBeer) + " bottles of beer..." + ...

Тем не менее, этот способ все еще не является предпочтительным для такого рода вещей, но подходит для изучения объединения строк.

2 голосов
/ 27 декабря 2010

Похоже, вы устранили исходную проблему и теперь спрашиваете об использовании join() - да, как правило, это лучше, чем использование += для конкатенации строк (хотя и не всегда быстрее).

Но даже лучше - даже не делать этого или делать как можно меньше. В Python есть нечто, называемое форматными строками, которые похожи на те, которые используются функцией C printf() - см. Синтаксис форматных строк в онлайн-документации. Использование этого вместе со строковым методом format() (и некоторыми другими Pythonisms) может действительно упростить вещи:

def BottlesOfBeerLyrics(NumOfBottlesOfBeer=99):
    PluralSuffix = lambda n: "s" if n != 1 else ""
    Stanza = "\n".join([
        "{0} bottle{1} of beer on the wall, {0} bottle{1} of beer.",
        "Take one down and pass it around, {2} bottle{3} of beer on the wall.",
        "\n"])
    Lyrics = ""
    for Bottles in range(NumOfBottlesOfBeer, 0, -1):
        Lyrics += Stanza.format(Bottles, PluralSuffix(Bottles),
                                Bottles-1, PluralSuffix(Bottles-1))
    return Lyrics

print BottlesOfBeerLyrics(3)
# 3 bottles of beer on the wall, 3 bottles of beer.
# Take one down and pass it around, 2 bottles of beer on the wall.
#
# 2 bottles of beer on the wall, 2 bottles of beer.
# Take one down and pass it around, 1 bottle of beer on the wall.
#
# 1 bottle of beer on the wall, 1 bottle of beer.
# Take one down and pass it around, 0 bottles of beer on the wall.
0 голосов
/ 27 декабря 2010
Lyrics += BottlesOfBeer, " bottles of beer on the wall, ", str(BottlesOfBeer), " bottles of beer. \n", \
                "Take one down and pass it around, ", str(BottlesOfBeer - 1), " bottles of beer on the wall. \n"

Проблема в том, что после += есть tuple. Измените все запятые на плюсы и приведите первый BottlesOfBeer к строке.

Lyrics += str(BottlesOfBeer) + " bottles of beer on the wall, " + str(BottlesOfBeer) + " bottles of beer. \n" + \
                "Take one down and pass it around, " + str(BottlesOfBeer - 1) + " bottles of beer on the wall. \n"

Короткая демонстрация:

>>> a = 'hello', 'world'
>>> b = 'hello' + 'world'
>>> type(a)
<type 'tuple'>
>>> type(b)
<type 'str'>

Лучшим способом форматирования строки будет использование форматирования строк:

Lyrics += '%(orig)d bottles of beer on the wall, %(orig)d bottles of beer.\n' \
        'Take one down and pass it around, %(now)d bottles of beer on the wall.\n' % \
        { 'orig': BottlesOfBeer, 'now': BottlesOfBeer-1 }

Ваши имена переменных должны начинаться со строчной буквы, иначе их легко спутать с именами классов. В идеале, однако, вы должны следовать pep 8 и использовать строчные буквы со словами, разделенными подчеркиванием.

Вам не нужна переменная Copy, так как копия BottlesOfBeer будет передана в range(). Та же история с BottlesOfBeer = NumOfBottlesOfBeer, вы можете использовать и изменять NumOfBottlesOfBeer во всей функции.

Поскольку у вас есть аргумент по умолчанию NumOfBottlesOfBeer = 99, вам не нужно передавать 99 при вызове BottlesOfBeerLyrics.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...