Python 中的反转字符串reversed(),切片

目录
  • 一、使用核心 Python 工具反转字符串
  • 二、通过切片反转字符串
  • 三、使用.join()和反转字符串reversed()
  • 四、手动生成反转字符串
  • 五、反转循环中的字符串
  • 六、用递归反转字符串
  • 七、反向遍历字符串
  • 八、该reversed()内置功能
  • 九、切片运算符, [::-1]
  • 十、创建自定义可逆字符串
  • 十一、以相反的顺序对 Python 字符串进行排序

当我们经常在代码中使用 Python 字符串时,您可能需要以相反的顺序使用它们。Python 包含一些方便的工具和技术,可以在这些情况下为您提供帮助。使用它们,您将能够快速有效地构建现有字符串的反向副本。

了解这些在 Python 中反转字符串的工具和技术将帮助您提高作为 Python 开发人员的熟练程度。

在本教程中,万平米将学到:

  • 通过切片快速构建反向字符串
  • 使用和创建现有字符串的反向副本reversed().join()
  • 使用迭代和递归手动反转现有字符串
  • 对字符串执行反向迭代
  • 使用相反的顺序对字符串进行排序sorted()

为了最大限度地利用本教程,你应该知道的基本知识串,for以及while循环和递归。

一、使用核心 Python 工具反转字符串

在某些特定情况下,可能需要以相反的顺序使用 Python字符串。例如,假设您有一个字符串,并且想要一种快速的方法来反转它以获取. 您可以使用哪些 Python 工具来提供帮助?"ABCDEF""FEDCBA"

字符串在 Python 中是不可变的,因此不可能原地反转给定的字符串。您需要创建目标字符串的反向副本以满足要求。

Python 提供了两种直接的方法来反转字符串。由于字符串是序列,因此它们是indexablesliceableiterable。这些功能允许您使用切片以相反的顺序直接生成给定字符串的副本。第二个选项是使用内置函数reversed()创建一个迭代器,该迭代器以相反的顺序生成输入字符串的字符。

二、通过切片反转字符串

切片是一种有用的技术,它允许您使用称为offsets的整数索引的不同组合从给定序列中提取项目。当涉及到切片字符串时,这些偏移量定义了切片中第一个字符的索引、停止切片的字符的索引,以及一个定义每次迭代要跳过多少个字符的值。

要对字符串进行切片,可以使用以下语法:

a_string[start:stop:step]

你的偏移量startstopstep。此表达式从startto stop − 1by 中提取所有字符step。稍后您将更深入地了解这一切意味着什么。

所有偏移量都是可选的,它们具有以下默认值:

这里,start表示切片中第一个字符stop的索引,同时保存停止切片操作的索引。第三个偏移量step允许您决定切片在每次迭代中将跳过多少个字符。

注意:切片操作在达到等于或大于 的索引时完成stop。这意味着它永远不会在最终切片中包含该索引处的项目(如果有)。

该step偏移允许您微调如何,而跳过其他从字符串中提取所需的字符:

>>>
>>> letters = "AaBbCcDd"

>>> # Get all characters relying on default offsets
>>> letters[::]
'AaBbCcDd'
>>> letters[:]
'AaBbCcDd'

>>> # Get every other character from 0 to the end
>>> letters[::2]
'ABCD'

>>> # Get every other character from 1 to the end
>>> letters[1::2]
'abcd'

在这里,您首先在letters不提供显式偏移值的情况下进行切片以获取原始字符串的完整副本。为此,您还可以使用省略第二个冒号 ( :)的切片。随着step等于2,切片会从目标字符串中的每个其它字符。您可以使用不同的偏移量来更好地了解切片的工作原理。

为什么切片和第三个偏移量与 Python 中的字符串反转有关?答案在于如何step处理负值。如果为 提供负值step,则切片向后运行,即从右到左。

例如:如果您设置为stepequal -1,那么您可以构建一个以相反顺序检索所有字符的切片:

>>>
>>> letters = "ABCDEF"

>>> letters[::-1]
'FEDCBA'

>>> letters
'ABCDEF'

此切片返回从字符串右端(索引等于 )到len(letters) - 1字符串左端(索引为 )的所有字符0。当您使用此技巧时,您会以相反的顺序获得原始字符串的副本,而不会影响 的原始内容letters。

创建现有字符串的反向副本的另一种技术是使用slice(). 这个内置函数的签名如下:

slice(start, stop, step)

此函数接受三个参数,与切片运算符中的偏移量具有相同的含义,并返回一个切片对象,表示调用range(start, stop, step).

我们可以使用slice()来模拟切片[::-1]并快速反转字符串。继续并slice()在方括号内运行以下调用:

>>>
>>> letters = "ABCDEF"

>>> letters[slice(None, None, -1)]
'FEDCBA'

传递None给 的前两个参数slice()告诉函数您要依赖其内部默认行为,这与没有start和值的标准切片相同stop。换句话说,传递None给start和stop意味着您需要从底层序列的左端到右端的切片。

三、使用.join()和反转字符串reversed()

第二种,可以说是最 Pythonic 的反转字符串的方法是reversed()与str.join(). 如果您将字符串传递给reversed() ,您将获得一个以相反顺序生成字符的迭代器:

>>>
>>> greeting = reversed("Hello, World!")

>>> next(greeting)
'!'
>>> next(greeting)
'd'
>>> next(greeting)
'l'

当您将next()withgreeting作为参数调用时,您会从原始字符串的右端获取每个字符。

需要注意的重要一点reversed()是,生成的迭代器直接从原始字符串中生成字符。换句话说,它不会创建一个新的反向字符串,而是从现有字符串反向读取字符。这种行为在内存消耗方面相当有效,并且在某些上下文和情况下(例如迭代)可能是一个根本性的胜利。

我们可以使用reversed()直接调用获得的迭代器作为参数.join():

>>>
>>> "".join(reversed("Hello, World!"))
'!dlroW ,olleH'

在这个单行表达式中,您将调用的结果reversed()直接作为参数传递给.join() 。因此,您将获得原始输入字符串的反向副本。的组合reversed() ,并.join()为扭转字符串一个很好的选择。

四、手动生成反转字符串

到目前为止,您已经了解了快速反转字符串的核心 Python 工具和技术。大多数时候,它们将是您的最佳选择。但是,您可能需要在编码冒险的某个时刻手动反转字符串。

在本节中,您将学习如何使用显式循环和递归来反转字符串。最后一种技术在 Pythonreduce()函数的帮助下使用函数式编程方法。

五、反转循环中的字符串

您将用于反转字符串的第一种技术涉及for循环和连接运算符 ( +)。使用两个字符串作为操作数,此运算符返回一个连接原始字符串的新字符串。整个操作称为串联。

注意:使用.join()是在 Python 中连接字符串的推荐方法。它干净、高效且Pythonic。

这是一个函数,它接受一个字符串并使用串联在循环中反转它:

>>>
>>> def reversed_string(text):
...     result = ""
...     for char in text:
...         result = char + result
...     return result
...

>>> reversed_string("Hello, World!")
'!dlroW ,olleH'

在每次迭代中,循环采用后续字符char, fromtext并将其与 的当前内容连接起来result。请注意,result最初保存的是一个空字符串 ( "")。然后将新的中间字符串重新分配给result。在循环结束时,result保存一个新字符串作为原始字符串的反向副本。

注意:由于 Python 字符串是不可变的数据类型,您应该记住本节中的示例使用了一种浪费技术。它们依赖于创建连续的中间字符串,只是为了在下一次迭代中将它们丢弃。

如果您更喜欢使用whileloop,那么您可以执行以下操作来构建给定字符串的反向副本:

>>>
>>> def reversed_string(text):
...     result = ""
...     index = len(text) - 1
...     while index >= 0:
...         result += text[index]
...         index -= 1
...     return result
...

>>> reversed_string("Hello, World!")
'!dlroW ,olleH'

在这里,您首先使用 计算index输入字符串中最后一个字符的len()。循环从index下到并包括0。在每次迭代中,您都使用扩充赋值运算符 ( +=) 创建一个中间字符串,该字符串将 的内容result与来自 的相应字符连接起来text。同样,最终结果是通过反转输入字符串产生的新字符串。

六、用递归反转字符串

我们还可以使用递归来反转字符串。递归是指函数在自己的主体中调用自身。为了防止无限递归,您应该提供一个无需再次调用函数即可生成结果的基本情况。第二个组件是递归 case,它启动递归循环并执行大部分计算。

下面是如何定义一个递归函数,该函数返回给定字符串的反向副本:

>>>
>>> def reversed_string(text):
...     if len(text) == 1:
...         return text
...     return reversed_string(text[1:]) + text[:1]
...

>>> reversed_string("Hello, World!")
'!dlroW ,olleH'

在本例中,您首先检查基本情况。如果输入字符串只有一个字符,则将该字符串返回给调用者。

最后一个语句,即递归情况,调用reversed_string()自身。该调用使用text[1:]输入字符串的切片作为参数。此切片包含 中的所有字符text,第一个除外。下一步是将递归调用的结果与text[:1]包含 的第一个字符的单字符串 相加text。

在上面的例子中需要注意的一个重要问题是,如果你将一个长字符串作为参数传递给reversed_string(),那么你将得到一个RecursionError:

>>>
>>> very_long_greeting = "Hello, World!" * 1_000

>>> reversed_string(very_long_greeting)
Traceback (most recent call last):
    ...
RecursionError: maximum recursion depth exceeded while calling a Python object

达到 Python 的默认递归限制是您应该在代码中考虑的一个重要问题。但是,如果您确实需要使用递归,那么您仍然可以选择手动设置递归限制。

您可以通过调用getrecursionlimit()from来检查当前 Python 解释器的递归限制sys。默认情况下,此值通常为1000。您可以使用setrecursionlimit()来自同一模块的sys. 使用这些函数,您可以配置 Python 环境,以便您的递归解决方案可以工作。来试试看吧!

使用reduce()扭转字符串
如果您更喜欢使用函数式编程方法,则可以使用reduce()fromfunctools来反转字符串。Pythonreduce()将折叠或归约函数和可迭代对象作为参数。然后它将提供的函数应用于输入迭代中的项目并返回单个累积值。

以下是您可以如何利用reduce()反转字符串的方法:

>>>
>>> from functools import reduce

>>> def reversed_string(text):
...     return reduce(lambda a, b: b + a, text)
...

>>> reversed_string("Hello, World!")
'!dlroW ,olleH'

在此示例中,该lambda函数采用两个字符串并以相反的顺序连接它们。调用在循环中reduce()应用lambdatotext并构建原始字符串的反向副本。

七、反向遍历字符串

有时您可能希望以相反的顺序遍历现有字符串,这种技术通常称为反向迭代。根据您的特定需求,您可以使用以下选项之一对字符串进行反向迭代:

  • 该reversed()内置功能
  • 切片运算符, [::-1]

反向迭代可以说是这些工具最常见的用例,因此在以下几节中,您将了解如何在迭代上下文中使用它们。

八、该reversed()内置功能

以相反顺序迭代字符串的最可读和 Pythonic 的方法是使用reversed() . 不久前,当您将它与.join()创建反向字符串一起使用时,您已经了解了该函数。

但是,主要意图和用例reversed()是支持 Python 可迭代对象的反向迭代。以字符串作为参数,reversed()返回一个迭代器,该迭代器以相反的顺序从输入字符串中产生字符。

以下是如何以相反的顺序迭代字符串reversed():

>>>
>>> greeting = "Hello, World!"

>>> for char in reversed(greeting):
...     print(char)
...
!
d
l
r
o
W

,
o
l
l
e
H

>>> reversed(greeting)
<reversed object at 0x7f17aa89e070>

for此示例中的循环非常具有可读性。的名称reversed()清楚地表达了其意图并传达了该函数不会对输入数据产生任何副作用。由于reversed()返回一个迭代器,循环在内存使用方面也很有效。

九、切片运算符, [::-1]

对字符串执行反向迭代的第二种方法是使用您之前在a_string[::-1]示例中看到的扩展切片语法。即使这种方法不利于内存效率和可读性,它仍然提供了一种快速迭代现有字符串的反向副本的方法:

>>>
>>> greeting = "Hello, World!"

>>> for char in greeting[::-1]:
...     print(char)
...
!
d
l
r
o
W

,
o
l
l
e
H

>>> greeting[::-1]
'!dlroW ,olleH'

在本例中,我们应用切片运算符greeting来创建它的反向副本。然后你使用那​​个新的反向字符串来馈送循环。在这种情况下,您正在迭代一个新的反向字符串,因此该解决方案的内存效率低于使用reversed().

十、创建自定义可逆字符串

如果您曾经尝试过反转 Python 列表,那么您就会知道列表有一个方便的方法,称为原位.reverse()反转底层列表。由于字符串在 Python 中是不可变的,因此它们不提供类似的方法。

但是,您仍然可以使用.reverse()模仿list.reverse(). 您可以这样做:

>>>
>>> from collections import UserString

>>> class ReversibleString(UserString):
...     def reverse(self):
...         self.data = self.data[::-1]
...

ReversibleString继承自UserString,它是collections模块的一个类。UserString是str内置数据类型的包装器。它是专门为创建str. UserString当您需要创建具有附加功能的自定义字符串类时非常方便。

UserString提供与常规字符串相同的功能。它还添加了一个称为.data持有的公共属性,并允许您访问包装的字符串对象。

在里面ReversibleString,你创造.reverse()。此方法反转包装的字符串.data并将结果重新分配回.data. 从外部看,调用的.reverse()工作就像将字符串反转到位。然而,它实际上做的是创建一个新的字符串,以相反的顺序包含原始数据。

以下是ReversibleString实践中的工作原理:

>>>
>>> text = ReversibleString("Hello, World!")
>>> text
'Hello, World!'

>>> # Reverse the string in place
>>> text.reverse()
>>> text
'!dlroW ,olleH'

当您调用.reverse()on 时text,该方法就像您正在对底层字符串进行就地更改一样。但是,您实际上是在创建一个新字符串并将其分配回包装的字符串。请注意,text现在以相反的顺序保存原始字符串。

由于UserString提供与其超类相同的功能str,因此您可以reversed()开箱即用地执行反向迭代:

>>>
>>> text = ReversibleString("Hello, World!")

>>> # Support reverse iteration out of the box
>>> for char in reversed(text):
...     print(char)
...
!
d
l
r
o
W

,
o
l
l
e
H

>>> text
"Hello, World!"

在这里,您调用reversed()withtext作为参数来提供for循环。此调用按预期工作并返回相应的迭代器,因为UserString从str. 请注意,调用reversed()不会影响原始字符串。

十一、以相反的顺序对 Python 字符串进行排序

我们将学习的最后一个主题是如何以相反的顺序对字符串的字符进行排序。当您不按特定顺序处理字符串并且需要按逆字母顺序对它们进行排序时,这会很方便。

要解决此问题,您可以使用sorted(). 这个内置函数返回一个列表,其中包含输入可迭代的所有项目。除了输入可迭代之外,sorted()还接受reverse关键字参数。True如果您希望输入可迭代对象按降序排序,则可以将此参数设置为:

>>>
>>> vowels = "eauoi"

>>> # Sort in ascending order
>>> sorted(vowels)
['a', 'e', 'i', 'o', 'u']

>>> # Sort in descending order
>>> sorted(vowels, reverse=True)
['u', 'o', 'i', 'e', 'a']

当您sorted()使用字符串作为参数调用并reverse设置为 时True,您会得到一个包含输入字符串字符的倒序或降序列表。由于sorted()返回一个list对象,您需要一种方法将该列表转换回字符串。

同样,我们可以.join()像在前面的部分中一样使用:

>>>
>>> vowels = "eauoi"

>>> "".join(sorted(vowels, reverse=True))
'uoiea'

在此代码片段中,您调用.join()了一个空字符串,它扮演着分隔符的角色。参数 to.join()是调用sorted()withvowels作为参数并reverse设置为 的结果True。

您还可以利用sorted()以排序和反向顺序遍历字符串:

>>>
>>> for vowel in sorted(vowels, reverse=True):
...     print(vowel)
...
...
u
o
i
e
a

reverse给的说法sorted()可以让你排序iterables,包括字符串,按降序排列。因此,如果您需要按逆字母顺序排序的字符串字符,那么sorted()适合您。

结论:

以相反的顺序反转和处理字符串可能是编程中的一项常见任务。Python 提供了一组工具和技术,可以帮助您快速有效地执行字符串反转。在本教程中,您了解了这些工具和技术以及如何在字符串处理挑战中利用它们。

总结:

  • 通过切片快速构建反向字符串
  • 使用reversed()和创建现有字符串的反向副本.join()
  • 使用迭代和递归手动创建反向字符串
  • 以相反的顺序循环遍历字符串
  • 使用降序对字符串进行排序 sorted()

尽管本主题本身可能没有很多令人兴奋的用例,但了解如何反转字符串对于入门级职位的编码面试很有用。您还会发现掌握反转字符串的不同方法可以帮助您真正概念化 Python 中字符串的不变性,这是该语言的一个显着特性。

到此这篇关于Python 中的反转字符串reversed(),切片 的文章就介绍到这了,更多相关Python 中的反转字符串 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python全面解读高级特性切片

    目录 1.切片的基础用法 2.切片的高级用法 3.自定义对象实现切片功能 3.1.魔术方法:`getitem()` 3.2.自定义序列实现切片功能 3.3.自定义字典实现切片功能 4.迭代器实现切片功能 4.1.迭代与迭代器 4.2.迭代器切片 5.小结 前言: 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对

  • 浅析Python字符串索引、切片、格式化

    目录 1 字符串索引 1.1 循环索引字符 2 字符使用 2.1 字符串运算 3 字符串切片 3.1 切片方法 4 字符串格式化 除了数字,Python中最常见的数据类型就是字符串,无论那种编程语言,字符串无处不在.例如,从用户哪里读取字符串,并将字符串打印到屏幕显示出来. 字符串是一种数据结构,这让我们有机会学习索引和切片--用于从字符串中提取子串的方法. 1 字符串索引 在Python语法支持中,我们简单的阐述过字符串的使用,现在我们看看python程序在处理字符串时,如何对其进行索引,打印

  • python列表的切片与复制示例分析

    大家可以先参考python切片复制列表的知识点详解这篇内容,对知识点用法有个了解 切片,即处理一个完整列表中部分数据. 语法 变量[起始索引:终止索引:步长] 首先创建一个字符串列表 >>> cars = ['toyota', 'honda', 'mazda', 'nissan', 'mitsubishi', 'subaru', 'suzuki', 'isuzu'] >>> >>> cars ['toyota', 'honda', 'mazda', '

  • Python 切片索引越界的问题(数组下标越界)

    前言 Python语言处理字符串.数组类的问题时有一定概率需要使用切片方法,比如:Leetcode_5. 学习官方解法时发现切片的索引可以超出字符串或数组最大索引值,此时编译器不会报错. 欢迎大佬留言说明这种情况的具体原因,本文只进行一些情况的简单测试. 实例代码 a = '123' b = a[:5] print(b) 发现结果为123,编译器没有报错.而当直接使用a[5]时即报错string index out of range.下面是测试结果. 测试代码(字符串) a = "1234567

  • Python中字符串切片详解

    目录 1.没有步长的简单切片 2.有步长的切片方式 在python中,我们定义好一个字符串,如下所示. 在python中定义个字符串然后把它赋值给一个变量.我们可以通过下标访问单个的字符,跟所有的语言一样,下标从0开始.这个时候呢,我们可以通过切片的方式来截取出我们定义的字符串的一部分.使用切片的时候我们有两种方式:没有步长的简单切片和有步长的切片方式 1.没有步长的简单切片 语法格式是这样的: 首先定义一格字符串,比如叫s,然后给它赋值 截取字符串中的一部分,我们用的语法是 s[ start:

  • Python 中的反转字符串reversed(),切片

    目录 一.使用核心 Python 工具反转字符串 二.通过切片反转字符串 三.使用.join()和反转字符串reversed() 四.手动生成反转字符串 五.反转循环中的字符串 六.用递归反转字符串 七.反向遍历字符串 八.该reversed()内置功能 九.切片运算符, [::-1] 十.创建自定义可逆字符串 十一.以相反的顺序对 Python 字符串进行排序 当我们经常在代码中使用 Python 字符串时,您可能需要以相反的顺序使用它们.Python 包含一些方便的工具和技术,可以在这些情况

  • Python 中的反转字符串reversed(),切片

    目录 一.使用核心 Python 工具反转字符串 二.通过切片反转字符串 三.使用.join()和反转字符串reversed() 四.手动生成反转字符串 五.反转循环中的字符串 六.用递归反转字符串 七.反向遍历字符串 八.该reversed()内置功能 九.切片运算符, [::-1] 十.创建自定义可逆字符串 十一.以相反的顺序对 Python 字符串进行排序 当我们经常在代码中使用 Python 字符串时,您可能需要以相反的顺序使用它们.Python 包含一些方便的工具和技术,可以在这些情况

  • 简单谈谈Python中的反转字符串问题

    按单词反转字符串是一道很常见的面试题.在Python中实现起来非常简单. def reverse_string_by_word(s): lst = s.split() # split by blank space by default return ' '.join(lst[::-1]) s = 'Power of Love' print reverse_string_by_word(s) # Love of Power s = 'Hello World!' print reverse_stri

  • python中sort sorted reverse reversed函数的区别说明

    sort()是可变对象(字典.列表)的方法,无参数,无返回值,sort()会改变可变对象,因此无需返回值. sort()方法是可变对象独有的方法或者属性,而作为不可变对象如元组.字符串是不具有这些方法的,如果调用将会返回一个异常. 代码如下: >>> a=[5,4,3,2,1] >>> a.sort() >>> [1, 2, 3, 4, 5] >>> a >>> [1, 2, 3, 4, 5] sorted()是py

  • python 中 关于reverse() 和 reversed()的用法详解

    目录 python 中 关于reverse() 和 reversed()的用法介绍 reverse(): reversed(): python中join的使用 1.可迭代对象为列表: 2.可迭代对象是元组: python 中 关于reverse() 和 reversed()的用法介绍 reverse(): 是python中列表的一个内置方法(也就是说,在字典,字符串或者元组中,是没有这个内置方法的),用于列表中数据的反转:exp: lista = [1, 2, 3, 4] lista.rever

  • 浅谈python中列表、字符串、字典的常用操作

    列表操作如此下: a = ["haha","xixi","baba"] 增:a.append[gg] a.insert[1,gg] 在下标为1的地方,新增 gg 删:a.remove(haha) 删除列表中从左往右,第一个匹配到的 haha del a.[0] 删除下标为0 对应的值 a.pop(0) 括号里不写内容,默认删除最后一个,写了,就删除对应下标的内容 改:a.[0] = "gg" 查:a[0] a.index(&q

  • python中常用检测字符串相关函数汇总

    本文实例汇总了python中常用检测字符串相关函数.分享给大家供大家参考.具体分析如下: 下面的python代码可用于检测字符串,包括是否全部为数字,是否包含数字,是否包含标题单词,是否包含大写字母,是否包含小写字母,是否包含空格,是否以指定的字符开头和结尾. my_string = "Hello World" my_string.isalnum() #检测所有字符是否都是数字 my_string.isalpha() #检测字符串中的所有字符是否都是字母 my_string.isdig

  • Python 中几种字符串格式化方法及其比较

    Python 中几种字符串格式化方法及其比较 起步 在 Python 中,提供了很多种字符串格式化的方式,分别是 %-formatting.str.format 和 f-string .本文将比较这几种格式化方法. %- 格式化 这种格式化方式来自于 C 语言风格的 sprintf 形式: name = "weapon" "Hello, %s." % name C 语言的给实话风格深入人心,通过 % 进行占位. 为什么 %-formatting不好 不好的地方在于,

  • 在Python中实现替换字符串中的子串的示例

    假如有个任务: 给定一个字符串,通过查询字典,来替换给定字符中的变量.如果使用通常的方法: >>> "This is a %(var)s" % {"var":"dog"} 'This is a dog' >>> 其实可以使用string.Template类来实现上面的替换 >>> from string import Template >>> words = Template

  • Python 中的range(),以及列表切片方法

    range()函数配合循环一块使用很方便,今天来整理一下这个函数的主要用法,以及几个小例子 首先来看一下函数原型,非常简单: range(start,end [,step]) 或者连start都省略掉: range(end) 其中,start表示开始点,end表示结束点,真正结束的位置是end的前一个值,step表示步长. 例如: print(list(range(1,5))) #list函数是将range的值列表化,这时候的输出为 1,2,3,4 (没有5!即不包括最后一个end的值) pri

随机推荐