快速回答(tl;dr)
例子
### example01 -------------------
mystring = 'coup_ate_grouping'
backwards = mystring[::-1]
print backwards
### ... or even ...
mystring = 'coup_ate_grouping'[::-1]
print mystring
### result01 -------------------
'''
gnipuorg_eta_puoc
'''
详细答案
背景
提供此答案是为了解决@odigty提出的以下问题:
真的。起初我对保罗提出的解决方案感到震惊,但是
坐在后座上看第一本书时我感到很害怕
点评:“那是非常蟒蛇。干得好!”我很不安
一个聪明的群体认为用这种神秘的方法
基本的是个好主意。为什么不只是s.reverse()?
问题
-
语境
-
脚本:
-
开发人员希望转换字符串
-
转换是将所有字符的顺序颠倒
解决方案
陷阱
-
开发人员可能希望
string.reverse()
-
土生土长的成语
pythonic
)解决方案可能对新开发人员不可读
-
开发人员可能会尝试实现自己的版本
string.reverse()
以避免切片符号。
-
在某些情况下,切片表示法的输出可能与直觉相反:
-
参见示例02
-
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开发人员有动力利用这种特殊情况的能力。
简而言之,这仅仅意味着字符串中的每个字符都可以作为元素顺序排列的一部分轻松操作,就像其他编程语言中的数组一样。
为了理解这是如何工作的,回顾example2可以提供一个很好的概述。
例02
### example02 -------------------
## start (with positive integers)
print 'coup_ate_grouping'[0] ## => 'c'
print 'coup_ate_grouping'[1] ## => 'o'
print 'coup_ate_grouping'[2] ## => 'u'
## start (with negative integers)
print 'coup_ate_grouping'[-1] ## => 'g'
print 'coup_ate_grouping'[-2] ## => 'n'
print 'coup_ate_grouping'[-3] ## => 'i'
## start:end
print 'coup_ate_grouping'[0:4] ## => 'coup'
print 'coup_ate_grouping'[4:8] ## => '_ate'
print 'coup_ate_grouping'[8:12] ## => '_gro'
## start:end
print 'coup_ate_grouping'[-4:] ## => 'ping' (counter-intuitive)
print 'coup_ate_grouping'[-4:-1] ## => 'pin'
print 'coup_ate_grouping'[-4:-2] ## => 'pi'
print 'coup_ate_grouping'[-4:-3] ## => 'p'
print 'coup_ate_grouping'[-4:-4] ## => ''
print 'coup_ate_grouping'[0:-1] ## => 'coup_ate_groupin'
print 'coup_ate_grouping'[0:] ## => 'coup_ate_grouping' (counter-intuitive)
## start:end:step (or start:end:stride)
print 'coup_ate_grouping'[-1::1] ## => 'g'
print 'coup_ate_grouping'[-1::-1] ## => 'gnipuorg_eta_puoc'
## combinations
print 'coup_ate_grouping'[-1::-1][-4:] ## => 'puoc'
结论
这个
cognitive load
对于一些不想花太多时间学习这种语言的采用者和开发人员来说,理解切片表示法在python中的工作原理可能确实是太多了。
然而,一旦理解了基本原理,这种方法相对于固定字符串操作方法的威力就相当大了。
对于那些不这么认为的人,有其他方法,比如lambda函数、迭代器或简单的一次性函数声明。
如果需要的话,开发人员可以实现自己的string.reverse()方法,但是理解python这方面背后的原理是很好的。
也见