LINUX.ORG.RU

[Python] Списковые включения: кто может это объяснить?

 


0

1
>>> import math
>>> sin, cos, tan = [lambda x: fun(math.radians(x)) for fun in math.sin, math.cos, math.tan]
>>> sin(30), cos(30), tan(30)
(0.5773502691896257, 0.5773502691896257, 0.5773502691896257)
>>> asin, acos, atan = [lambda x: math.degrees(fun(x)) for fun in math.asin, math.acos, math.atan]
>>> asin(.5), acos(.5), atan(.5)
(26.56505117707799, 26.56505117707799, 26.56505117707799)
>>> asin(30), sin(30)
(88.09084756700362, 0.48234790710102493)
>>> sin1, cos1, tan1 = [lambda x: fun(math.radians(x)) for fun in math.sin, math.cos, math.tan]
>>> sin(30), cos(30), tan(30)
(0.5773502691896257, 0.5773502691896257, 0.5773502691896257)
>>> sin1(30), cos1(30), tan1(30)
(0.5773502691896257, 0.5773502691896257, 0.5773502691896257)
>>> asin(.5), acos(.5), atan(.5)
(31.300827005537716, 31.300827005537716, 31.300827005537716)
>>> 
>>> # ну что за хрень та?
...
>>> sin = lambda x: math.sin(math.radians(x))
>>> sin(30)
0.49999999999999994
>>> 

на двух машинах повторяется:

Python 2.7.1 (r271:86832, Apr 12 2011, 16:16:18) 
[GCC 4.6.0 20110331 (Red Hat 4.6.0-2)] on linux2
Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2


Потому что:

>>> import math
>>> sin, cos, tan = [lambda x: fun(math.radians(x)) for fun in math.sin, math.cos, math.tan]
>>> del fun
>>> sin(30), cos(30), tan(30)
NameError: global name 'fun' is not defined
vasilenko ★★
()
Ответ на: комментарий от vasilenko

Мда, не ожидал как-то.

sin, cos, tan = [lambda x, fun=fun: fun(math.radians(x)) for fun in math.sin, math.cos, math.tan]
Спасибо.

kefka
() автор топика

>>> asin(30)

O_O??? В военное время косинус конечно может быть больше единицы, но что бы синус был равен ТРИДЦАТИ...

AIv ★★★★★
()
Ответ на: комментарий от AIv

В военное время косинус конечно может быть больше единицы, но что бы синус был равен ТРИДЦАТИ

не верьте училкам

>>> import cmath
>>> cmath.asin(30)
(1.5707963267948966-4.0940666686320855j)
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.