for-loop с лямбда-функцией в python [дубликат]

Ваша проблема (не используя целочисленную арифметику) была подметена под вашим ковром для вас Python 3.2:

Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 15511210043330985984000000 / (479001600 * 6227020800)
5200300.0
>>> repr(15511210043330985984000000 / (479001600 * 6227020800))
'5200300.0'
>>> int(15511210043330985984000000 / (479001600 * 6227020800))
5200300

Python 3.1.3 (r313:86834, Nov 27 2010, 18:30:53) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 15511210043330985984000000 / (479001600 * 6227020800)
5200299.999999999
>>> repr(15511210043330985984000000 / (479001600 * 6227020800))
'5200299.999999999'
>>> int(15511210043330985984000000 / (479001600 * 6227020800))
5200299

Я озадачен: предположительно вы использовали int(), потому что поняли, что это создавая ответ float. Почему вы не приняли (очевидный?) Следующий шаг округления, например

[3.1.3]
>>> int(round(15511210043330985984000000 / (479001600 * 6227020800)))
5200300

?

3
задан R4PH43L 29 November 2015 в 15:44
поделиться

1 ответ

Пожалуйста, прочитайте о минимальных примерах . Не читая ваш код, я считаю, что вы столкнулись с хорошо известной проблемой, рассмотренной в предыдущих вопросах и ответах, для которых требуется две строки. Имена в телах функций оцениваются при выполнении функции.

funcs = [lambda: i for i in range(3)]
for f in funcs: print(f())

печатает «2» 3 раза, потому что 3 функции идентичны, а «i» в каждом не оценивается до вызова, когда i == 2. Однако

funcs = [lambda i=i:i for i in range(3)]
for f in funcs: print(f())

создает три разные функции, каждая из которых имеет другое фиксированное значение, поэтому печатаются 0, 1 и 2. В вашем заявлении

__cMenu.add_command(label="{}".format(option),
    command=lambda: self.filter_records(column, option))

добавьте option=option до :, чтобы записать различные значения option. Возможно, вы захотите переписать в качестве

lambda opt=option: self.filter_records(column, opt)

, чтобы дифференцировать переменную цикла из параметра функции. Если column изменился в цикле, ему понадобится такая же обработка.

6
ответ дан Terry Jan Reedy 16 August 2018 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: