2016-02-01 2 views
3

Я этоКак написать пользовательскую функцию генератора с питоном

for A in [0, -0.25, 0.25, -0.5, 0.5, -0.75, 0.75, -1.0, 1.0, -1.25, 1.25, -1.5, 1.5, -1.75, 1.75, -2.0, 2.0, -2.25, 2.25, -2.5, 2.5, -2.75, 2.75, -3.0, 3.0, -3.25, 3.25, -3.5, 3.5, -3.75, 3.75, -4.0, 4.0, -4.25, 4.25, -4.5, 4.5, -4.75, 4.75, -5.0, 5.0]: 

Можно ли это сделать с помощью функции генератора? У меня сейчас это:

def frange(start, stop, step=1.0): 
    while start <= stop: 
     yield start 
     start += step 

и использовать так:

for error in self.frange(-2.5, 2.5, 0.25): 

но его возвращает [-2.5, 2.25, ... , 0 , 2.25, 2.5] и для моей программы очень трудно вычислить. потому что я нахожу значение, близкое к нулю, но я не знаю, сколько комбинаций оно может быть.

Мне нужно перейти от нуля, а следующее значение должно быть в минус и плюс. как [0, -0.25, 0.25...].

+3

Как вы планируете использовать эту функцию? Что ты пытаешься сделать? – vaultah

+0

Мне нужно, начать с нуля, а после этого отметьте минус значение и следующее значение плюс. Его программа для вычисления геометрии. Шаг равен 0,25. Потому что, когда я использую 'def frange (start, stop, step = 1.0): , а start <= stop: start start start + = step' каждый раз, когда' [-5, -4.75 ... 0 .. ., 4.75, 5] ' –

+0

Почему это должна быть функция лямбда, а не обычная функция? – Kevin

ответ

3

Может быть, вы имели в виду генератор вместо лямбда:

def opposing_numbers(increment, maximum): 
    yield 0 
    value = increment 
    while value <= maximum: 
     yield -value 
     yield value 
     value += increment 

Затем назовите его так:

opposing_numbers(0.25, 5) 
+0

Это лучший ответ. Решение numpy также хорошо, но для этого не требуется сторонний пакет. Но вам не нужно переносить вызов в «список». И вы забыли закрытие ')'. –

+0

Спасибо @ HåkenLid. Я завернул его в список, чтобы явно соответствовать запросу OP, и потому, что я изначально собирался распечатать это, но вы абсолютно правы. Лучше просто снять его. Тогда мне не нужно закрывать скобки :) – mhlester

3

Вы можете использовать функцию numpy.arange(), а затем отсортировать значения по абсолютной величине:

answer = sorted(np.arange(-5, 5.25, 0.25), key=abs) 
print(answer) 

Выходной

[0.0, 
-0.25, 
0.25, 
-0.5, 
0.5, 
..., 
-4.5, 
4.5, 
-4.75, 
4.75, 
-5.0, 
5.0] 
+0

FWIW, 'key = lambda x: abs (x)' можно укоротить: 'key = abs'. – vaultah

+0

Хорошая точка, обновление .... – gtlambert

1

Попробуйте это:

[(i // 2) * 0.25 * (2*(i&1)- 1) for i in range(1,42)] 
0

здесь прохладное один лайнер

from itertools import chain 

list(chain(*zip([i /4.0 for i in range(10)], [-i/4.0 for i in range(9)]))) 

[0,0, 0,0, 0,25, -0,25, 0,5, -0,5, 0,75, - 0,75, 1,0, -1,0, 1,25, -1,25, 1,5, -1,5, 1,75, -1,75, 2,0, -2,0]