کاربرد _ در پایتون + ویدیو

شاید خیلی از توسعه‌دهنده‌های پایتون خبری از وجود _ به عنوان یک ابزار مهم نداشته باشند. در واقع خودم یکی از اون‌ها بودم. خب باید بگم که این علامت ( _ ) که به انگلیسی میشه Undrescore در جاهای مختلفی از برنامه کاربرد داره. بیایید به کاربردهاش یه نگاهی بندازیم. https://www.aparat.com/v/3KdmG کاربرد اول: استفاده در مفسر پایتونآخرین دستوری که منجر به یه خروجی شده چیه؟ حالا اون خروجی دقیقا چیه؟ اگه می‌خواید به اون مقدار دسترسی داشته باشید کافیه که توی خود مفسر تعاملی پایتون عملگر _ رو وارد بکنید. مثلا:>>> a = 20 >>> a 20 >>> _ 20 >>> _ - 10 10کاربرد دوم: نادیده گرفتن مقادیرزمانی که بخواید یه مقداری یا مقادیری رو در برای انتساب‌های جمعی نادیده بگیرید می‌تونید از ـ استفاده کنید. برای روشن شدن قضیه به کد زیر نگاه کنید:a, _, b = (1, 2, 3) # a = 1, b = 3 print(a, b)مقدار ۲ در هیچ متغیری ذخیره نمیشه. اگر هم از یک علامت ستاره قبل از آندرسکور استفاده کنید یک بازه از مقادیر رو بیخیال میشه:a, *_, b = (7, 6, 5, 4, 3, 2, 1) print(a, b)کاربرد سوم: استفاده در حلقه‌هامی‌تونید بجای استفاده از متغیر در یک حلقه for از یک آندرسکور استفاده کنید:for _ in 'Arastoo': print( _ )کاربرد چهارم: جدا کردن ارقاموقتی می‌خواید یه مقدار عددی بزرگ رو در یک متغیر قرار بدید، اگه نمی‌تونید که درست از تعداد ارقام متوجه بشید می‌تونید با _ اون‌ها رو از هم جدا بکنید. البته این تنها یک موضوع ظاهریه و چیزی رو توی متغیر غیر از عدد واقعی ذخیره نمیکنه:million = 1_000_000 binary = 0b_0010 octa = 0o_64 hexa = 0x_23_abکاربرد پنجم: مهمترین مورد: نام گذاریچهار حالت برای نام‌گذاری متغیر با استفاده از _ وجود دارد:استفاده از _ قبل از نام متغیراستفاده از _ بعد از نام متغیراستفاده از دو _ قبل از نام متغیراستفاده از دو _ قبل و بعد از نام متغیراستفاده از _ قبل از نام متغیرclass Test: def __init__(self): self.name = &quotdatacamp&quot self._num = 7 obj = Test() print(obj.name) print(obj._num)در قواعد پایتون ذکر شده که برای خصوصیاتی که می‌خواهید Private باشند از یک _ قبل از نام آن‌ها استفاده کنید. البته این موضوع در روند اجرا کاری انجام نمی‌دهد اما اگر بخواهید اصولی کد بنویسید باید این موضوع را در نظر داشته باشید.البته برای توابع می‌شود از چنین قابلیتی حتی در روند اجرا نیز استفاده کرد. به تکه کد زیر نگاه کنید:def func(): return &quotdatacamp&quot def _private_func(): return 7حالا اگه بخوام که تابع رو توی یه ماژول دیگه import بکنم با تابع func مشکلی نخواهد داشت ولی تابع _private_func رو نمیتونم import بکنم:>>> from my_functions import * >>> func() 'datacamp' >>> _private_func() Traceback (most recent call last): File &quot<stdin>&quot, line 1, in <module> NameError: name '_private_func' is not definedالبته اگه شیوه import کردن رو تغییر بدم و مستقیم از نام تابع همراه با ماژول استفاده بکنم همچین قابلیتی غیرفعال میشه:>>> import my_functions >>> my_functions.func() 'datacamp' >>> my_functions._private_func() 7ظاهرا تنها زمانی که بخواید به صورت غیر مستقیما (تکنیکالی اینم اشتباهه) از تابع استفاده کنید به شما خطا میده.استفاده از _ بعد از نام متغیرزمانی که مجبور باشید از یک نام برای متغیر استفاده بکنید که همزمان اون نام کلمه کلیدی پایتون هستش می‌تونید یک _ به آخرش اضافه کنید:>>> def function(class): File &quot<stdin>&quot, line 1 def function(class): ^ SyntaxError: invalid syntax >>> def function(class_): ... passاستفاده از دو _ قبل از نام متغیرتصور کنید که شما دو کلاس دارید که هر دو یک خصوصیت با یک اسم دارند. حالا شما یک کلاس سوم هم دارید که از هر دو کلاس قبلی میخواد ارث‌بری بکنه، زمانی که بخواد به هر دو خصوصیت دسترسی داشته باشه به مشکل بر می‌خوره چرا که نمی‌تونه همزمان از دو خصوصیت با یک نام استفاده بکنه. پایتون برای حل این مشکل با تکنیک name mangling از ما پذیرایی میکنه.مثال:class Sample(): def __init__(self): self.a = 1 self._b = 2 self.__c = 3 obj1 = Sample()برای دسترسی داشتن به خصوصیات a و b و c چه کاری انجام می‌دهید:print(obj1.a) print(obj1._b) print(obj1.__c)حالا اگر برنامه رو اجرا بکنید با مشکل روبرو می‌شید. چرا که ما عضوی به اسم __c رو نداریم. بجاش پایتون می‌آد اون عضور رو _Sample__c معرفی میکنه. یعنی ترکیبی از نام کلاس و خود خصوصیت. اینطوری دیگه مشکلی پیش نمیاد.برای درک بهتر قضیه پیشنهاد میکنم ویدیو اول این مطلب رو ببینید.استفاده از دو _ قبل و بعد از نام متغیرتوی پایتون به متدهایی که به شکل زیر هستند میگیم متدهای جادویی یا داندر متد. این دستورات ابزارهای پیشفرض پایتونی هستند.class Sample(): def __init__(self): self.__num__ = 7 obj = Sample() obj.__num__بهتره هیچوقت برای اسم گذاری‌هامون از این سبک استفاده نکنیم چرا که ممکنه با دستورات اصلی پایتون اشتباه گرفته بشن.منبعhttps://www.datacamp.com/community/tutorials/role-underscore-python<br/>