在 Python 中不带括号的字符串切片

Slicing a string in Python without brackets

假设我有一个像 num = "12345" 这样的字符串;如何在不使用括号 (print(num[0])) 的情况下将其打印为一个字符,如 12

括号可能是执行此操作的正确方法,为什么不希望您使用它?

无论如何,你可以unpack your string(只适用于Python 3作为@DeepSpace精确),像这样:

letter, *_ = num
print(letter)
# "1"

它也适用于任何地方的多个变量:

letter_1, *_, letter_2 = num
print(letter_1, letter_2)
# "1", "5"

还有operator.getitem(a, b),它的行为类似于括号,但作为一个函数:

from operator import getitem

letter = getitem(num, 0)
print(letter)
# "1"

最后,正如@EliKorvigo 指出的那样,operator.itemgetter(item) 创建了一个函数,就像括号一样:

from operator import itemgetter

getter = itemgetter(3)
letter = getter(num)
print(letter)
# "4"

又一次滥用 Python 功能。

您可以遍历字符串并仅打印位于特定位置的值。

num = '12345'

values = (0, 1)
for i, n in enumerate(num):
    if i in values:
        print(n)

使用迭代器:

chars = iter("12345")
print(next(chars))  # 1
print(next(chars))  # 2

您可以使用 itertools.islice():

>>> from itertools import islice
>>> num = '123456'
>>> ''.join(islice(num, 0, 1))    # same as num[0]
'1'
>>> n = 4
>>> ''.join(islice(num, n, n+1))  # same as num[4]
'5'
>>> n = 100
>>> ''.join(islice(num, n, n+1))  # _not_ the same as num[100]
''
>>> num[100]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

其他方法包括循环输入字符串所需的次数:

num = '123456'
n = 5
for i, c in enumerate(num):
    if i == n:
        print(c)
        break
# 6

或从字符串的列表副本中弹出项目:

num = '123456'
l = list(num)
n = 5
for i in range(n):
    try:
        _ = l.pop(0)
    except IndexError:
        break
print(l.pop(0))
# 6

或者遍历字符串的迭代器版本:

num = '123456'
it = iter(num)
n = 5
for i in range(n):
    _ = next(it)
print(next(it))

另一种方法是使用 collections.deque:

from collections import deque

num = '123456'
d = deque(num)
n = 5
d.rotate(-n)
print d.popleft()

尽管您可能希望对其进行长度检查,以防旋转超出字符串的长度。