41

我一直在寻找一种向后打印字符串的方法,在谷歌上快速搜索后,我发现了这种方法:

假设a是一个字符串变量。这将a向后返回字符串:

a[::-1]

谁能解释它是如何工作的?

4

16 回答 16

78

当然,[::]扩展切片运算符。它允许您获取子字符串。基本上,它通过将您想要的元素指定为 [begin:end:step] 来工作,它适用于所有序列。关于它的两件事:

  • 您可以省略一个或多个元素,它会做“正确的事情”
  • begin、end 和 step 的负数有意义

对于begin和end,如果你给一个负数,则表示从序列的末尾开始计数。例如,如果我有一个列表:

l = [1,2,3]

然后l[-1]是 3,l[-2]是 2,然后l[-3]是 1。

对于step参数,负数意味着在序列中向后工作。所以对于一个列表::

l = [1,2,3,4,5,6,7,8,9,10]

您可以编写l[::-1]这基本上意味着在阅读列表时使用 -1 的步长。Python 在填写 start 和 stop 时会“做正确的事”,因此它会向后遍历列表并为您提供[10,9,8,7,6,5,4,3,2,1].

我已经给出了带有列表的示例,但字符串只是另一个序列并且以相同的方式工作。所以a[::-1]意味着通过加入你通过字符串向后走得到的字符来构建一个字符串。

于 2009-04-19T21:43:46.627 回答
8

“-1”部分表示切片的“步长”部分——在这种情况下,它一次遍历字符串 1 个字符,但向后(负步长表示从字符串末尾开始)。例如,如果您将 step 指定为 2,您将获取字符串的所有其他字符,从第一个字符开始。如果您指定步长 -2,那么您将获得字符串的每个其他字符,从最后一个字符开始并向后工作。

所以,简而言之,如果a = '12345'

  • a[::2]变成135
  • a[::-1]变成54321
  • a[::-2]变成531
于 2009-04-19T21:43:30.513 回答
6

我认为以下内容对于反向打印字符串更有意义,但也许这只是我:

for char in reversed( myString ):  
  print( char, end = "" )
于 2009-04-19T22:48:09.547 回答
3

这是扩展切片符号

sequence[start:end:step]

在这种情况下,步骤 -1 表示向后,省略开头和结尾表示您想要整个字符串。

于 2009-04-19T21:43:04.710 回答
3

我会这样做:

variable = "string"
message = ""
for b in variable:
    message = b+message
print (message)

它打印:gnirts

于 2011-06-04T19:33:28.450 回答
2

它在 Python 中称为 Slice Notation,您可以在此处阅读更多关于它的工作原理:

解释 Python 的切片符号

于 2009-04-19T21:42:52.653 回答
2

它使用扩展切片——字符串是 Python 中的序列,并与其他序列(即列表和元组)共享一些方法。切片分为三个部分 - 开始、停止和步进。它们都有默认值 - start 默认为 0,stop 默认为 len(sequence),step 默认为 1。通过指定 [::-1] 你是说“序列 a 中的所有元素,从头开始, 到最后一次倒退一个。

此功能是在 Python 2.3.5 中引入的,您可以在What's New 文档中阅读更多内容。

于 2009-04-19T21:43:36.317 回答
2

[::-1] 给出字符串 a 的切片。完整的语法a[begin:end:step] 给出了 a[begin], a[begin+step], ... a[end-1]。当 step 为负时,您从 end 开始并移动到 begin。

最后,begin 默认为序列的开头,end 为 end,step 为 -1。

于 2009-04-19T21:44:01.447 回答
1

字符串本质上是一个字符序列,因此切片操作对其进行。你正在做的实际上是:

-> 从开始到结束以 1 的步长向后获取一片“a”。

于 2009-04-19T21:44:29.030 回答
1

这是基本的步骤符号,请考虑以下功能:

一个[2:4:2]

发生的情况是索引在位置 2 和 4 之间被分割,第三个变量的作用是从第一个值开始设置步长。在这种情况下,它将返回 a[2],因为 a[4] 是一个上限,因此只返回两个值,并且不会进行第二步。(-) 减号运算符只是反转步进输出。

于 2017-05-03T19:09:18.923 回答
1

使用扩展切片语法

word = input ("Type a word which you want to reverse: ")
def reverse(word):
  word = word[::-1]
  return word
print (reverse(word))
于 2018-11-18T20:50:00.210 回答
0

考虑下面的列表

l=[12,23,345,456,67,7,945,467]

反转列表的另一个技巧可能是:

l[len(l):-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12]

l[:-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12]

l[len(l)::-1] [467, 945, 7, 67, 456, 345, 23, 12]
于 2012-03-22T17:46:18.767 回答
0

您可以使用 reversed() 函数。例如

x = "abcd"
for i in reversed(x):
        print(i, end="")
print("\n")
L = [1,2,3]
for i in reversed(L):
        print(i, end="")

印刷品dcba321

于 2019-03-05T06:27:26.513 回答
0

前两个边界默认为 0 和序列的长度,如前所述,-1 的步幅表示切片应该从右到左而不是通常的从左到右。因此,效果是颠倒顺序。

name="ravi"
print(name[::-1]) #ivar
于 2019-06-01T19:08:16.837 回答
-1

我们可以使用 append 和 pop 来做到这一点

def rev(s):
    i = list(s)
    o = list()
    while len(i) > 0:
        o.append(t.pop())

    return ''.join(o)
于 2014-08-26T03:39:09.557 回答
-1

在不使用 reversed 或 [::-1] 的情况下,这是一个基于递归的简单版本,我认为它是最易读的:

def reverse(s):

  if len(s)==2:
    return s[-1] + s[0]

  if len(s)==1:
    return s[0]

  return s[-1] + reverse(s[1:len(s)-1]) + s[0]
于 2017-09-29T03:20:59.147 回答