معرفی برخی از پرکاربردترین فانکشن‌های Built-in در زبان برنامه‌نویسی پایتون


در آموزش‌های گذشته با چند مورد از فانکشن‌های به اصطلاح Built-in در پایتون همچون ()print و ()input آشنا شدیم و در این آموزش نیز قصد داریم تا به معرفی چند فانکشن پرکاربرد دیگر در زبان برنامه‌نویسی پایتون بپردازیم.

پیش از شروع بحث، بهتر است کمی در مورد اعداد صحبت کنیم. احتمالاً برای همۀ شما پیش آمده که اخبار هواشناسی را پیگیری کنید که در آن هواشناسان برای بیان وضعیت هوا معمولاً از معیار درجۀ حرارت استفاده می‌کنند به طوری که در برخی مواقع مثلاً دمای هوا را 10- درجۀ سانتی‌گراد اعلام می‌کنند اما آیا می‌دانید منظور از علامت منفی در این مورد چیست و این لغت چه مفهومی دارا است؟ برای آگاهی از این موضوع باید ببینیم که معیار اندازه‌گیری دما به چه شکل تعیین می‌شود.

بر اساس استانداردهای جهانی، معیار درجۀ سانتی‌گراد یا درجۀ سلسیوس بدین صورت تعیین می‌شود که دمایی که آب خالص در آن یخ می‌زند برابر با صفر درجه در نظر گرفته شده و هر دمایی بیشتر از آن با یک عدد مثبت و کمتر از این مقدار نیز با عددی منفی بیان می‌شود و از همین روی اعداد منفی در این مورد نشان‌دهندۀ دمایی پایین‌تر از مقدار شاخص می‌باشند و اعداد مثبت نیز بیان‌گر مقداری بالاتر از شاخص هستند.

به همین ترتیب، اعداد مثبت و منفی در بسیاری موضوعات دیگر نیز معنا پیدا می‌کنند که به عنوان مثالی دیگر می‌توان حساب‌های بانکی را در نظر گرفت بدین صورت که تا وقتی هیچ پولی در حساب خود نداریم اعتبار حساب‌مان صفر است و چنانچه پولی به حساب خود واریز کنیم، مقدار اعتبار مثبت شده و مبلغ اضافه‌شده نیز با علامت مثبت در حساب مربوطه ثبت می‌گردد اما در صورتی که از حساب خود پولی برداشت کنیم از اعتبار آن کم شده و مقدار برداشت‌شده نیز با علامتی منفی در آن ثبت می‌گردد.

در مورد وام‌های بانکی نیز زمانی که وامی دریافت می‌کنیم و به بانک بدهکار می‌شویم، اعتبار حساب منفی شده و با پرداخت اقساط وام، کم‌کم اعتبار مثبت به حساب خود اضافه می‌کنیم تا زمانی که این اعتبار مثبت اعتبار منفی را خنثی کرده و تمامی مبلغ وام تسویه می‌شود و میزان بدهی ما به بانک به صفر می‌رسد (البته وام‌های بانکی در ایران مثال خوبی برای یادگیری مفهوم اعداد مثبت و منفی نیست چرا که مجموع اقساط پرداخت‌شده با میزان وام دریافتی در آن‌ها برابر نیست اما به هر حال در این مثال فرض می‌کنیم که در یک کشور مسلمان به معنای واقعی کلمه زندگی می‌کنیم و منظور از وام، قرض‌الحسنه بوده است!)

حال مثالی از دنیای برنامه‌نویسی را در نظر بگیرید که در آن قصد داریم تا یک بازی کامپیوتری توسعه دهیم به طوری که در آن بازیکنی داریم که در ابتدا روی مرکز صفحۀ نمایش قرار دارد و با آغاز بازی شروع به حرکت می‌کند تا در صفحه جابه‌جا شود که به منظور مشخص کردن وضعیت حرکت بازیکن در صفحه می‌توانیم از یک جفت عدد مرتب استفاده کنیم که به صورت (a, b) نمایش داده می‌شوند و در آن عدد a اندازۀ حرکت بازیکن در جهت چپ یا راست و عدد b نیز اندازۀ حرکت در جهت بالا یا پایین را مشخص می‌کند و برای مشخص کردن جهت حرکت نیز برای هر یک از اعداد a و b علامتی را در نظر می‌گیریم بدین صورت که در حرکت بازیکن به سمت راست علامت عدد a مثبت شده و حرکت بازیکن به سمت چپ نیز منجر به منفی شدن عدد a می‌گردد و به همین ترتیب در حرکت بازیکن به سمت بالا مقدار عدد b مثبت شده و حرکت به سمت پایین نیز با مقداری منفی برای عدد a نشان داده می‌شود.

نکته
تمامی انواع مختلف اعداد همچون اعداد صحیح و اعشاری می‌توانند به صورت عددی مثبت و منفی نوشته شوند و اعداد مختلط نیز هر یک از بخش‌های حقیقی یا انتزاعی می‌توانند علامت مثبت یا منفی بگیرند.

فانکشن ()abs
حال که معنای اعداد مثبت و منفی را درک کردیم، به سراغ فانکشن ()abs می‌رویم که در ریاضیات به تابع قدر مطلق معروف است و در پایتون نیز به منظور تبدیل عدد منفی به مقدار مثبت آن به کار گرفته می‌شود. در واقع، فانکشن ()abs زمانی مورد استفاده قرار می‌گیرد که یک عدد علامت‌دار داشته باشیم اما صرفاً اندازۀ آن برای ما مهم باشد که برای مثال می‌توان بازی کامپیوتری فوق‌الذکر را در نظر گرفت که در آن می‌خواهیم از میزان حرکت افقی بازیکن مطلع شویم اما جهت حرکت آن به چپ یا راست اهمیتی در حل مسئله نداشته باشد یا به عنوان مثالی دیگر می‌توان به محاسبۀ مجموع مبالغ برداشتی از حساب بانکی اشاره کرد که در این صورت دیگر نیازی به مشخص کردن علامت اعداد نداریم چرا که می‌دانیم ماهیت آن‌ها منفی است.

در چنین مواردی برای پیدا کردن اندازۀ اعداد که یک مقدار مثبت است از فانکشن ()abs استفاده می‌کنیم بدین صورت که عدد مد نظر را به عنوان آرگومان ورودی به فانکشن مذکور می‌دهیم و در ادامه اندازۀ اعداد به روش زیر محاسبه می‌شود:

- اگر علامت عدد مثبت باشد، اندازۀ آن برابر با خود عدد است.
- و اگر عدد مذکور منفی باشد، علامت آن تغییر کرده و اندازۀ عدد برابر با مقدار مثبت‌اش خواهد بود.

برای درک بهتر کاربرد این فانکشن، چند مثال را در ادامه آورده‌ایم اما توجه داشته باشید که تمامی اعداد به صورت پیش‌فرض مثبت هستند و از همین روی در اغلب موارد علامت + در کنار آن‌ها نوشته نشده است:

>>> abs(5.45)
5.45
>>> abs(-4)
4
>>> abs(0)
0
>>> abs(-0.876)
0.876
>>> abs(4-3j)
5.0

همان‌طور که در دستور آخر می‌بینید، در صورتی که یک عدد مختلط را به عنوان آرگومان ورودی به فانکشن ()abs بدهیم، مقدار عدد مربوط به اندازۀ آن در خروجی ریترن می‌شود و توجه داشته باشیم که اندازۀ عدد مختلطی همچون a + bj در سینتکس زبان برنامه‌نویسی پایتون طبق دستور زیر محاسبه می‌شود:

(a ** 2 + b ** 2) ** (1 / 2)

بر اساس دستور فوق، مفسر پایتون ابتدا هر یک از اعداد a و b را به توان ۲ رسانده و در ادامه آن‌ها را با هم جمع می‌کند و در نهایت مقدار جذر عدد حاصل را در خروجی برمی‌گرداند.

فانکشن ()float
کاربرد این فانکشن دقیقاً مشابه فانکشن ()int است که در آموزش قبل با آن آشنا شدیم بدین معنی که از فانکشن ()float نیز برای تبدیل استرینگ به عدد استفاده می‌شود با این تفاوت که دیتا تایپ عددی که ریترن‌ شده است اعشاری می‌باشد که در ادامه چند مثال از کاربرد این فانکشن را می‌بینید:

>>> float("3.146536")
3.146536
>>> x = float("432") + 7
>>> x
439.0
>>> float()
0.0

همان‌طور که می‌بینید، خروجی فانکشن ()float بدون آرگومان ورودی مقداری برابر با 0.0 است.

فانکشن ()id
این فانکشن یک آبجکت را به عنوان ورودی گرفته و در ادامه عددی را در خروجی ریترن می‌کند که نشان‌دهندۀ به اصطلاح Identity (هویت) منحصربه‌فرد و مستقل آن از سایر آبجکت‌ها است که به عنوان مثال دستور زیر را مد نظر قرار می‌دهیم:

>>> id("SokanAcademy.com")
37925952

به نوعی می‌توان گفت عدد فوق مربوط به آدرس مکانی از حافظه است که آبجکت مد نظر در آن ذخیره شده است.

فانکشن ()len
این فانکشن یک آبجکت را به عنوان پارامتر ورودی گرفته و طول آن را در خروجی برمی‌گرداند. برای مثال، اگر یک استرینگ را به عنوان آرگومان ورودی به این فانکشن بدهیم، تعداد کاراکترهای آن را نمایش می‌دهد و در مورد آرگومان ورودی از نوع عدد نیز تعداد ارقام را در خروجی چاپ می‌کند:

>>> len('345')
3

نکتۀ قابل‌توجه در مثال فوق این است که عدد 345 را مابین علائم ' ' قرار داده و آن را به یک استرینگ تبدیل کرده‌ایم چرا که آرگومان ورودی به این فانکشن حتماً باید از نوع دنباله باشد و استرینگ‌ها نیز برخلاف اعداد از نوع دنباله هستند. حال اگر بخواهیم عدد فوق را بدون علائم کوتیشن به فانکشن ()len بدهیم خواهیم داشت:

>>> len(324)
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in 
    len(324)
TypeError: object of type 'int' has no len()

همان‌طور که مشاهده می‌کنید، دستور فوق منجر به ارور شده است چرا که آرگومان ورودی به فانکشن ()len از نوع دادۀ عددی می‌باشد.

فانکشن ()pow
این فانکشن دو پارامتر ورودی تحت عناوین فرضی x و y گرفته و مقدار عدد مربوط به پارامتر اول را به توان مقدار عدد متناظر با پارامتر دوم می‌رساند؛ به عبارت دیگر، کارکردی معادل عملگر ** دارا است که در ادامه به منظور درک بهتر این فانکشن مثالی را مد نظر قرار می‌دهیم:

>>> pow(2, 3)
8

البته در برخی موارد ممکن است که این فانکشن سه آرگومان ورودی داشته باشد که در این صورت برای نمایش خروجی، مفسر پایتون ابتدا مقدار عدد آرگومان اول را به توان آرگومان دوم رسانده سپس حاصل عملیات را بر مقدار عدد آرگومان سوم تقسیم کرده و در نهایت باقی‌مانده را در خروجی برمی‌گرداند و کارکرد آن نیز معادل دستور x ** y) % z) می‌باشد با این تفاوت که فانکشن ()pow حاصل عبارت را با سرعت بیشتری به دست می‌آورد که به عنوان مثالی از کاربرد این فانکشن با سه آرگومان ورودی دستور زیر را داریم:

>>> pow(2, 3, 7)
1

در مثال فوق، ابتدا عدد 2 به توان 3 رسیده و سپس حاصل آن که عدد 8 است بر عدد 7 تقسیم شده و باقی‌ماندۀ عملیات تقسیم در خروجی نمایش داده می‌شود.

فانکشن ()repr
این فانکشن یک آبجکت را به عنوان پارامتر ورودی گرفته و آن را به صورت یک استرینگ برمی‌گرداند. برای مثال، اگر عدد 3 را به عنوان آرگومان ورودی به این فانکشن بدهیم، نتیجه استرینگی است که کاراکتر 3 را نشان می‌دهد:

>>> repr(3)
'3'

البته نمی‌توان تمامی آبجکت‌ها را به راحتی به صورت استرینگ درآورد و این به ماهیت آبجکت مذکور بستگی دارد که از همین روی خروجی فانکشن ()repr برای برخی آبجکت‌ها به صورت استرینگی است که غالباً بیانگر نوع، نام و شناسه (آی‌دی) آن آبجکت است.

همان‌طور که می‌دانیم، زبان برنامه‌نویسی پایتون شیئ‌گرا است و هر فانکشن در آن به عنوان یک آبجکت در نظر گرفته می‌شود که از همین روی می‌توانیم فانکشنی همچون ()print را به عنوان آرگومان ورودی به فانکشن ()repr داده و خروجی آن را ببینیم:

>>> repr(print)
'<built-in function print>'

همان‌طور که مشاهده می‌کنید، خروجی فانکشن ()repr در مثال فوق استرینگی است که در آن آرگومان ورودی یک فانکشن Built-in تحت عنوان آن ()print معرفی شده است.

فانکشن ()round
همان‌طور که از نام این فانکشن مشخص است، ()round برای رُند کردن اعداد به کار می‌رود به طوری که دو پارامتر ورودی می‌گیرد که پارامتر اول برای دریافت عدد اعشاری به منظور رُند کردن آن و پارامتر دوم نیز یک عدد صحیح است و مشخص می‌کند که عدد اعشاری مذکور را باید تا چند رقم رُند کرد یا عدد اعشاری رُندشده پس از نقطۀ اعشار چند رقم داشته باشد. برای مثال، اگر آرگومان ورودی دوم برابر با 2 باشد بدین معنی است که عدد اعشاری تنها باید تا دو رقم بعد از اعشار ادامه پیدا کند و مابقی ارقام آن حذف شوند که پس از حذف ارقام نیز عدد اعشاری حاصل به نزدیک‌ترین عدد گرد می‌شود که برای نمونه چند مثال از کاربرد این فانکشن را در ادامه می‌بینید:

>>> round(2.745, 2)
2.75
>>> round(0.45637, 3)
0.456
>>> round(13.798765, 0)
14.0

در مثال آخر آرگومان دوم برابر با عدد 0 در نظر گرفته شده است که بدین ترتیب همۀ اعداد پس از نقطۀ اعشار حذف می‌شوند اما دو نکته در مورد این خروجی وجود دارد که در ادامه هر یک را بررسی می‌کنیم:

- با وجود حذف تمام ارقام اعشاری، خروجی نهایی عددی با یک رقم اعشار است بدین دلیل که عملکرد فانکشن ()round به صورتی است که با دریافت دو آرگومان ورودی نوع عدد خروجی را متناسب با عدد مربوط به آرگومان اول ریترن می‌کند که در این مثال آرگومان ورودی یک عدد اعشاری است و از همین روی خروجی نیز یک عدد اعشاری خواهد بود. در واقع، فانکشن ()round به منظور گرد کردن اعداد اعشاری مورد استفاده قرار می‌گیرد چرا که اعداد صحیح خود رُند هستند.
- نکتۀ دوم اینکه عدد اعشاری ورودی به فانکشن ()round به نزدیک‌ترین عدد ممکن گرد می‌شود و در مثال آخر نیز عدد ورودی به 14 نزدیک‌تر بوده و در خروجی ریترن می‌شود.

البته فانکشن ()round را می‌توان تنها با یک آرگومان ورودی نیز به کار گرفت که در این صورت عدد مربوط به آرگومان ورودی را به نزدیک‌ترین عدد گرد کرده و در خروجی ریترن می‌کند که به عنوان مثال کد زیر را مد نظر قرار می‌دهیم:

>>> round(234.9830083)
235
>>> round(-7.546)
-8

همان‌طور که می‌بینید، هر یک از اعداد ورودی با در نظر گرفتن مثبت یا منفی بودن‌شان به نزدیک‌ترین عدد صحیح گرد شده و در معرض دید ما قرار گرفته‌اند.

فانکشن ()type
این فانکشن یک آبجکت را به عنوان پارامتر ورودی گرفته و نوع آن را مشخص می‌کند که برای درک بهتر کاربردش، مثال‌های زیر را بررسی می‌کنیم:

>>> type(3.5)
<class 'float'>
>>> type(5)
<class 'int'>
>>> type('SokanAcademy.com')
<class 'str'>
>>> type(None)
<class 'NoneType'>

در هر یک از دستورهای فوق، فانکشن ()type آبجکت ورودی را گرفته و مشخص می‌کند که آبجکت مد نظر نمونه‌ای متعلق به کدام کلاس است و در نهایت نتیجه را در خروجی نمایش می‌دهد.

فانکشن ()str
این فانکشن یک آبجکت را به عنوان پارامتر ورودی گرفته و آن را به صورت یک استرینگ برمی‌گرداند و عملکردی مشابه فانکشن ()repr دارا است با این تفاوت که فانکشن ()repr به منظور ارائۀ تعریفی رسمی از آبجکت مورد استفاده قرار می‌گیرد و غالباً در پروسۀ دیباگینگ و توسعهٔ نرم‌افزار به کار گرفته می‌شود اما این در حالی است که فانکشن ()str برای ارائۀ تعریفی قابل‌فهم توسط انسان از آبجکت مذکور کاربرد دارد که برای درک بهتر نحوۀ عملکرد فانکشن ()str و تفاوت آن با فانکشن ()repr مثال‌های زیر را بررسی می‌کنیم:

>>> str(-9.456)
'-9.456'
>>> str(print)
'<built-in function print>'
>>> str("A")
'A'
>>> repr("A")
" 'A' "   # repr is giving an extra double quotes

در هر یک از مثال‌های فوق، خروجی حاصل از فانکشن ()str استرینگی مربوط به تعریف آبجکت ورودی است به طوری که استرینگ مد نظر برای انسان قابل‌درک بوده و جزئیات آن ارائه نمی‌شود اما خروجی حاصل از فانکشن ()repr تعریفی رسمی از آبجکت ورودی است که استرینگ مذکور توسط مفسر پایتون قابل‌درک است.


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
جاوا پور :)
جاوا پور :)
۱۳۹۷/۰۷/۰۱
ممنون از توضیحات ظریف و قابل فهم شما
مورد وام قرض الحسنه بسیار هوشمندانه و جالب توجه بود
کاربر میهمان
hamidrezaمن یک کاربر مهمان هستم
۱۳۹۵/۱۰/۲۴
خیلی عالیه مثل بقیه اموزش ها تا اینجا
محمدهادی
محمدهادی
۱۳۹۵/۰۸/۰۱
چرا گفتید فانکشن ()pow حاصل عبارت را با دقت بیش تری به دست می آورد؟!!
saeed_vp
saeed_vp
۱۳۹۵/۰۵/۱۴
با سلام خدمت استاد عزیز. و تشکر از تلاشتون.
من هم میخواستم یک مثال برای شما بزنم:
فکر کنید باهم به یک کارگاه بسیار بزرگ میریم. من شروع میکنم به توضیح دادن کاربرد ابزار برای شما.
میگم این پیچگوشتی 2 سو هست با اون پیچ دو سو باز میشه. این چهار سو و ... این ستاره ایه و پیچ ستاره ای باز میشه و اینها کلاسشون پیچگوشتیه.
بعدی کلاس آچار هست: این آچار فرانسه هست همه مهره ای رو باز میکنه و این رینگی هست و سایز بندی داره. این یکی ترکمتره به فشار حساس هست و ...
و همینطور ادامه میدم. به نظر شما با اینا میشه حتی یک کاربراتور ساده رو تعمیر کرد ؟
تازه اگه شانس آورده باشید خیلی حافظه خوبی داشته باشید. و گر نه تا توضیحای من تموم بشه شما تقریبا هیچی از قبلیها یاد نگرفتین.
ولی یه بچه هم با شاگردی کردن بعد از مدتی کنار اوستا ایستادن مکانیک میشه. چون کاربرد هر ابزاری رو در عمل میبینه.
البته این نظر من بود.
متشکرم
hacker
hacker
۱۳۹۵/۰۴/۰۳
خیلی فوق العاده و جامع توضیح میدین وخیلی ممنون بابت زحمت هاتون
sahmada
sahmada
۱۳۹۴/۱۱/۱۳
با سلام و تشکر از آموزش روان و ساده شما
اطفا تفاوت repr و str را بیان بفرمایید.
از نکته وام قرض الحسنه نیز استفاده بردیم :)