字符串反转,这个大家平常应该时长碰到,特别是面试时,通常还有一些变种,如:判断回文。
这里列举python中的三种实现方式(切片,反向迭代,经典就地反转算法),小说一把字符串反转。
经典算法
对于从其他语言转向python的小伙伴们,最直接的实现很大概率会是这样的
def reverse_string_classic(src):
"""
字符串反转,经典算法
:param src: 源字符串
:return: 反转后字符串
"""
chars = list(src)
for i in range(len(src) // 2):
tmp = chars[i]
chars[i] = chars[len(src) - i - 1]
chars[len(src) - i - 1] = tmp
return ''.join(chars)
熟悉的c/c++的味道,没有任何python的美感,但就是这么直接了当,不伤脑
切片
了解和熟悉python切片操作的同学,应该会这么做了
def reverse_string_slicing(src):
"""
字符串反转,切片实现
:param src: 源字符串
:return: 反转后字符串
"""
return src[::-1]
就是这么pythonic,但不熟悉的小伙伴就是一脸懵逼,这个伤脑
反向迭代
熟悉和了解python的iterator的小伙伴还有这种实现方式
def reverse_string_iterate(src):
"""
字符串反转,反向迭代实现
:param src: 源字符串
:return: 反转后字符串
"""
return "".join(reversed(src))
这看着也很pythonic,感觉无理解成本
性能PK
简单的对这三种方式做个性能测试
从测试结果可见:
三种方式存在很大的差距,切片方式最快,反向迭代的方式比切片慢了近7倍,而经典方式比切片慢了近50倍
简单总结:
1. 经典方式,直接放弃吧,unpythonic,效率还差
2. 如果单从效率上看,切片方式是最佳选择,但可读性差,理解成本高
3. 迭代切片方式性能还凑合,可读性好,在性能要求不高或是没有这么密集反转操作时,可以选择