কী 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__
(একটি স্থান সহ) ব্যবহার করতে পারেন