我想使用变量来存储切片表达式。 这是我尝试的:
if variable is not None:
var = variable
elif self.__filter is not None:
var = self.__filter
else:
# this doesn't work, : alone understandably gives a syntax error
var = ':'
然后在这里使用var:
return stuff[var]
我想这样做是为了在我的代码中获得更好的结构。另一种方法是根据大小写返回这个表达式:
return stuff[variable]
return stuff[self.__filter]
return stuff[:]
引发异常:ValueError: invalid literal for int() with base 10
有没有办法将冒号分配给var所以它可以用在切片表达式中(转义或类似的东西)或者我是否必须使用var = slice(0, self.getNumberOfVariables())
?
P.S。:我在询问前做了搜索,但没有找到这样的东西。对不起,如果我错过了重复。
答案 0 :(得分:7)
不能直接使用结肠。它是一种操作的字面符号; Python通常不允许直接使用这种标点符号,而是需要使用函数(参见算术运算符和operator
模块中的相应函数)。
要使用的函数是内置函数slice
,它返回切片的显式表示。使用slice(None)
包含所有内容。
一个例子:
>>> s = slice(None)
>>> x = range(10)
>>> x[s]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
答案 1 :(得分:3)
这是一篇旧文章,但它只是在Google上弹出的最高结果,所以我想回答一下以帮助其他人。
切片中的冒号:
只是[start:stop:step]
之间的分隔符。当None
,start
或stop
中的一个保留默认值时,通常不会明确写成step
。
在示例中更容易看到:
# Slice with all parameters specified
# start:1, stop:4, step:1
seq[1:4:1]
# Slice with default step value (default=1)
# start:1, stop:4, step:1
# All the following are equivalent
seq[1:4:None]
seq[1:4:]
seq[1:4]
# Slice with default stop value (default = len(seq))
# start:1, stop:len(seq), step:1
# All the following are equivalent
seq[1:None:1]
seq[1::1]
# Slice with default step and stop value
# start:1, stop:len(seq), step:1
# All the following are equivalent
seq[1:None:None]
seq[1::]
seq[1:]
# Slice with default start value
# start:1, stop:4, step:1
# All the following are equivalent
seq[None:4:1]
seq[:4:1]
# Slice with all default values
# start:1, stop:len(seq), step:1
# All the following are equivalent
seq[None:None:None]
seq[::]
seq[:]
要回答您的问题,在切片变量中使用:
是没有意义的,因为您要使用分隔符。尽管由于直接创建切片时不必显式声明None
而令人困惑,所以这使:
看起来像运算符。
TLDR;使用slice
类型时,必须显式声明None
。
因此seq[slice(None, None, None)]
等同于seq[::]
。
答案 2 :(得分:-1)
表达式stuff[var]
不可避免地修复了某些东西的可能性,可以使用单个变量来表达。
你必须考虑如何解释东西。
首先解析代码。此时修复使用哪种语法。
start:stop:step
是一个表达式,编译器接受它作为切片。一个特例是:
。其他可能性是标量,列表和切片对象。单个对象。
在getter中使用var,我只能将var设置为list,scalar或slice对象。 当尝试将冒号语法内容分配给var时,我只得到一个字符串文字,并且字符串文字不会被getter / setter方法解析。 你只是无法通过为变量赋值来改变语法。