क्या है f = 1..__truediv__
?
f
एक मान के साथ एक फ्लोट पर एक बाध्य विशेष विधि है। विशेष रूप से,
1.0 / x
पायथन 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
यदि हम एक तंग पाश में उस बिंदीदार खोज कर रहे थे, तो यह थोड़ा समय बचा सकता है।
सार सिंटेक्स ट्री (एएसटी) को पार्स करना
हम देख सकते हैं कि अभिव्यक्ति के लिए एएसटी को पार्स करना हमें बताता है कि हमें __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'>
अगली बिंदी अपने आप में एक वाक्य रचना होगी, लेकिन यह फ्लोट के उदाहरण पर एक बिंदीदार खोज शुरू करती है:
>>> 1..__truediv__
<method-wrapper '__truediv__' of float object at 0x0D1C7BF0>
किसी और ने इसका उल्लेख नहीं किया है - यह अब फ्लोट पर एक "बाध्य विधि" है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__
(एक स्थान के साथ) `