무엇입니까 f = 1..__truediv__
?
f
값이 1 인 float의 바운드 특수 메소드입니다. 구체적으로 특별히,
1.0 / x
Python 3에서 다음을 호출합니다.
(1.0).__truediv__(x)
증거:
class Float(float):
def __truediv__(self, other):
print('__truediv__ called')
return super(Float, self).__truediv__(other)
과:
>>> one = Float(1)
>>> one/2
__truediv__ called
0.5
우리가 할 경우 :
f = one.__truediv__
우리는 그 바인딩 된 메소드에 바인딩 된 이름을 유지합니다
>>> f(2)
__truediv__ called
0.5
>>> f(3)
__truediv__ called
0.3333333333333333
빡빡한 루프에서 점선으로 된 조회를 수행하면 시간이 약간 절약 될 수 있습니다.
AST (Abstract Syntax Tree) 구문 분석
표현식에 대해 AST를 구문 분석 __truediv__
하면 부동 소수점 숫자 에서 속성을 가져오고 있음을 알 수 있습니다 1.0
.
>>> import ast
>>> ast.dump(ast.parse('1..__truediv__').body[0])
"Expr(value=Attribute(value=Num(n=1.0), attr='__truediv__', ctx=Load()))"
다음과 같은 결과 함수를 얻을 수 있습니다.
f = float(1).__truediv__
또는
f = (1.0).__truediv__
공제
공제를 통해 도착할 수도 있습니다.
그것을 구축합시다.
1 자체는 int
:
>>> 1
1
>>> type(1)
<type 'int'>
플로트 후 마침표가있는 1 :
>>> 1.
1.0
>>> type(1.)
<type 'float'>
다음 점 자체는 SyntaxError이지만 float 인스턴스에서 점으로 된 조회를 시작합니다.
>>> 1..__truediv__
<method-wrapper '__truediv__' of float object at 0x0D1C7BF0>
아무도 이것을 언급하지 않았습니다 -이것은 이제 float에서 "바운드 메소드" 입니다 1.0
.
>>> f = 1..__truediv__
>>> f
<method-wrapper '__truediv__' of float object at 0x127F3CD8>
>>> f(2)
0.5
>>> f(3)
0.33333333333333331
동일한 기능을 훨씬 더 쉽게 읽을 수 있습니다.
>>> def divide_one_by(x):
... return 1.0/x
...
>>> divide_one_by(2)
0.5
>>> divide_one_by(3)
0.33333333333333331
공연
divide_one_by
함수 의 단점은 또 다른 파이썬 스택 프레임이 필요하다는 것인데, 바운드 메소드보다 약간 느립니다.
>>> def f_1():
... for x in range(1, 11):
... f(x)
...
>>> def f_2():
... for x in range(1, 11):
... divide_one_by(x)
...
>>> timeit.repeat(f_1)
[2.5495760687176485, 2.5585621018805469, 2.5411816588331888]
>>> timeit.repeat(f_2)
[3.479687248616699, 3.46196088706062, 3.473726342237768]
물론 일반 리터럴 만 사용할 수 있다면 훨씬 빠릅니다.
>>> def f_3():
... for x in range(1, 11):
... 1.0/x
...
>>> timeit.repeat(f_3)
[2.1224895628296281, 2.1219930218637728, 2.1280188256941983]
(1).__truediv__
동일 하지 않습니다 . 또는 (공백과 함께)`1..__truediv__
int.__truediv__
float.__truediv__
1 .__truediv__