假设我想分区字符串。它返回3个元组的元组。我不需要第二项。
我已经读过,当要忽略变量时会使用_
。
bar = 'asd cds'
start,_,end = bar.partition(' ')
如果我理解正确,_
仍然填充了该值。我没有听说过忽略输出部分的方法。
这不会节省周期吗?
更大的例子是
def foo():
return list(range(1000))
start,*_,end = foo()
答案 0 :(得分:3)
通过注意没有必要将名称绑定到未使用的返回对象,它不会真正保存任何循环来忽略返回参数,no,除了那些通常被保存的那些。
Python不执行任何函数内联或跨函数优化。它没有丝毫针对那个利基市场。也不应该这样做,因为这会损害python擅长的许多东西。许多核心python功能取决于其设计的简单性。
列表解包示例相同。考虑到语法,很容易想到语法糖让python选择列表的最后一项和第一项。但是,没有办法,保持在python的定义约束内,实际上不首先构造整个列表。谁说清单的构建没有相关的副作用? Python,作为一种语言,肯定不会保证你有任何这样的东西。作为一种动态语言,python甚至没有丝毫的线索,或试图关注自己,因为foo可能会返回一个列表,直到它实际上这样做。
它会返回一个清单吗?如果你反弹列表标识符怎么办?
答案 1 :(得分:1)
根据docs,有效的变量名称可以是这种形式
identifier ::= (letter|"_") (letter | digit | "_")*
这意味着,变量名的第一个字符可以是字母或下划线,名称的其余部分可以是字母或数字或_
。因此,_
是Python中的有效变量名,但不太常用。所以人们通常像使用和抛出变量一样使用它。
您显示的语法无效。应该是
start,*_,end = foo()
无论如何,这种解包只能在Python 3.x中使用
在您的示例中,您已使用
list(range(1000))
因此,整个列表已经构建完毕。当您返回它时,实际上是返回对列表的引用,实际上不会复制这些值。因此,没有特定的方法可以忽略这些值。
答案 2 :(得分:1)
当然有一种方法可以提取一些元素。即:
l = foo()
start, end = foo[0], foo[-1]
你问的问题是,“为什么不存在单行速记呢?”有两个答案:
需要速记是不常见的。这种双线解决方案足以应对这种罕见的情况。
功能不需要不存在的充分理由。这并不像Guido van Rossum编制了所有可能的想法列表,然后打败了你的。如果您对改进的语法有所了解,可以将它提交给Python社区,看看是否可以让它们实现它。