pythonic地编写一个不使用循环索引的for循环的方法

8 投票
7 回答
3598 浏览
提问于 2025-04-15 16:58

这段话是关于以下代码的,这段代码使用了一个for循环来生成一系列随机的偏移量,以便在程序的其他地方使用。

这个for循环的索引没有被使用,因此Eclipse / PyDev会把这段“有问题”的代码标记为警告。

def RandomSample(count):    
    pattern = []
    for i in range(count):
        pattern.append( (random() - 0.5, random() - 0.5) )

    return pattern

所以我需要找到一种更好的方法来写这个循环,不需要使用循环索引,或者找到一种方法告诉PyDev忽略这个特定的未使用变量。

有没有人有什么建议?

7 个回答

5

你觉得 itertools.repeat 这个怎么样呢?

import itertools
count = 5
def make_pat():
    return (random() - 0.5, random() - 0.5)
list(x() for x in itertools.repeat(make_pat, count))

示例输出:

[(-0.056940506273799985, 0.27886450895662607), 
(-0.48772848046066863, 0.24359038079935535), 
(0.1523758626306998, 0.34423337290256517), 
(-0.018504578280469697, 0.33002406492294756), 
(0.052096928160727196, -0.49089780124549254)]
18

这里是关于在PyDev中忽略变量的参考信息

默认情况下,PyDev会忽略以下变量

['_', 'empty', 'unused', 'dummy']

你可以通过传递抑制参数来添加更多变量

-E, --unusednames  ignore unused locals/arguments if name is one of these values

参考链接: http://eclipse-pydev.sourcearchive.com/documentation/1.0.3/PyCheckerLauncher_8java-source.html

4
randomSample = [(random() - 0.5, random() - 0.5) for _ in range(count)]

这是一个示例输出,假设你设置的 count=10,并且你指的是标准库里的 random() 函数:

[(-0.07, -0.40), (0.39, 0.18), (0.13, 0.29), (-0.11, -0.15),\
(-0.49, 0.42), (-0.20, 0.21), (-0.44, 0.36), (0.22, -0.08),\
(0.21, 0.31), (0.33, 0.02)]

如果你真的想把它做成一个函数的话,可以用 lambda 来简化:

f = lambda count: [(random() - 0.5, random() - 0.5) for _ in range(count)]

这样你就可以像这样调用它:

>>> f(1)
f(1)
[(0.03, -0.09)]
>>> f(2)
f(2)
[(-0.13, 0.38), (0.10, -0.04)]
>>> f(5)
f(5)
[(-0.38, -0.14), (0.31, -0.16), (-0.34, -0.46), (-0.45, 0.28), (-0.01, -0.18)]
>>> f(10)
f(10)
[(0.01, -0.24), (0.39, -0.11), (-0.06, 0.09), (0.42, -0.26), (0.24, -0.44) , (-0.29, -0.30), (-0.27, 0.45), (0.10, -0.41), (0.36, -0.07), (0.00, -0.42)]
>>> 

你明白这个意思了吧……

撰写回答