反转Python字符串,但不忽略起始和结束片段

反转Python字符串,但不忽略起始和结束片段,python,reverse,slice,Python,Reverse,Slice,如何在不忽略起始和结束切片参数的情况下反转Python字符串 word = "hello" reversed_word = word[::-1] 我知道这是可行的,但是如何通过指定开始和结束索引来获得结果呢 word = "hello" reversed_word = word[?:?:-1] 很难向学生解释为什么word[::-1]会反转字符串。如果我能给他们逻辑推理,而不是“这是蟒蛇式的方式”,那就更好了 我解释word[::1]的方式如下:“你没有指定开始,所以它只是从开始开始。你没有

如何在不忽略起始和结束切片参数的情况下反转Python字符串

word = "hello"
reversed_word = word[::-1]
我知道这是可行的,但是如何通过指定开始和结束索引来获得结果呢

word = "hello"
reversed_word = word[?:?:-1]
很难向学生解释为什么
word[::-1]
会反转字符串。如果我能给他们逻辑推理,而不是“这是蟒蛇式的方式”,那就更好了


我解释
word[::1]
的方式如下:“你没有指定开始,所以它只是从开始开始。你没有指定结束,所以它一直到结束。现在步骤是1,所以它只是从开始到结束,1个字符乘以1。”现在,当我的学生看到
word[::-1]
时,他们会思考“我们没有指定开始或结束,因此它将一次通过字符串-1个字符?”

如果不为切片表示法指定数字,Python将使用
None
作为默认值。因此,您可以显式编写
None
值:

>>> word = "hello"
>>> word[None:None:-1]
'olleh'
>>>

递归方法:

def reverse(word):
    if len(word) <= 1:
        return word

    return reverse(word[1:]) + word[0]
def反转(word):

如果len(word)不太清楚原因,但以下内容将返回word的倒数:

word = "hello"
word[len(word):-(len(word)+1):-1]
或者

编辑(解释):

def reverse(word):
    if len(word) <= 1:
        return word

    return reverse(word[1:]) + word[0]
根据杰瓦德的评论:


中间的参数是最复杂的,但它非常简单 一旦您意识到(a)切片开始/停止指示的负指数 要从字符串末尾开始“向后”计数,以及(b) 停止索引是独占的,因此它将“计数”到但停止 在停止索引处/之前。单词[len(word):-len(word)-1:-1]可能是 更清楚

针对评论:

第三个值实际上是增量,因此您告诉Python您希望从最后一个字母开始,然后返回所有(-1)st值,直到最后一个字母为止

这是一张图(一分钟内拼在一起):

图纸显示,我们也可以使用此选项:

word = "hello"
word[-1:-len(word)-1:-1] #-1 as the first
为什么会这样:

In [46]: word
Out[46]: 'hello' 

In [47]: word[-1] # you want o to be your first value
Out[47]: 'o'

In [48]: word[-5] # you want h to be your last value
Out[48]: 'h'

In [49]: word[-1:-6:-1] # therefore ending point should be one
Out[49]: 'olleh'        # past your last value that is -6  

反转字符串的其他一些方法:

word = "hello"
reversed_word1 = word[-1: :-1] 
reversed_word2 = word[len(word)-1: :-1]   
reversed_word3 = word[:-len(word)-1 :-1]    
关于切片符号
a[i:j:k]
您应该注意的一点是,省略
i
j
并不总是意味着
i
将变成
0
j
将变成
len
。默认情况下
k
+1

  • 如果
    k
    为+ve,则
    i
    的默认值为
    0
    (从开头开始)。如果为-ve,则
    i
    的默认值为
    -1
    (从结尾开始)
  • 如果
    k
    为+ve,则
    j
    的默认值为
    len(s)
    (在末尾停止)。如果为-ve,则
    j
    的默认值为
    -(len(s)+1)
    (在开头停止)

现在,您可以向学生解释如何使用以下Python程序描述符号
字符串[begin:end:increment]
Hello[:-1]
打印
olleH

def myreverse( string, begin, end, increment ):
  newstring = ""
  if begin >= 0 and end < 0:
    begin = -1
  for i in xrange(begin, end, increment):
    try:
      newstring += string[i]
    except IndexError:
      pass

  return newstring
def myreverse(字符串、开始、结束、增量):
newstring=“”
如果开始>=0,结束<0:
开始=-1
对于X范围内的i(开始、结束、增量):
尝试:
newstring+=字符串[i]
除索引器外:
通过
返回新闻字符串
从中,这是用三元表达式定义的:


我试图理解为什么答案不会是
word[len(word):-1:-1]
。对我来说,这是这样的:“从单词的末尾开始,然后向后走,直到到达-1并停止”。但这不起作用。Python不知道len(word)的意思是“从末尾开始”。Python认为这是“从等于某个数字的索引开始”“。在使用前,您需要阅读手册中的功能定义。第一个数字被定义为“开始”索引。@ogen负的开始或结束表示从字符串的末尾开始计数,而不是在低于0时停止。很抱歉,这是一个输入错误。我的意思是
word[len(word)-1:-1:-1]
。现在开始索引是最后一个索引,结束索引是-1,因为它是独占的,所以最后一个索引将是0。
word[len(word)-1:-1:-1]
并不意味着:“从单词的结尾开始,然后向后走,直到到达-1并停止”。它的意思是:“从
-1
开始,到达
-1
时停止”。至于python中的字符串索引,
-1
相当于
len[string]-1
。这很好地工作,但我并不寻找递归解决方案。应该有一些值可以放在切片中,这些值具有逻辑意义。中间的参数是最复杂的,但一旦您意识到(a)切片开始/停止的负索引表示您希望从字符串末尾“向后”计数,以及(b)停止索引是排他的,因此它将“计数”直到但在停止索引处/之前停止
word[len(word):-len(word)-1:-1]
可能会更清楚一点。@jedwards我能在我的答案中引用你的话吗?不用担心引用,把它扔进去:)@Ogen,Guido van Rossum在某个地方写了一篇很好的博客,关于他是如何决定切片符号的——让我把它挖出来。编辑:Here:@jakekimds,它显示了一种实现实际切片的方法,给定一个iterable(在本例中为字符串)和一个切片对象。最后两片可能会让你感兴趣。倒数第二个部分是您给出的答案(
[len(text):-len(text)-1:-1]
),最后一个答案有相同的开始和结束,但没有步骤。当没有提供步骤时,它默认为1,循环尝试向前计数,但它已经超过了从
len(text)
开始的字符串的末尾,因此它会立即停止。如果
-(len(s)+1)
可以是0,这将更有意义。因为这也是beginning@Ogen; 不。它实际上是一个过去的
0
-len
相当于
0
。无法比显示源代码更好地解释它。非常有用,谢谢。
def myreverse( string, begin, end, increment ):
  newstring = ""
  if begin >= 0 and end < 0:
    begin = -1
  for i in xrange(begin, end, increment):
    try:
      newstring += string[i]
    except IndexError:
      pass

  return newstring
defstart = *step < 0 ? length-1 : 0;
defstop = *step < 0 ? -1 : length;
def my_slice(word, step):
    '''slice word with only step'''
    start = len(word)-1 if step < 0 else 0
    stop = -len(word)-1 if step < 0 else len(word)
    return word[start:stop:step]


word = "hello"
step = -1
my_slice(word, step)
'olleh'