Python中的Prolog单例变量

Rub*_*ens 1 python unused-variables

我正在python中编写一些脚本,我来到这里:

line = "a b c d e f g"
a, b, c, d, e, f, g = line.split()
Run Code Online (Sandbox Code Playgroud)

我很清楚这些是在实现过程中做出的决定,但不应该(或确实)python提供类似的东西:

_, _, var_needed, _, _, another_var_needed, _ = line.split()
Run Code Online (Sandbox Code Playgroud)

以及Prolog确实提供的,以排除着名的singleton variables.

我不确定,但不会避免不必要的分配吗?或者创建对split调用结果的引用不会计入开销?

编辑:

对不起,我的观点是:在Prolog中,就我而言,表达方式如下:

test(L, N) :-
    test(L, 0, N).
test([], N, N).
test([_|T], M, N) :-
    V is M + 1,
    test(T, V, N).
Run Code Online (Sandbox Code Playgroud)

表示的变量_是不可访问的,因为我认为[_|T]甚至没有创建对列表中存在的值的引用.

但是,在Python中,如果我使用_,我可以使用分配给的最后一个值_,而且,我确实假设为每个变量进行赋值_- 这可能被视为开销.

我的问题是,是否应该(或者如果有)语法来避免这种不必要的归因.

kin*_*all 7

_是一个完全有效的变量名称,是的,您可以在解包操作中多次使用变量,因此您编写的内容将起作用._将以该行中指定的最后一个值结束.一些Python程序员确实以这种方式使用它.

_一些Python交互式shell用于特殊目的,这可能会使一些读者感到困惑,因此一些程序员不会因此使用它.

没有办法避免分配str.split():它总是分割整行,并且总是分配结果字符串.就是这样,在这种情况下,其中一些不会活得很长.但话说回来,谁呢?

例如,你可以避免一些分配re.finditer():

import re

fi = re.finditer(r"\S+", line)
next(fi)
next(fi)
var_needed = next(fi).group()
next(fi)
next(fi)
another_var_needed = next(fi).group()
# we don't care about the last match so we don't ask for it
Run Code Online (Sandbox Code Playgroud)

next()返回一个Match对象,所以它将被分配(并立即丢弃,因为我们没有将其保存在任何地方).所以你真的只保存最后的分配.如果你的字符串很长,那么你得到一个Match对象而不是一个字符串的事实可以节省一些内存,甚至是时间,我想; 我认为匹配的字符串在您要求之前不会从源字符串中切除.您可以对其进行分析以确定.

您甚至可以将上述内容概括为一个函数,该函数仅返回字符串中所需的标记:

import re

def get_tokens(text, *toknums):
    toknums = set(toknums)
    maxtok = max(toknums)
    for i, m in enumerate(re.finditer(r"\S", text)):
        if i in toknums:
            yield m.group()
        elif i > maxtok:
            break

var1, var2 = get_tokens("a b c d e f g", 2, 5)
Run Code Online (Sandbox Code Playgroud)

但它仍然不是很漂亮.