python - Python 中的 Prolog 单例变量

标签 python unused-variables

我正在用 python 编写一小部分脚本,我想到了这个:

line = "a b c d e f g"
a, b, c, d, e, f, g = line.split()

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

_, _, var_needed, _, _, another_var_needed, _ = line.split()

以及 Prolog 确实提供,以排除著名的单例变量

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

编辑:

抱歉,我的观点是:在 Prolog 中,就我而言,在这样的表达式中:

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

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

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

我的问题是是否不应该(或者如果有)避免这种不必要的属性的语法。

最佳答案

_ 是一个完全有效的变量名,是的,您可以在解包操作中多次使用一个变量,因此您编写的内容将起作用。 _ 将以行中分配的最后一个值结束。一些 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

但是 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)

但它仍然不是很漂亮。

关于python - Python 中的 Prolog 单例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13962107/

相关文章:

c++ - 增量变量 "never used"?

c - 错误: unused variable (struct)

c# - MSBuild - 将来自 editorconfig 的警告视为错误(在构建期间强制执行)

jquery - 使用 django 生成文件以使用 javascript/jQuery 下载

python - 如何通过 python 在屏幕上的 bash 上启动命令

python - 如何创建简单的 3 层神经网络并使用监督学习进行教学?

python - 如何在 CentOs 7 中安装 Python 2.6?

python - 文件数据到数组正在使用大量内存

python - 未使用的变量错误,gem5