简介
尽管在现实世界中,逆转字符串可能不是一件常见的事情,但在求职面试中,逆转字符串是一个相当常见的操作。特别是当你申请的工作所使用的编程语言没有内置反转字符串的方法时。通过要求你反转字符串,面试官可以对你分析问题和从头建立解决方案的方法有一个相当准确的印象。
另外,由于这个问题可能有很多解决方案,这是你大显身手的机会,展示你对不同算法之间不同执行速度的认识,从而创造出尽可能好的解决方案。
在这篇文章中,我们将看看如何在Python中反转一个字符串。我们将考虑几种可能的解决方案并对它们进行比较,这样你就可以选择最适合你需要的方案。
显然,面试并不是唯一一个你可能面临需要反转字符串的地方--例如,有一些正则表达式问题,在处理反转字符串时,解决起来要容易得多。
Python中的字符串
Python 中的字符串是一个不可改变的字节数组--更确切地说,是代表 Unicode 字符的字节序列。实际上,字符串在代码中被写成由一对引号(单引号或双引号)包围的字符序列,但它们在内部被存储为 Unicode 代码序列。
example_str = "Hello World!"
# The same as:
# example_str = 'Hello World!'
**注意:**在Python中用来处理字符串的实际对象被称为str 对象。它本质上代表了一个字符串数据类型。
在Python中,字符串的一个重要特征是它们是不可改变的,这意味着在它们被创建后不能被修改。修改一个字符串的唯一方法是创建它的修改后的副本,这使得对字符串的许多操作变得复杂。对于本文中我们特别感兴趣的一个操作--反转字符串的操作,也是如此。
在 Python 中反转一个字符串
现在我们已经涵盖了所有的基础知识,我们可以看看如何在Python中实际逆转一个字符串。正如我们之前所说,有几种方法可以做到这一点--在这篇文章中,我们将介绍一些最常用的方法。每种方法都有自己的长处和短处,有些更有效,但可读性较差。另一方面,有些确实具有可读性,易于理解,但代价是效率不高。
在下面的章节中,我们将对字符串"Hello World!" ,它应该被反转到"!dlroW olleH" 。
example_str = "Hello World!"
推荐的解决方案。使用切分符号
Python中字符串的另一个重要特性是它们是可分的。这意味着可以从原始字符串中提取出一个子串--Python 提供了一个非常直接的方法,使用切片操作符来实现。
**注意:**如果你想了解更多关于在Python中切分字符串的知识,你应该阅读这篇文章 "Python:字符串的切分符号"
Python 中的切片操作符有如下语法 -[start:end:step] 。它提取一个从start 开始到end 的子串。如果step 是一个正数,start 必须小于end ,因此切片操作符创建一个向前移动的子串。另一方面,如果step 是一个负数,那么子串将在原始字符串中向后创建。因此,如果你把step 设为-1 ,而把start 和end 留空,你将有效地反转一整个字符串。
example_str = "Hello World!"
reversed_str = example_str[::-1]
print(reversed_str)
我们已经在我们的example_str 上按照前面描述的方式使用了切片操作符,这将产生我们原始字符串的反转版本。
"!dlroW olleH"
这种在Python中反转字符串的方法被认为对大的输入字符串是最有效的,但这是以可读性差为代价的--特别是对那些不熟悉Python中的切片符号的人。为了改善这一点,我们可以将切分封装在一个函数中,这将增加最终代码的可读性。
def reverse_string(s):
return s[::-1]
稍后,我们会用这个函数代替普通的切片操作符来反转所需的字符串,得到的字符串将和之前一样--"!dlroW olleH" 。
reversed_str = reverse_string(example_str)
**建议。**将代码的每一节都用一个函数包裹起来通常是一个好的做法!除了提高代码的可读性之外,它实际上是一个很好的方法。除了提高代码的可读性外,它实际上有助于你创建更多的模块化和可重用的代码。因此,你可以按照本节所示的方式,将下面的每个代码片断包裹在函数中。
使用join()和reversed()
尽管切片在速度方面表现最好,但在可读性方面坚实的替代方法是结合两个内置的Python方法 -str.join() 和reversed() 。
首先,reversed() 为作为其参数传递的字符串返回一个反向的迭代器。这使我们能够向后翻阅原始字符串,并使用str.join() 函数将其字符追加到空字符串中。
example_str = "Hello World!"
reversed_str = ''.join(reversed(example_str))
print(reversed_str)
这将创建一个原始字符串的反转副本。
"!dlroW olleH"
**注:**如果你不熟悉Python中迭代器的概念--你应该阅读 "Python 迭代器简介"
使用for循环
在Python中,循环也可以用来反转一个字符串--我们要考虑的第一个循环是for 。我们可以用它来对原始字符串进行双向迭代--向前和向后。由于我们想反转一个字符串,首先想到的是在字符串上从头到尾进行迭代,并将每个字符附加到新的字符串中。为了这个目的,我们将使用reversed() 函数。
example_str = "Hello World!"
reversed_str = ""
for i in reversed(example_str):
reversed_str += i
print(reversed_str)
我们在原始字符串上向后迭代,并将每个字符追加到resulting_str ,它将在最后存储反转版本的example_str 。
"!dlroW olleH"
**注意:**注意我们是如何将每个字符添加到反转的字符串中的,但是 Python 中的字符串是不可变的。我们可以这样做,因为Python,从本质上讲,在我们每次向字符串追加一个字符时,都会创建一个修改过的字符串副本,然后将结果固化为一个不可变的字符串并返回它。
另一种方法是在原始字符串上向前迭代,从开始到结束,并在循环本身中创建原始字符串的反转版本。
example_str = "Hello World!"
reversed_str = ""
for i in example_str:
reversed_str = i + reversed_str
print(reversed_str)
这将给我们带来与在循环中使用反转迭代器相同的结果。
使用while循环
另一个我们可以用来反转字符串的循环是while 循环。这种方法比其他方法要复杂一些,但可以让你对反转字符串在较低层次上的工作方式有一个很好的了解。
example_str = "Hello World!"
reversed_str = ""
i = len(example_str) - 1
while i >= 0:
reversed_str += example_str[i]
i -= 1
print(reversed_str)
这将导致。
"!dlroW olleH"
结论
正如我们在这篇文章中所看到的,有很多关于如何在Python中反转字符串的方法,每一种都有其优点和缺点。一般来说,你应该在最多的时候选择的方法是切片操作符--它是最有效和最Pythonic的方法来反转字符串。其他方法的效率较低,因此,如果执行速度在你的代码中是至关重要的,那么在使用它们之前请三思。