Python中的字符串连接

Python中的字符串连接,python,string,tuples,Python,String,Tuples,是的,我知道这个小问题很难解决,但我正在尝试Python,我想它会很简单。我很难弄清楚本机数据类型在Python中是如何交互的。在这里,我试图将的不同部分连接到一个长字符串中,该字符串将作为输出返回 我在尝试运行脚本时收到的错误是TypeError:无法连接'str'和'tuple'对象。我把所有不是字符串的东西都放在str函数中,但显然有些东西仍然是元组,这是我以前从未使用过的数据类型 有人能告诉我如何将其中的元组转换成字符串,这样所有的元组都能顺利连接起来吗 另外,我使用变量Copy是因为我

是的,我知道这个小问题很难解决,但我正在尝试Python,我想它会很简单。我很难弄清楚本机数据类型在Python中是如何交互的。在这里,我试图将的不同部分连接到一个长字符串中,该字符串将作为输出返回

我在尝试运行脚本时收到的错误是TypeError:无法连接'str'和'tuple'对象。我把所有不是字符串的东西都放在str函数中,但显然有些东西仍然是元组,这是我以前从未使用过的数据类型

有人能告诉我如何将其中的元组转换成字符串,这样所有的元组都能顺利连接起来吗

另外,我使用变量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)

歌词+=左侧以逗号分隔的列表正在定义元组

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


也可以考虑使用连接方法建立一个字符串列表来连接。

< p>逗号分隔列表到歌词+=的左边定义一个元组。
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"
您需要将字符串连接更改为+,因为字符串连接不采用逗号分隔的值列表

也可以考虑使用连接方法建立一个字符串列表。

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"
问题是+=是元组之后的所有内容。将所有逗号改为加号,并将第一瓶啤酒转换为字符串

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'>
变量名应该以小写字母开头,否则很容易与类名混淆。理想情况下,您应该遵循并使用小写字母,单词之间用下划线分隔

您不需要Copy变量,因为瓶装啤酒的副本将被传递给range。与BlottleSofBeer=numOfBlottleSofBeer的情况相同,您可以在整个函数中使用和修改numOfBlottleSofBeer

由于您有一个默认参数numOfBlottleSofBeer=99,因此在调用BlottleSofBeerLycs时不需要通过99

问题是+=是元组之后的所有内容。将所有逗号改为加号,并将第一瓶啤酒转换为字符串

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'>
变量名应该以小写字母开头,否则很容易与类名混淆。理想情况下,您应该遵循并使用小写字母,单词之间用下划线分隔

您不需要Copy变量,因为瓶装啤酒的副本将被传递给range。与BlottleSofBeer=numOfBlottleSofBeer的情况相同,您可以在整个函数中使用和修改numOfBlottleSofBeer


因为您有一个默认参数NUMOFBillatesOfBeer=99,所以在调用BottlesOfBeerLycs时不需要通过99。

不要为此使用字符串连接。将字符串放入列表中,并在末尾加入列表。我还建议使用str.format

还可以使用生成器表达式更直接地获得结果:

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

作为最后一点,你应该注意1瓶在语法上是不正确的。您可能希望创建一个函数,根据编号为您提供正确的瓶子形式。如果国际化是一个问题,我知道它可能不是,那么您还应该注意,它的形式不仅仅是单数和复数。

不要使用字符串连接。将字符串放入列表中,并在末尾加入列表。我还建议使用str.format

还可以使用生成器表达式更直接地获得结果:

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

作为最后一点,你应该注意1瓶在语法上是不正确的。您可能希望创建一个函数,根据编号为您提供正确的瓶子形式。如果国际化是一个问题,我知道它可能不是,那么您还应该注意,它的形式不仅仅是单数和复数。

逗号运算符创建元组。歌词+=。。。正在右侧创建一个元组

要在Python中连接字符串,请使用+运算符

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

然而,这仍然不是这种事情的首选方法,但是对于学习字符串连接来说很好。

逗号操作符创建元组。歌词+=。。。正在右侧创建一个元组

要在Python中连接字符串,请使用+运算符

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

然而,这仍然不是这种事情的首选方法,但是对于学习字符串连接来说是很好的。

看起来您已经解决了最初的问题,现在正在询问使用join-是的,这通常比使用+=进行字符串连接更好,尽管并不总是更快

但更好的办法是甚至不这样做,或者尽可能少地这样做。派克 thon有一种叫做格式字符串的东西,它类似于C的printf函数所使用的格式字符串——请参阅在线文档。将其与format string方法和其他一些pythonism一起使用可以真正简化事情:

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.

看起来您已经解决了最初的问题,现在正在询问使用join-是的,这通常比使用+=进行字符串连接要好,尽管并不总是更快

但更好的办法是甚至不这样做,或者尽可能少地这样做。Python有一种称为格式字符串的东西,类似于C的printf函数所使用的格式字符串——请参见在线文档。将其与format string方法和其他一些pythonism一起使用可以真正简化事情:

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.


完美的此外,我忘了将第一瓶啤酒放入str函数。这两个变化都解决了这个问题。谢谢你!但是你能告诉我为什么将它构建到一个列表中并使用.joinLyps是一个更好的解决方案吗?字符串是不可变的。连接它们会为每个+运算符创建一个新字符串并将其他Sting复制到其中。放入列表并联接只会创建每个字符串一次,最后创建一个字符串副本。“这样速度就更快了。”基思·洛尔回忆起我近十年前提出的问题。从那以后我学到了很多,尽管我不确定自己是否是一个更好的程序员。只是我的球门柱发生了重大变化…:完美!此外,我忘了将第一瓶啤酒放入str函数。这两个变化都解决了这个问题。谢谢你!但是你能告诉我为什么将它构建到一个列表中并使用.joinLyps是一个更好的解决方案吗?字符串是不可变的。连接它们会为每个+运算符创建一个新字符串并将其他Sting复制到其中。放入列表并联接只会创建每个字符串一次,最后创建一个字符串副本。“这样速度就更快了。”基思·洛尔回忆起我近十年前提出的问题。从那以后我学到了很多,尽管我不确定自己是否是一个更好的程序员。只是我的球门柱发生了重大变化…:DWhy使用连接函数是一种更好的方法吗?字符串连接天生就比较慢吗?在一些Python实现中比较慢;在cPython,它不会慢很多。之所以这样做,是因为我相信它现在是一个python习语,最初是因为性能。@Hooked:它还意味着没有在最后一行之后添加分隔符的特殊情况。str.join已经为您处理了这个问题。为什么使用join函数是一种更好的方法?字符串连接天生就比较慢吗?在一些Python实现中比较慢;在cPython,它不会慢很多。之所以这样做,是因为我相信它现在是一个python习语,最初是因为性能。@Hooked:它还意味着没有在最后一行之后添加分隔符的特殊情况。str.join已为您处理此问题。数字也是不可变的对象,并且是隐式复制的。因此,您不需要复制变量。RE:trunt 2,使用歌词。append。。。现在您也可以删除字符串中的所有\n,并在结尾使用\n.joinLyms。但我仍然会使用+运算符并一次附加整个内容?此外,该解决方案是否会忽略两行之间的换行符,或者“\”运算符是否会使append方法像有两个方法调用一样工作?p.数字也是不可变的对象,并隐式复制。因此,您不需要复制变量。RE:trunt 2,使用歌词。append。。。现在您也可以删除字符串中的所有\n,并在结尾使用\n.joinLyms。但我仍然会使用+运算符并一次附加整个内容?另外,该解决方案是否会忽略两行之间的换行符,或者“\”运算符是否会使append方法像有两个方法调用一样工作?