在Python中,字符串是一个Unicode字符序列。Python没有内置(built-in)函数或者方法用于字符串逆序处理。有以下几种能够实现字符串的方法。
Python中的string slicing的语法如下:
string[start:stop:step]
省略start和stop的设置,step置为’-1’的话就可以得到原字符串的一个逆序的副本。
内置的函数reversed()对字符串进行逆序处理,但是它不是直接返回原字符串的逆序副本,而是生成一个iterator。可以用”join()”操作符对这个iterator作进一步的处理以生成字符串逆序副本。
Python中的List有reverse() method,所以可以按以下步骤实现字符串逆序:
最后还有一种超级费力的方式,就是用递归函数调用的方式(只有秀编程技巧的价值)。定义一个函数,每次调用将首字符挪到字符串尾部,直到整个字符串顺序完全颠倒为止
参见以下代码示例:
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 19 13:19:27 2021
@author: chenxy
"""
import timeit
from statistics import mean
def rev_str_thru_slicing(aStr):
return aStr[::-1]
def rev_str_thru_join_revd(aStr):
return "".join(reversed(aStr))
def rev_str_thru_list_reverse(aStr):
lst = list(aStr)
lst.reverse()
return(''.join(lst))
def rev_str_thru_recursion(aStr):
if len(aStr) == 0:
return aStr
else:
return rev_str_thru_recursion(aStr[1:]) + aStr[0]
if __name__ == '__main__':
#1. Decreasing slicing
print('Decreasing slicing: ','HelloPython'[::-1])
#2. User-defined function based on decreasing slicing
myStr = "HelloPython"
print('User-defined function based on: ',rev_str_thru_slicing(myStr))
#3. Using reversed() function
print('Using reversed() function: ',rev_str_thru_join_revd(myStr))
#4. Using list reverse() method
print('Using list reverse() method: ',rev_str_thru_list_reverse(myStr))
#4. Using recursive function
print('Using recursive function: ',rev_str_thru_recursion(myStr))
最后,基于python的timeit模块对以上几种字符串逆序处理方法进行一个统计平均性能对比。Timeit的repeat选项用于对代码进行重复执行,然后可以对运行所耗费的时间进行统计平均以得到平均执行时间。Repeat的单位是1百万次,即repeat设为1时待评估的对象代码会被重复执行1百万次。
# Performance comparison
s = myStr * 10
repeatCount = 10
SLICING_PERF = timeit.repeat(lambda: rev_str_thru_slicing(s), repeat=repeatCount)
print(min(SLICING_PERF), mean(SLICING_PERF), max(SLICING_PERF), SLICING_PERF)
J_R_PERF = timeit.repeat(lambda: rev_str_thru_join_revd(s), repeat=repeatCount)
print(min(J_R_PERF), mean(J_R_PERF), max(J_R_PERF), J_R_PERF)
LIST_PERF = timeit.repeat(lambda: rev_str_thru_list_reverse(s), repeat=repeatCount)
print(min(LIST_PERF), mean(LIST_PERF), max(LIST_PERF), LIST_PERF)
RECUR_PERF = timeit.repeat(lambda: rev_str_thru_recursion(s), repeat=repeatCount)
print(min(RECUR_PERF), mean(RECUR_PERF), max(RECUR_PERF), RECUR_PERF)
ratio0 = mean(SLICING_PERF)/mean(SLICING_PERF)
ratio1 = mean(J_R_PERF)/mean(SLICING_PERF)
ratio2 = mean(LIST_PERF)/mean(SLICING_PERF)
ratio3 = mean(RECUR_PERF)/mean(SLICING_PERF)
print('SLICING_PERF:J_R_PERF:LIST_PERF:RECUR_PERF = {0}:{1}:{2}:{3}'.format(ratio0,ratio1,ratio2,ratio3))
运行结果:
SLICING_PERF:J_R_PERF:LIST_PERF:RECUR_PERF = 1.0:7.45:6.18:97.43
不出意外,用decreasing slicing的方式最快。而递归实现方式则满了接近两个数量级!