
Nikolay
05.04.2017
12:30:43
пасяба

Ilia
05.04.2017
12:36:31
Лайк!

Ramil
05.04.2017
12:46:06
У меня такой вопрос
допустим у меня есть цикл
while f(a) != a:
do_something(a, f(a))
Причем f(a) очень трудно вычисляется. Но как видно, если писать так, приходиться считать ее значение 2 раза. Я могу написать что-то вроде
while True:
x = f(a)
if x == a:
break
do_something(a, x)
Здесь f(a) вычисляется единожды, но появляется while True, а это, как я знаю, считается плохим стилем
Есть какие-то другие способы справиться с проблемой?

Aragaer
05.04.2017
12:51:44
нет

Google

Aragaer
05.04.2017
12:52:58
в С бы тут адекватно сработало бы присваивание перед проверкой - while ((x = f(a)) != a) do_something(a, x);
но я сомневаюсь, что в питоне такое покатит

Artem
05.04.2017
12:53:27
Не покатит
Ассайнмент стейтмент не экспрешн
Значения не имеет

Nikolay
05.04.2017
12:54:47
У меня такой вопрос
допустим у меня есть цикл
while f(a) != a:
do_something(a, f(a))
Причем f(a) очень трудно вычисляется. Но как видно, если писать так, приходиться считать ее значение 2 раза. Я могу написать что-то вроде
while True:
x = f(a)
if x == a:
break
do_something(a, x)
Здесь f(a) вычисляется единожды, но появляется while True, а это, как я знаю, считается плохим стилем
Есть какие-то другие способы справиться с проблемой?
кстати, судя по коду, ты проверяешь сходимость какой-то функции, то есть итерируешься, пока она не сойдется
если у тебя a - float, то такой код писать не стоит

Aragaer
05.04.2017
12:55:16
и в этом случае разумнее проверять не равенство, а близость, да

Ramil
05.04.2017
12:56:45
а while True в таких случаях писать - это ок?

Artem
05.04.2017
12:58:11
Почему нет

Igor
05.04.2017
12:59:16
почему вообще это не ок считается

Artem
05.04.2017
12:59:32
потому что явное лучше неявного

Google

Artem
05.04.2017
12:59:43
в том числе явное условие завершение работы цикла

Igor
05.04.2017
13:00:27
справедливо, туплю

Artem
05.04.2017
13:00:45
Но при этом
Special cases aren't special enough to break the rules.
Although practicality beats purity.
так что в таких случаях писать - это ок.

Aragaer
05.04.2017
13:01:12
ну тут по сути цикл с выходом посередине

Pavel
05.04.2017
13:01:15

Aragaer
05.04.2017
13:01:25
не предусловие и не постусловие, а вообще посередине

Artem
05.04.2017
13:01:42
ну тогда надо ее вне цикла инициализировать

Aragaer
05.04.2017
13:01:44
не, если f(a) == a, то не надо выполнять do_somethin

Artem
05.04.2017
13:01:49
можно так, да

Aragaer
05.04.2017
13:02:38
и еще одно замечание - можно True заменить на какое-то другое условие. Например счетчик
типа 100 раз пробуем, потом выходим
и добавить else на этот случай

Sergey
05.04.2017
13:04:31
По-моему, проще добавить условие
По-моему, логика усложняется.
While True:
i++
if (i == 100) {
break;
}
Гм, прикольно заглючило.
Либо вместо break -> raise exception

Aragaer
05.04.2017
13:07:05
не
for _ in range(100):
x = f(a)
if x == a:
break
do_something(a, x)
else:
print("Not reached in 100 steps")

Google

Sergey
05.04.2017
13:08:21
int count =0;
While f(a) != a:
if (count == 100) {
raise expection
}
do_something(a,x)

Aragaer
05.04.2017
13:08:50
а инкрементить кто будет? 8)
а можно сделать генератор и завернуть туда вычисление последовательности
когда очередной элемент равен a, генератор заканчивается

Sergey
05.04.2017
13:10:02
i++
забыл, да.

Aragaer
05.04.2017
13:10:38
def my_gen(a):
while True:
x = f(a)
if x == a:
break
else:
yield x
for x in my_gen(a):
do_something(a, x)
чтоб разделить do_something и f(a)

Sergey
05.04.2017
13:11:23
Это имеет смысл, если фукнция используется в нескольких местах (DRY и тэ пэ)
но если в одном, опять же имхо, усложнение логики

53r63rn4r
05.04.2017
13:12:05

Aragaer
05.04.2017
13:12:26
ну да. Вобщем надо так - сначала написать с двумя вызовами f, а потом сделать через while True с одним. И все.

Nikolay
05.04.2017
13:12:27

Aragaer
05.04.2017
13:12:31
просто, наглядно, понятно
поведение не поменялось, логика не поменялась, скорость повысилась

53r63rn4r
05.04.2017
13:13:58
такой вопрос: как быстро сварганить и какие тесты нужно написать, чтобы не было излишнего. Цитирую из полученного на почту: "Тесты тоже было бы интересно увидеть (естественно без фанатизма, но чтобы "набросать" подход)."

Nikolay
05.04.2017
13:14:33

53r63rn4r
05.04.2017
13:14:48
джанго приложение тестовое(маленькое), писать интеграционные только?

Aragaer
05.04.2017
13:14:58
если юнит тесты - то на граничные значения, на что-то разумное, на что-то неразумное
интеграционные - на что-то разумное ок, на неразумное это уже "фанатизм"

Google

53r63rn4r
05.04.2017
13:15:59

Sergey
05.04.2017
13:15:59
"разумное" это не интеграционные
"разумное" это критичные узлы

Nikolay
05.04.2017
13:16:06
очень общий вопрос. Хотят "какие-нибудь тесты" - напиши какие-нибудь тесты

Sergey
05.04.2017
13:16:10
биллинг тому пример

53r63rn4r
05.04.2017
13:17:12
я просто использую из тестов(если и говнякаю), то только ассертеквал и ассертисинстанс

Aragaer
05.04.2017
13:18:00
разумное это в смысле пользователь vasya, который не будет пытаться в поле "пол" вводить значение m'; drop table users; --
неразумное это соответственно полноценная валидация

Admin
ERROR: S client not available

b0g3r
05.04.2017
13:18:46

53r63rn4r
05.04.2017
13:18:56
Я не уверен что джанга это скушает

Aragaer
05.04.2017
13:19:05
разумные значения позволяют более-менее пройти всю цепочку

53r63rn4r
05.04.2017
13:19:11

b0g3r
05.04.2017
13:19:17
ну и хватит)00

Aragaer
05.04.2017
13:19:21
а неразумные это именно проверка валидности

53r63rn4r
05.04.2017
13:19:21
хотя этих ассертов там дохуа

Проксимов
05.04.2017
13:20:59
Боже храни этого человека, который это сделал

b0g3r
05.04.2017
13:21:22
это что, скриншот картинки?)
бамп вопросу и здесь

Google

b0g3r
05.04.2017
13:21:37
Подскажите за реализацию очереди, в которой должно выполняться условие обработки не больше n элементов в секунду?
Мне нужно тащить какой-нибудь RabbitMQ или можно это средствами питона сделать без особого напряга?
Конкретно этот таск в контексте ограничения API на количество обращений в секунду. Обращения, по сути, генерируются пользователями и бывают пики, когда превышаю лимит
Сейчас просто херачу паузу как отловлю ошибку, а хочется делать как-нибудь более по уму

Андрей
05.04.2017
13:21:43
очень смешная картинка, зацените, посоны

53r63rn4r
05.04.2017
13:22:08
лол

Sergey
05.04.2017
13:22:34
Для тех кто в танке - в чем там соль? Что за чел? Что такое докер?

Андрей
05.04.2017
13:22:50
из-за которой школьники на митинг с навальным идут

Sergey
05.04.2017
13:23:01
Что за игра про синего кита?...

Eldar
05.04.2017
13:23:03

Проксимов
05.04.2017
13:23:06

Андрей
05.04.2017
13:23:21

b0g3r
05.04.2017
13:23:24

Sergey
05.04.2017
13:23:27
Я просто погрузился в чудесный мир явы. Поэтому отстал от жизни

What
05.04.2017
13:23:48

Андрей
05.04.2017
13:24:06

b0g3r
05.04.2017
13:24:29
зрада

Sergey
05.04.2017
13:24:38
Рутрекер тоже заблокировали.