def reverse_a_string_slowly(a_string):
new_string = ''
index = len(a_string)
while index:
index -= 1 # index = index - 1
new_string += a_string[index] # new_string = new_string + character
return new_string
这在理论上是不好的,因为,请记住, strings are immutable - 所以每次看起来你在你的 new_string 上附加一个字符时,理论上每次都会创建一个新的字符串!但是,CPython知道如何在某些情况下优化它,其中这个简单的案例就是一个 .
最佳实践
从理论上讲,更好的方法是在列表中收集子字符串,然后再加入它们:
def reverse_a_string_more_slowly(a_string):
new_strings = []
index = len(a_string)
while index:
index -= 1
new_strings.append(a_string[index])
return ''.join(new_strings)
21 回答
这通过循环遍历字符串并以相反的顺序将其值分配给另一个字符串来工作 .
这是一个没有
[::-1]
或reversed
(用于学习目的):您可以使用
+=
连接字符串,但join()
更快 .递归方法:
例:
怎么样:
这是extended slice语法 . 它的工作原理是
[begin:end:step]
- 通过离开开始和结束并指定步长为-1,它会反转一个字符串 .@ Paolo的
s[::-1]
是最快的;一种较慢的方法(可能更具可读性,但这是有争议的)是''.join(reversed(s))
.我对这个问题的经验是学术性的 . 但是,如果您是专业人士正在寻找快速答案,请使用步骤为
-1
的切片:或更可读(但由于方法名称查找速度较慢,并且在给定迭代器时连接形成列表的事实),
str.join
:或者为了可读性和可重用性,将切片放在一个函数中
然后:
更长的解释
如果您对学术博览会感兴趣,请继续阅读 .
这里有一些你应该知道的Python字符串:
在Python中, strings are immutable . 更改字符串不会修改字符串 . 它创造了一个新的 .
字符串是可切片的 . 切片字符串会以给定的增量从字符串中的一个点(向后或向前)向另一个点提供一个新字符串 . 它们在下标中采用切片表示法或切片对象:
下标通过在大括号中包含冒号来创建切片:
要在大括号外创建切片,您需要创建切片对象:
一种可读的方法:
虽然
''.join(reversed('foo'))
是可读的,但它需要在另一个被调用函数上调用字符串方法str.join
,这可能相当慢 . 让's put this in a function - we'回到它:最高效的方法:
使用反向切片要快得多:
但是,对于不太熟悉切片或原作者意图的人,我们怎样才能使其更具可读性和易懂性?让我们在下标表示法之外创建一个切片对象,给它一个描述性名称,并将其传递给下标符号 .
实现为功能
要将其实际实现为一个函数,我认为它在语义上足够清晰,只需使用描述性名称:
用法很简单:
老师可能想要的东西:
如果你有一个教师,他们可能希望你从空字符串开始,并从旧字符串中构建一个新字符串 . 您可以使用while循环使用纯语法和文字来执行此操作:
这在理论上是不好的,因为,请记住, strings are immutable - 所以每次看起来你在你的
new_string
上附加一个字符时,理论上每次都会创建一个新的字符串!但是,CPython知道如何在某些情况下优化它,其中这个简单的案例就是一个 .最佳实践
从理论上讲,更好的方法是在列表中收集子字符串,然后再加入它们:
但是,正如我们将在下面的CPython时序中看到的,这实际上需要更长的时间,因为CPython可以优化字符串连接 .
时间
以下是时间安排:
CPython优化字符串连接,而其他实现may not:
快速回答(TL; DR)
示例
详细解答
背景
提供此答案是为了解决@odigity的以下问题:
问题
Context
Python 2.x.
Python 3.x
Scenario:
Developer想要转换字符串
转换是颠倒所有字符的顺序
解决方案
陷阱
开发人员可能会期待像
string.reverse()
这样的东西本地惯用语(又名“pythonic”)解决方案对于较新的开发人员可能无法读取
开发人员可能想要实施他或她自己的
string.reverse()
版本以避免切片表示法 .切片表示法的输出在某些情况下可能违反直觉:
参见例如example02
print 'coup_ate_grouping'[-4:] ## => 'ping'
相比
print 'coup_ate_grouping'[-4:-1] ## => 'pin'
相比
print 'coup_ate_grouping'[-1] ## => 'g'
[-1]
索引的不同结果可能会让一些开发人员失望理由
Python有一个特殊情况需要注意:字符串是iterable类型 .
排除
string.reverse()
方法的一个基本原理是让python开发人员有动力利用这种特殊情况的力量 .简而言之,这仅仅意味着字符串中的每个单独字符都可以作为元素顺序排列的一部分轻松操作,就像其他编程语言中的数组一样 .
要了解其工作原理,查看example02可以提供良好的概述 .
例02
结论
与理解切片符号在python中如何工作相关的cognitive load对于那些不希望花费太多时间学习语言的采用者和开发者来说确实太过分了 .
然而,一旦理解了基本原理,这种方法相对于固定字符串操作方法的能力就会非常有利 .
对于那些不这么认为的人,有其他方法,例如lambda函数,迭代器或简单的一次性函数声明 .
如果需要,开发人员可以实现自己的string.reverse()方法,但是理解python这方面的基本原理是很好的 .
另见
alternate simple approach
alternate simple approach
alternate explanation of slice notation
看待它的一个较小的令人困惑的方式是:
英文[-1 :: - 1]读作:
使用切片表示法
使用reverse()函数
使用递归
在不使用reverse()或[:: - 1]的情况下在python中反转字符串
这也是一个有趣的方式:
或类似的:
使用支持.reverse()的byterarray的另一种“异国情调”方式
将产生:
这是一个不花哨的:
所有上述解决方案都是完美的,但是如果我们试图在python中使用for循环来反转字符串会变得有点棘手,所以这就是我们如何使用for循环反转字符串
我希望这个对某人有帮助 .
这是我的风格:
这里很简单:
打印“loremipsum”[ - 1 :: - 1]
和一些逻辑上:
输出:
muspimerol
这是简单而有意义的反向功能,易于理解和编码
s ='Hello world'
S [:: - 1]
在上面的示例中,标签s或变量s是包含Hello世界字符串的保持字符串,在第二步中,通过以反向步骤顺序从-1开始,以-1开始打印Hello世界字符串的反向 .
当然,在Python中你可以做很花哨的1行东西 . :)
这是一个简单,全面的解决方案,可以在任何编程语言中使用 .
OUTPUT :
您可以使用带有列表复合的反转功能 . 但是我不明白为什么这个方法在python 3中被淘汰了,这是不必要的 .