Python 中的字符串连接和逗号

新手上路,请多包涵

我很难弄清楚本机数据类型如何在 Python 中交互。在这里,我试图 将歌词 的不同部分连接成一个长字符串,该字符串将作为输出返回。

我在尝试运行脚本时收到的错误是:

TypeError:无法连接“str”和“tuple”对象。

我把所有不是字符串的东西都放在函数 str() 中,但显然有些东西仍然是“元组”(我以前从未使用过的数据类型)。

我怎样才能将其中的任何元组获取到一个字符串中,以便所有这些都顺利连接起来?

(PS:我使用了变量“Copy”,因为我不确定,当我递减另一个变量时,它是否会扰乱 for 循环结构。会吗?)

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

原文由 jkeys 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 473
2 个回答

Lyrics += 左侧的逗号分隔列表定义了一个“元组”。

您需要将“,”更改为“+”,因为字符串连接不采用逗号分隔的值列表。

另外,考虑建立一个字符串列表来连接,然后使用“join”方法。

原文由 Adam Vandenberg 发布,翻译遵循 CC BY-SA 4.0 许可协议

不要为此使用字符串连接。将字符串放入列表中,并在末尾加入列表。我还建议使用 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 bottles”在语法上是不正确的。您可能想要创建一个函数,它可以根据数字为您提供正确形式的“瓶子”。如果国际化是一个问题(我知道它可能不是)那么你也应该意识到 一些语言 有更多的形式而不仅仅是“单数”和“复数”。

原文由 Mark Byers 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题