Python扩展切片表示法的形式语法?

2024-04-26 22:59:35 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,Numpy允许多维切片:

a[:, 0, 7:9]

这就提出了一个问题:还有什么可能?(想象一下可能性!)在

根据this answer和一些实验(见下文),如果存在逗号,Python将构建一个对象元组,其中一些可能是切片对象,并将其(作为key)传递给a的{}。在

documentation for ^{}没有指定此行为。有没有我漏掉的官方文件?特别是,这种语法有多向后兼容?(在web上搜索“python extended slice notation”得到"What's new in Python 2.3",但没有提到它。)


实验

^{pr2}$

首先,Python发现可以识别多切片的内容:

^{3}$

有些事情是不允许的(SyntaxError):

# Semicolon delimiter
t['a':5; 'b':7:-7]
# Slice within a slice
t['a':7:(9:5),]
# Two trailing commas
t[5,,]
# Isolated comma
t[,]
# Leading comma
t[,5]
# Empty string
t[]
# Triple colon
t[:::]
# Ellipses as part of a slice
t[1:...]
t[1:2:...]
# Ellipses inside no-op parens:
t[(...)]
# Any non-zero and non-three number of dots:
t[.]
t[..]
t[ .  .  .  . ]

Tags: of对象answernumpy切片slice可能性this
1条回答
网友
1楼 · 发布于 2024-04-26 22:59:35

任何都是可能的,只要它是有效的Python表达式。由[...]之间的表达式生成的对象传递给__getitem__方法。就这样。在

逗号产生元组,表达式中的:冒号产生slice()对象。除此之外,你想用什么都行。在

这是因为语法允许符号中的任何expression_list。参见reference documentation

subscription ::=  primary "[" expression_list "]"

切片在Slicings section中进一步指定:

slicing      ::=  primary "[" slice_list "]"
slice_list   ::=  slice_item ("," slice_item)* [","]
slice_item   ::=  expression | proper_slice
proper_slice ::=  [lower_bound] ":" [upper_bound] [ ":" [stride] ]
lower_bound  ::=  expression
upper_bound  ::=  expression
stride       ::=  expression

所以再次允许任意的expression,并且:触发proper_slice语法规则。在

请注意,lower_boundupper_boundstride表达式结果用于构造slice()对象,该对象只能处理整数值。任何不能转换为整数的内容都将导致TypeError被引发。这与语法错误不是一回事;t[1:...]在语法上很好,但是...不可转换为整数,因此会出现运行时TypeError异常。至少在python2.4及更高版本上,使用非整数切片值的两个示例是不可能的。在

你的实际语法错误都源于无效的表达式。除了:proper_slice符号之外,如果不能将[...]之间的部分放在赋值的右侧,也不能在切片中使用它。在

例如,;只能用于将多个simple statements放在一条逻辑线上。语句可以包含表达式,但表达式永远不能包含语句,表达式中不包括;(9:5),不是一个有效的表达式(Python中没有其他地方可以在括号中使用:,而{a4}不允许任何这样的选项)。在

Python 2 grammar for slicings要更详细一些,因为...是语法中的一个特定符号,而且实际上不能在slicing之外使用...(在python3中,可以在表达式有效的任何地方使用...),这就是为什么{}在python2中是一个语法错误,而在python3中则不是。在

相关问题 更多 >