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中,如果我使用_,我可以使用分配给的最后一个值_,而且,我确实假设为每个变量进行赋值_- 这可能被视为开销.
我的问题是,是否应该(或者如果有)语法来避免这种不必要的归因.
_是一个完全有效的变量名称,是的,您可以在解包操作中多次使用变量,因此您编写的内容将起作用._将以该行中指定的最后一个值结束.一些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)
但它仍然不是很漂亮.
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |