2009-12-13 5 views
8

Dies ist mit dem folgenden Code zu tun, der eine for-Schleife verwendet, um eine Reihe von zufälligen Offsets für die Verwendung an anderer Stelle im Programm zu generieren.Pythonische Methode zum Schreiben einer for-Schleife, die den Schleifenindex nicht verwendet

Der Index dieser for-Schleife wird nicht verwendet, und dies wird in der ‚anstößigen‘ Code führt, wie eine Warnung von Eclipse/PyDev

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

    return pattern 

So hervorgehoben werden ich entweder brauchen einen besseren Weg, diese Schleife zu schreiben Das erfordert keinen Schleifenindex oder eine Möglichkeit, PyDev anzuweisen, diese bestimmte Instanz einer nicht verwendeten Variablen zu ignorieren.

Hat jemand irgendwelche Vorschläge?

+2

Siehe http://stackoverflow.com/questions/818828/is-it-possible-to-implement-a-python-for-range-loop-without-an-iterator-variable –

+0

Mögliche Duplikate von [Was ist der Zweck der einzelnen Unterstreichung "\ _" Variable in Python?] (http://stackoverflow.com/questions/5893163/what-is-the-purpose-of-the-single-underscore-variable-in-python) – parvus

Antwort

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

Beispielausgabe, für count=10 und unter der Annahme, dass Sie die Standardbibliothek random() Funktion bedeuten:

[(-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)] 

Wenn Sie es wirklich eine Funktion vornehmen müssen, dann können Sie abkürzen, indem ein lambda mit:

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

Auf diese Weise können Sie anrufen es mögen:

>>> 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)] 
>>> 

Sie auf die Idee ...

+2

Dies habe die unbenutzte Variable einfach in _ umbenannt und ist nicht wirklich besser, außer Eclipse ignoriert das extra. – McPherrinM

+0

Gibt PyDev nicht die gleiche Warnung über _ unbenutzt? – jakeboxer

+3

'_' ist eine Dummy-Variable, Eclipse sollte sich nicht beschweren, aber ich weiß es nicht, da ich Python nie auf dieser Plattform entwickelt habe. Viel Glück, und bitte lass es mich wissen, wenn es sich beschweren. – Escualo

0

Try this:

while count > 0: 
    pattern.append((random() - 0.5, random() - 0.5)) 
    count -= 1 
2

spät zur Party, aber hier ist eine mögliche Idee:

def RandomSample(count): 
    f = lambda: random() - 0.5 
    r = range if count < 100 else xrange # or some other number 
    return [(f(), f()) for _ in r(count)] 

Streng genommen, das ist mehr oder weniger die gleichen wie die anderen Antworten, aber es tut zwei Dinge, die Art schön aussehen mir.

Zuerst entfernt es diesen doppelten Code, den Sie von Schreiben random() - 0.5 zweimal haben, indem Sie das in ein Lambda setzen.

Zweitens, für einen bestimmten Größenbereich, wählt es xrange() statt range(), um nicht unnötig eine riesige Liste von Zahlen zu erzeugen, die Sie wegwerfen werden. Vielleicht möchten Sie die genaue Zahl anpassen, weil ich überhaupt nicht damit gespielt habe, ich dachte nur, es könnte ein potentielles Effizienzproblem sein.

+1

Warum nicht immer _xrange _always_? –

+0

Das ist eine gute Alternative. Ich gehe davon aus, dass die Erstellung eines Generators für nur zwei Iterationen teurer ist als die Erstellung einer Liste von nur zwei Elementen. Ich habe natürlich keine Benchmarks, wie teuer Generatoren und Listen sein können oder nicht, aber irgendwie habe ich das Gefühl, wenn 'xrange (2)' effizienter ist als 'range (2)', dann ist etwas furchtbar falsch mit die Umsetzung. –

18

Gerade als Referenz für Variablen in PyDev

standardmäßig pydev ignoriert werden folgende Variablen ignorieren

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

Sie können mehr hinzufügen, indem supression Gabe von Parametern

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

Ref: http://eclipse-pydev.sourcearchive.com/documentation/1.0.3/PyCheckerLauncher_8java-source.html

+2

PyDev unterdrückt Warnungen für nicht verwendete Variablen, wenn sie * mit einem Unterstrich * beginnen. Also '_i' würde auch funktionieren. –

+0

Sie könnten auch "i = i" hinzufügen. Dies hat den Vorteil, dass es in jeder Entwicklungsumgebung funktionieren würde, unabhängig davon, welche eingebaute Variable es ignoriert. –

5

Wie wäre es 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)) 

Beispielausgabe:

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

Als Funktion: 'fn = Lambda-Anzahl: itertools.wiederhole (lambda: (random() - 0.5, random() - 0.5), zählt) ' –

0
import itertools, random 

def RandomSample2D(npoints, get_random=lambda: random.uniform(-.5, .5)): 
    return ((r(), r()) for r in itertools.repeat(get_random, npoints)) 
  • verwendet random.uniform() explizit
  • gibt einen Iterator statt Liste
Verwandte Themen