در آموزشهای گذشته با چند مورد از فانکشنهای به اصطلاح 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
تعریفی رسمی از آبجکت ورودی است که استرینگ مذکور توسط مفسر پایتون قابلدرک است.