در زبان برنامه نویسی پایتون عملگرهای زیادی وجود دارند که هر کدام دارای ویژگیهای مخصوص به خود هستند، درصد یکی از عملگرهای مهم و کاربردی این زبان به حساب میآید که دارای وظایف مختلفی ازجمله نشان دادن باقیمانده و مکان رشتهها در یک برنامه است. استفاده از عملگر درصد در پایتون یکی از مهمترین ترفندهای پایتون به حساب میآید. به طور کلی در یادگیری برنامه نویسی، برخی از اصطلاحات و مفاهیم بهظاهر ساده وجود دارند که توجه زیادی به آنها نمیشود، با این حال اگر این مفاهیم درک نشوند ممکن است در نوشتن برنامهها مشکل پیش بیاید و نتیجه دلخواه برنامه نویس به دست نیاید.
فیلم آموزشی کاربرد عملگر درصد در پایتون برای ساختن رشته ها
«عملگر» (Operator) در برنامه نویسی یکی از مفاهیم پایه و مهم برای یادگیری برنامه نویسی است. بنابراین، در این مطلب به بررسی اختصاصی یکی از عملگرهای مهم، یعنی عملگر درصد در پایتون پرداخته میشود و همچنین سایر مفاهیم و بحثهای پیرامون مفهوم عملگر درصد در پایتون نیز شرح داده شدهاند.
عملگر درصد در پایتون چیست ؟
عملگر درصد در پایتون در دو بخش از این زبان برنامه نویسی مورد استفاده قرار میگیرد. این عملگر هم به عنوان عملگر باقیمانده در پایتون به کار گرفته میشود و هم کاربردهایی در «رشتهها» (String) در پایتون دارد. عملگر درصد یا باقیمانده در پایتون نشاندهنده همان باقیمانده تقسیم در محاسبات ریاضی است، این عملگر میتواند برای انواع داده صحیح یا همان متغیر Integer و اعداد اعشاری یا همان نوع دادهای Float مورد استفاده قرار بگیرد.
علامت درصد یکی از عملگرهای پایتون به حساب میآید که میتوان با استفاده از آن ترفندهای مختلفی را در برنامههای خود پیادهسازی کرد. در سطح پیشرفته ممکن است این عملگر با انواع داده ازجمله کلاس math.fmod()
، decimal.Decimal
یا حتی کلاسهای نوشته شده توسط برنامه نویس نیز استفاده شود. در ادامه این بخش یاد میگیریم که عملگر درصد در پایتون برای دادههای نوع عدد صحیح یا همان int
چه عملکردی دارد.
چگونه از عملگر درصد در پایتون برای نوع int استفاده می شود؟
در بیشتر مواقع از عملگر درصد در پایتون به همراه اعداد صحیح استفاده میشود. زمانی که عملگر باقیمانده توسط دو عدد صحیح مثبت مورد استفاده قرار میگیرد، باقیمانده تقسیم استاندارد اقلیدسی را برمیگرداند. در ادامه مثالهایی از این نوع باقیمانده نمایش داده شده است.
>>> 15 % 4
3
>>> 17 % 12
5
>>> 240 % 13
6
>>> 10 % 16
10
باید به این نکته توجه داشت که کاملا مانند عملگر تقسیم در پایتون ( /
) اگر عملگر درصد نیز با عدد صفر مورد استفاده قرار بگیرد، پایتون خطایی با نام ZeroDivisionError
را نشان میدهد. در ادامه مثالی برای نمایش این خطا ارائه شده است:
>>> 22 % 0
ZeroDivisionError: integer division or modulo by zero
در حالتی که عدد «مقسومعلیه» (عددی که مقسوم به آن تقسیم میشود.) از «مقسوم» (عدد تقسیمشده) بزرگتر باشد، یعنی عدد مورد نظر در تقسیم کوچکتر از عددی در نظر گرفته شود که بر آن تقسیم خواهد شد، باقیمانده تقسیم همان مقسوم خواهد بود. در ادامه مثالی برای درک بهتر این موضوع ارائه شده است.
>>> 3 % 4
3
در بخش بعدی از مطلب «عملگر درصد در پایتون» خواهیم دید که این عملگر در اعداد اعشاری و ترفندهای مرتبط با آن چگونه عمل میکند.
چگونه از عملگر درصد در پایتون برای نوع float استفاده می شود؟
عملکرد عملگر باقیمانده برای نوع float
در پایتون مانند عملکرد نوع عدد صحیح آن است و نتیجهای را بر حسب محاسبات ریاضی معمولی اما با نوع اعشاری برمیگرداند. در ادامه مثالهایی برای درک بهتر این مفهوم مشاهده میشوند:
>>> 12.5 % 5.5
1.5
>>> 17.0 % 12.0
5.0
یک جانشین برای استفاده از نوع دادهای float
با عملگر باقیمانده، استفاده از کلاس math.fmod()
برای انجام عملیات محاسبه باقیمانده روی مقادیر اعشاری است. در ادامه مثالی برای نشان دادن کدهای این کلاس نمایش داده میشود:
>>> import math
>>> math.fmod(12.5, 5.5)
1.5
>>> math.fmod(8.5, 2.5)
1.0
اسناد و راهنما رسمی پایتون استفاده از کلاس math.fmod()
را برای محاسبه باقیمانده اعداد اعشاری به این دلیل پیشنهاد میدهند که این کلاس نتیجه باقیمانده را محاسبه میکند. تفاوت بین x % y
و math.fmod(x, y)
زمانی مشاهده میشود که از «عملوندهای» (Operand) منفی در تقسیم استفاده شود و روش محاسبه باقیمانده این عملوندها در بخشهای آتی مورد بررسی قرار گرفتهاند.
عملوند به پارامترهایی گفته میشود که در اطراف عملگرها قرار میگیرند و با تغییرات عملگرها روی آنها اعمال خواهد شد. دقیقاً مانند دیگر عملگرهای محاسباتی، عملگر درصد در پایتون و کلاس math.fmod()
نیز ممکن است هنگام محاسبه نتیجه با مسائلی مانند گرد کردن و پاسخهای اعشاری مواجه شوند. در ادامه مثالی برای مشاهده دقیق این مسئله ارائه شده است:
>>> 13.3 % 1.1
0.09999999999999964
>>> import math
>>> math.fmod(13.3, 1.1)
0.09999999999999964
اگر حفظ و نگهداری نتایج اعشاری برای برنامه مهم باشند، میتوان از عملگر باقیمانده به همراه کلاس decimal.Decimal
برای مسائل پیشرفتهتر استفاده کرد. در بخش بعدی از این مطلب به بررسی عملگر درصد در پایتون با عملوندهای منفی پرداخته شده است.
چگونه از عملگر باقیمانده در پایتون با عملوند منفی استفاده می شود؟
تا این بخش از مطلب همه عملکردهایی که با محاسبه باقیمانده ارتباط داشتند و مورد بررسی قرار گرفتند، اعدادی مثبت بودند و نتایجی قابل پیشبینی را نشان دادند. زمانی که از عملوندهای منفی استفاده شود، در برخی از موارد، پیچیدگی محاسبات بیشتر میشود. روشی که کامپیوترها نتیجه یک عملیات باقیمانده را با عملوند منفی تعیین میکنند، ابهام را در مورد این موضوع از بین میبرد که باقیمانده باید علامت مقسوم یا علامت مقسومعلیه را داشته باشد. زبانهای برنامه نویسی مختلف این موضوع را با روشهای متفاوتی مدیریت میکنند. برای مثال در زبان برنامه نویسی «جاوا اسکریپت» (JavaScript)، باقیمانده علامت عدد مقسوم را میگیرد:
8 % -3 = 2
باقیمانده در مثال فوق، عدد ۲ را نشان میدهد که عددی مثبت است و علامت آن با علامت مقسوم یعنی عدد ۸ مطابقت دارد. اما در پایتون و برخی از زبانهای برنامه نویسی دیگر، باقیمانده علامت عدد مقسومعلیه را دریافت میکند. در ادامه مثالی از زبان پایتون ارائه شده است.
8 % -3 = -1
در مثال فوق مشاهده میشود که باقیمانده منفی است و علامت مقسومعلیه یعنی عدد ۳- را دریافت کرده است. حال سوالی که درباره این دو مثال پیش میآید این است که چرا باقیمانده در زبان جاوا اسکریپت ۲ و در زبان پایتون ۱- را نشان میدهد؟ این موضوع به چگونگی انجام عملیات تقسیم توسط هر زبان برنامه نویسی ارتباط دارد، در زبانهای برنامه نویسی که باقیمانده علامت مقسوم را میگیرد، از معادله زیر برای تعیین باقیمانده استفاده میشود:
r = a - (n * trunc(a/n))
در این معادله سه متغیر به صورت زیر وجود دارند:
- متغیر r: این متغیر نشاندهنده عدد باقیمانده است.
- متغیر a: این متغیر مقسوم را نشان میدهد.
- متغیر n: این متغیر نشاندهنده عدد مقسومعلیه است.
trunc()
معادلهای است که برای «تقسیم کوتاه شده» (Truncated Division) استفاده میشود و همیشه اعداد منفی را به سمت صفر گرد میکند. برای درک و شفافسازی بیشتر میتوان به مراحل انجام عملیات محاسبه باقیمانده در مسئله تقسیم عدد ۸ به عدد ۳- پرداخت:
r = 8 - (-3 * trunc(8/-3)) r = 8 - (-3 * trunc(-2.666666666667)) r = 8 - (-3 * -2) # Rounded toward 0 r = 8 - 6 r = 2
در مثال فوق میتوان مشاهده کرد که چگونه زبان برنامه نویسی ازجمله جاوا اسکریپت عدد ۲ را به عنوان باقیمانده نشان میدهد. پایتون و زبانهای برنامه نویسی دیگری که در آنها باقیمانده علامت عدد مقسومعلیه را میگیرد، با استفاده از معادله زیر محاسبه میشوند:
r = a - (n * floor(a/n))
floor()
در معادله فوق نشاندهنده استفاده از روش «تقسیم گرد شده» (Floor Division) است. این نوع معادله برای اعداد مثبت، پاسخ مشابهی با روش استفاده از تقسیم کوتاه شده ارائه میدهد. اما در اعداد منفی، تقسیم گرد شده نتیجه معادله را به سمت مخالف عدد صفر گرد میکند. در ادامه معادله تقسیم عدد ۸ به عدد ۳- به صورت مرحله به مرحله ارائه شده است:
r = 8 - (-3 * floor(8/-3)) r = 8 - (-3 * floor(-2.666666666667)) r = 8 - (-3 * -3) # Rounded away from 0 r = 8 - 9 r = -1
بنابراین، خروجی معادله فوق عدد ۱- است. حال که تفاوت دو نوع عملیات برای محاسبه باقیمانده ارائه شد، باید به این موضوع نیز پرداخته شود که همه عملیات محاسبات باقیمانده در زبان پایتون نیز با یکدیگر مشابه نیستند. برای مثال زمانی که باقیمانده یک تقسیم ساده در پایتون دارای نوع عدد صحیح یا اعشاری باشد، علامت مقسومعلیه را میگیرد و در سایر انواع داده ممکن است این قوانین متفاوت باشند. به عنوان نمونه میتوان نتایج تقسیم 8.0 % -3.0
و math.fmod(8.0, -3.0)
را با یکدیگر مقایسه کرد که به صورت زیر محاسبه میشوند:
>>> 8.0 % -3
-1.0
>>> import math
>>> math.fmod(8.0, -3.0)
2.0
کلاس math.fmod()
علامت مقسوم را با استفاده از تابع «تقسیم کوتاه شده» (Trunc) دریافت میکند، درحالی که اعداد با نوع float
از علامت مقسومعلیه استفاده کردهاند. در بخش بعدی از این مطلب به بررسی یکی دیگر از ترفندهای زبان برنامه نویسی پایتون یعنی ارتباط بین تابع divmod
و عملگر درصد در پایتون پرداخته میشود.
ارتباط بین تابع divmod و عملگر درصد در پایتون چیست ؟
پایتون دارای یک تابع داخلی به نام divmod()
است که به صورت داخلی در عملگر درصد (باقیمانده) مورد استفاده قرار میگیرد. divmod()
دو پارامتر دریافت میکند و تاپلی برمیگرداند که نتایج «تقسیم گرد شده» و باقیمانده را با استفاده از پارامترهای ارائه شده برمیگردانند. در ادامه مثالی از استفاده این تابع با اعداد ۳۷ و ۵ ارائه شده است:
>>> divmod(37, 5)
(7, 2)
>>> 37 // 5
7
>>> 37 % 5
2
در کدهای فوق مشاهده میشود که divmod(37, 5)
تاپل (7, 2)
را برمیگرداند. عدد ۷ نشاندهنده تقسیم گرد شده ۳۷ بر ۵ است و عدد ۲ نتیجه باقیمانده این تقسیم را نشان میدهد. در ادامه مثالی ارائه شده است که در آن پارامتر دوم تابع divmod عددی منفی است. همانطور که در بخشهای قبلی نیز مورد بررسی قرار گرفت، زمانی که عملگر درصد از اعداد صحیح با نوع int
استفاده میکند، علامت باقیمانده مطابق با علامت مقسومعلیه خواهد بود.
>>> divmod(37, -5)
(-8, -3)
>>> 37 // -5
-8
>>> 37 % -5
-3 # Result has the sign of the divisor
حال پس از بررسی انواع و روشهای مختلف استفاده از عملگر درصد در پایتون، در بخش بعدی به یکی از موضوعات مهمی که همیشه در حیطه عملگرها حائز اهمیت بوده است یعنی تقدم عملگر درصد در پایتون پرداخته میشود.
تقدم عملگر درصد در پایتون چگونه است؟
مانند دیگر عملگرهای موجود در زبان پایتون، قوانین خاصی برای عملگر درصد وجود دارند که تقدم محاسبه آن را در عبارتهای برنامه نویسی مشخص میکنند. عملگر درصد یا همان باقیمانده دارای تقدم یکسانی با عملگرهای زیر است:
- ضرب (*)
- تقسیم (/)
- تقسیم گرد شده (//)
در ادامه مثالی ارائه شده است که از عملگر درصد در یک عبارت برنامه نویسی استفاده میشود و تقدم عملگر درصد در این مثال بررسی خواهد شد.
>>> 4 * 10 % 12 - 9
-5
هر دو عملگر ضرب و درصد دارای سطح یکسانی از تقدم هستند، بنابراین پایتون آنها را از چپ به راست محاسبه خواهد کرد. در ادامه ترتیب محاسبه عبارت فوق ارائه شده و مورد بررسی قرار گرفته است:
- 4 * 10
محاسبه میشود و عبارت 40 % 12 – 9
به عنوان نتیجه ایجاد شده است.
- سپس در این مرحله، 40 % 12
محاسبه میشود و در نتیجه آن، عبارت 4 – 9
به وجود میآید.
- در نهایت، 4 – 9
محاسبه و نتیجه نهایی یعنی عدد -5
در خروجی نمایش داده میشود.
اگر قصد نادیده گرفته شدن تقدم عملگر درصد وجود داشته و نیاز باشد که عملگرهای دیگری با تقدم بالاتر و پیش از عملگر درصد محاسبه شوند، میتوان عملیات مربوطه را به صورت زیر در داخل پرانتز قرار داد.
>>> 4 * 10 % (12 - 9)
1
در مثال فوق، ابتدا (12 – 9)
محاسبه میشود و سپس در ادامه 4 * 10
محاسبه شده است و در نهایت 40 % 3
محاسبه میشود و باقیمانده آن برابر یا عدد ۱ خواهد بود. در ادامه این مطلب برای درک بهتر روشهای استفاده از عملگر درصد و ترفندهای برنامه نویسی پایتون، مثالهایی از این زبان برنامه نویسی ارائه شده است، اما پیش از آن برخی از دورههای آموزش برنامه نویسی پایتون تم آف برای علاقهمندان و دانشجویان معرفی شدهاند.
فیلم های آموزش برنامه نویسی پایتون
دورههای آموزش ویدیویی در وبسایت تم آف بر اساس موضوع در قالب مجموعههای آموزشی متفاوتی دستهبندی میشوند. یکی از این مجموعهها مربوط به آموزش زبان پایتون در سطحهای مقدماتی تا پیشرفته است. با توجه به اینکه این زبان برنامه نویسی در حوزههای بسیار متفاوت علوم کامپیوتر مورد استفاده قرار میگیرد، این بخش به معرفی مجموعه آموزشهای ویدیویی پایتون برای یادگیری بیشتر این زبان در کاربردهای مختلف اختصاص داده شده است. در زمان تدوین این مطلب، مجموعه دورههای برنامه نویسی تم آف حاوی ۲۹۳ ساعت محتوای ویدیویی است و شامل ۵۵ دوره میشود. در ادامه برخی از دورههای این مجموعه آموزشی به طور خلاصه معرفی شدهاند:
- فیلم آموزش برنامه نویسی پایتون Python – مقدماتی (طول مدت: ۱۹ ساعت و ۵۳ دقیقه، مدرس: پژمان اقبالی شمس آبادی): در این تم آف زبان برنامه نویسی پایتون از پایهایترین مباحث تدریس میشود و برای دانشجویان و علاقهمندان به پایتون مناسب است. برای مشاهده فیلم آموزش برنامه نویسی پایتون Python – مقدماتی + کلیک کنید.
- فیلم آموزش ترفندهای برنامه نویسی پایتون (طول مدت: 9 ساعت و 9 دقیقه، مدرس: دکتر سید مصطفی کلامی هریس): در این تم آف، سعی شده است مهمترین و کاربردیترین نکات در خصوص استفاده از زبان برنامهنویسی پایتون و کتابخانههای استاندارد آن، بررسی شوند. با آموختن نکات و ترفندهایی که در این آموزش ارائه شده است، دانش برنامهنویسی فرد به سطح بالاتر از متوسط میرسد و میتواند برای آموختن نکات پیشرفتهتر، برنامهریزی کند. برای مشاهده فیلم آموزش ترفندهای برنامه نویسی پایتون + کلیک کنید.
- فیلم آموزش برنامه نویسی شی گرا در پایتون Python (طول مدت: ۷ ساعت و ۲۹ دقیقه، مدرس: دکتر فرشید شیرافکن): در این تم آف مفاهیم شی گرایی در پایتون با سادهترین روش و همراه با ذکر مثال آموزش داده شده است. برای مشاهده فیلم آموزش برنامه نویسی شی گرا در پایتون Python + کلیک کنید.
- فیلم آموزش کتابخانه های NumPy و Matplotlib در پایتون (طول مدت: ۴ ساعت و ۴۶ دقیقه، مدرس: میترا تجربه کار): این دوره آموزشی برای تکمیل مباحث موجود در دوره پایتون مقدماتی ارائه شده است. همچنین آشنایی با کتابخانه NumPy، بخش جدیدی از برنامه نویسی پایتون را در این دوره به دانشجویان و علاقهمندان معرفی میکند. برای مشاهده فیلم آموزش کتابخانه های NumPy و Matplotlib در پایتون + کلیک کنید.
- فیلم آموزش پایتون گرافیکی – رابط های گرافیکی پایتون (طول مدت: ۵ ساعت و ۳ دقیقه، مدرس: سید رضا دهقان): برای برنامه نویسان پایتون، یادگیری حداقل یک واسط گرافیکی (Graphical User Interface | GUI) این زبان برنامه نویسی اهمیت بسیاری دارد. به همین دلیل، در این دوره آموزشی به بررسی واسطهای گرافیکی پایتون پرداخته شده است. برای مشاهده فیلم آموزش پایتون گرافیکی – رابطهای گرافیکی پایتون + کلیک کنید.
- فیلم آموزش پروژه محور Python پایتون – ساخت نرم افزار برای ویندوز و لینوکس در Python (طول مدت: ۹ ساعت و ۳۴ دقیقه، مدرس: محمد حسینی): ابزار توسعه در این دوره آموزشی بر مبنای PyQt است. با استفاده از این تم آف، علاقهمندان با نحوه تولید نرم افزار آشنا میشوند و میتوانند برای هر زمینهای نرم افزار مورد نیازشان را بسازند. برای مشاهده فیلم آموزش پروژه محور Python پایتون – ساخت نرم افزار برای ویندوز و لینوکس در Python + کلیک کنید.
اکنون پس از معرفی برخی از دورههای آموزش زبان برنامه نویسی پایتون، بخش بعدی این مطلب، به بررسی برخی از مثالهای عملگر درصد در پایتون اختصاص داده شده است.
مثال های عملگر درصد در پایتون
در این بخش مثالهای بسیار پایهای و سادهای از عملگر باقیمانده در پایتون ارائه شده است که برخی از آنها مسائلی برای حل مشکلات دنیای واقعی هستند. ممکن است در ابتدای شروع برنامه نویسی، تشخیص اینکه در کجا و چگونه از عملگر درصد استفاده شود، برای افراد کمی دشوار باشد؛ به همین دلیل مثالهای زیر ایدههایی برای استفاده از این عملگر به علاقهمندان در برنامه خواهند داد. ابتدا در مثال اول زوج یا فرد بودن یک عدد را یاد میگیریم.
چگونه بررسی می شود که یک عدد زوج یا فرد است؟
برای بررسی اینکه آیا یک عدد زوج یا فرد است میتوان از عملگر درصد در پایتون استفاده کرد. با استفاده از عملگر درصد و عدد باقیمانده ۲ میتوان بررسی کرد که کدام عددها بر عدد ۲ بخشپذیر هستند. اگر بر ۲ بخشپذیر باشند، این معنی را میدهد که آن عدد زوج است. در کدهای زیر تابع is_even()
زوج بودن عدد پارامتر num
را بررسی میکند.
def is_even(num):
return num % 2 == 0
در کدهای فوق، اگر عدد num
زوج باشد، num % 2
با عدد صفر برابر خواهد بود و اگر عدد num
فرد باشد، این عبارت با عدد یک برابر میشود. اگر حاصل نقسیم num بر ۲ برابر با صفر باشد، ارزش گزاره «num % 2 == 0» برابر با True خواهد بود و در غیر این صورت ارزش آن Flase میشود. بررسی فرد بودن عدد ورودی نیز کاملاً شبیه به بررسی زوج بودن عددها است، با این تفاوت که در این بررسی به جای استفاده از علامت مساوی از نامساوی استفاده میشود، کدهای این مثال در ادامه ارائه شدهاند:
def is_odd(num):
return num % 2 != 0
در تابع فوق، اگر num % 2
برابر با صفر نباشد، True را برمیگرداند. به عبارت دیگر، وجود باقیمانده تقسیم بر عدد ۲ ثابت میکند که آن عدد فرد است. حال باید این مسئله مورد بررسی قرار بگیرد که آیا با استفاده از تابع زیر میتوان فرد بودن یک تابع را بررسی کرد؟
def is_odd(num):
return num % 2 == 1
پاسخ این سوال هم میتواند مثبت و هم منفی باشد. از لحاظ فنی، این تابع با اعداد صحیح در پایتون به خوبی کار میکند. اما همانطور که در بخشهای قبلی مورد بررسی قرار گرفت، باید تا حد امکان از مقایسه عملیات باقیمانده با عدد یک خودداری شود؛ زیرا همه عملیات باقیمانده در پایتون عدد یکسانی را برنمیگردانند. در مثال زیر به وضوح دلیل این موضوع مشاهده میشود:
>>> -3 % 2
1
>>> 3 % -2
-1
در این حالت، اگر بررسی فرد بودن عدد ۳ به صورت بولی (منطقی) یعنی 3 % -2 == 1
انجام شود (یعنی حاصل باقیمانده تقسیم این عدد بر ۲- با مقدار یک منطقی مقایسه شود) نتیجه False خواهد بود، در حالیکه خروجی مورد انتظار باید True باشد. با این حال، اگر باقیمانده عملیات با عدد صفر مقایسه شود، اهمیتی ندارد که عملوندها منفی یا مثبت باشند و باقیمانده در هر صورت یکسان است، مثلاً برای مثال زیر پاسخ هر دو نمونه صفر است و نتیجه False برای هر دو آنها در خروجی جهت نشان دادن فرد بودن عدد نمایش داده میشود.
>>> -2 % 2
0
>>> 2 % -2
0
در مثال بخش بعدی از مطلب «عملگر درصد در پایتون» به بررسی استفاده از عملگر باقیمانده با «حلقهها» (Loop) برای کنترل جریان برنامه خواهیم پرداخت.
چگونه می توان کدها را در دوره های خاص در یک حلقه پیاده سازی کرد؟
با استفاده از عملگر باقیمانده پایتون میتوان کدها را در دورههای خاص و در داخل حلقهها پیادهسازی کرد. این موضوع با استفاده از انجام عملیات باقیمانده با «اندیس» (Index) فعلی حلقه و باقیماندهها انجام میشود. عدد عملگر درصد یا همان باقیمانده تعیین میکند که در چه بازه زمانی خاصی کدها در حلقه اجرا خواهند شد. در ادامه مثالی برای این موضوع ارائه شده است.
def split_names_into_rows(name_list, modulus=3):
for index, name in enumerate(name_list, start=1):
print(f"{name:-^15} ", end="")
if index % modulus == 0:
print()
print()
در کدهای فوق، تابع split_names_into_rows()
تعریف شده است و دو پارامتر دریافت میکند. پارامتر name_list
لیست اسامی است که باید وارد سطرها شوند. پارامتر modulus
باقیمانده را برای عملیات و تعیینکننده تعداد اسامی موجود در هر سطر نشان میدهد. تابع split_names_into_rows()
روی پارامتر name_list
حلقه ایجاد کرده و پس از رسیدن به مقدار باقیمانده مورد نظر، ادامه چاپ کلمات یا همان نامهای موجود در لیست ورودی در سطر بعدی انجام میشود. قبل از بررسی جزئیات بیشتر این تابع، در ادامه به عنوان مثال یک لیست فرضی تعریف و این تابع روی آن اجرا شده است. نتیجه خروجی آن هم در ادامه نشان داده میشود.
>>> names = ["Picard", "Riker", "Troi", "Crusher", "Worf", "Data", "La Forge"]
>>> split_names_into_rows(names)
----Picard----- -----Riker----- -----Troi------
----Crusher---- -----Worf------ -----Data------
---La Forge----
همانطور که در مثال فوق مشاهده میشود، لیستی از اسامی در سه سطر قرار گرفتهاند و حداکثر تعداد اسم قرار گرفته در هر سطر سه کلمه است. در اینجا برای پارامتر modulus
به صورت پیشفرض عدد ۳ در نظر گرفته شده، اما هر عدد دیگری را نیز برای تعیین تعداد نام چاپ شده در هر سطر به آن تابع ارجاع داد. در مثال زیر خروجی کدهای فوق، با اعداد مختلف برای پارامتر modulus
نمایش داده شدهاند:
>>> split_names_into_rows(names, modulus=4)
----Picard----- -----Riker----- -----Troi------ ----Crusher----
-----Worf------ -----Data------ ---La Forge----
>>> split_names_into_rows(names, modulus=2)
----Picard----- -----Riker-----
-----Troi------ ----Crusher----
-----Worf------ -----Data------
---La Forge----
>>> split_names_into_rows(names, modulus=1)
----Picard-----
-----Riker-----
-----Troi------
----Crusher----
-----Worf------
-----Data------
---La Forge----
در عبارات فوق، مشاهده میشود که دقیقاً چه عملی در کدها انجام شده است و به طور کامل این عملکرد قابل تجزیه و تحلیل است. ابتدا از enumerate()
برای تکرار روی لیست name_list
استفاده میشود و آیتم فعلی لیست به name
و مقدار شمارش به index
اختصاص داده شده است، یعنی هر آیتم در هر تکرار در متغیر name
قرار میگیرد و اندیس آن هم در متغیر index
ذخیره میشود. میتوان آرگومان اختیاری start
را برای enumerate()
عدد یک در نظر گرفت تا اندیسدهی به جای صفر از یک شروع شود. کدهای این بخش مجدداً در ادامه ارائه شدهاند:
for index, name in enumerate(name_list, start=1):
حال در بخش بعدی و در داخل حلقه، تابع print()
برای چاپ name
در هر سطر فراخوانی میشود. پارامتر end
برای تابع print()
یک رشته (” “) خالی است؛ بنابراین، باعث میشود که یک خط جدید در انتهای رشته تولید نشود. یک «F-String» وارد تابع print()
میشود و از سینتکس فرمت خروجی رشته ارائه شده توسط پایتون استفاده میکند. در ادامه کدهای مربوط به این بخش ارائه شدهاند:
print(f"{name:-^15} ", end="")
بخش :-^15
در کدهای فوق برای تابع print()
وظایف زیر را انجام میدهد:
- خروجی باید حداقل دارای ۱۵ کاراکتر باشد، حتی اگر رشته کمتر از ۱۵ کاراکتر داشته باشد.
- رشته خروجی در مرکز هر سطر هماهنگ شده است و قرار میگیرد.
- بعد از اینکه رشته در مرکز قرار گرفت، هر فضای خالی در سمت راست و چپ آن با کاراکتر خط فاصله (-) پر میشود.
حال که هر نامی روی سطر چاپ میشود، بخش اصلی تابع split_names_into_rows()
در ادامه مورد بررسی قرار خواهد گرفت، کدهای زیر این بخش را تشکیل میدهند:
if index % modulus == 0:
print()
کدهای فوق، اندیس هر تکرار جاری را دریافت و از عملگر درصد برای مقایسه آن با مقدار modulus
استفاده میکند. اگر مقدار باقیمانده برابر با صفر باشد، یعنی تعداد تکرار در هر سط به میزان مورد نظر رسیده است و باقی موارد باید در سطر بعدی چاپ شوند. در این مثال، برنامه تابع print()
را فراخوانی کرده است تا خط جدیدی به خروجی اضافه کند و این خط، سطر جدید را آغاز میکند. در ادامه به بررسی برخی از کاربردهای پیشرفته عملگر درصد در پایتون پرداخته شده است.
کاربردهای پیشرفته عملگر درصد در پایتون
در این بخش برخی از کاربردهای بسیار پیشرفته عملگر درصد در پایتون مورد بررسی قرار میگیرد که در این کاربردها از کلاس decimal.Decimal
برای استفاده از عملگر باقیمانده استفاده شده است. همچنین به بررسی این موضوع پرداخته میشود که چطور میتوان متد .__mod__()
را به کلاسهای نوشته شده توسط برنامه نویس اضافه کرد تا آنها را همراه با عملگر باقیمانده مورد استفاده قرار داد. در ادامه ابتدا به بررسی روش استفاده از decimal.Decimal
با عملگر باقیمانده در پایتون پرداخته شده است.
روش استفاده از عملگر درصد با decimal.Decimal در پایتون
با استفاده از کلاس decimal.Decimal
میتوان اعداد دَهدَهی یا همان Decimal را همراه با عملگر درصد در پایتون متد Decimal
موجود در ماژول decimal
استفاده کرد. از این کلاس زمانی استفاده میشود که هدف، بررسی دقت اعداد «ممیز شناور» (Floating Point) باشد. در ادامه مثالهایی از روش استفاده اعداد صحیح با کلاس decimal.Decimal
و عملگر باقیمانده ارائه شده است:
>>> import decimal
>>> decimal.Decimal(15) % decimal.Decimal(4)
Decimal('3')
>>> decimal.Decimal(240) % decimal.Decimal(13)
Decimal('6')
در مثال بعدی نیز چند نمونه عدد ممیز شناور وجود دارند که از کلاس decimal.Decimal
و عملگر درصد استفاده میکنند:
>>> decimal.Decimal("12.5") % decimal.Decimal("5.5")
Decimal('1.5')
>>> decimal.Decimal("13.3") % decimal.Decimal("1.1")
Decimal('0.1')
همه عملیات عملگر باقیمانده با کلاس decimal.Decimal
نتیجه یکسانی را برای انواع مختلف عددی برمیگردانند، به جز زمانی که یکی از عملوندها منفی باشد. این کلاس نیز مانند math.fmod()
از علامت مقسوم برای نتیجه نهایی خود استفاده میکند. در مثالهای زیر، نتایج مقایسه استفاده از عملگر درصد در پایتون با مقدارهای استاندارد float
و int
و روش استفاده از کلاس decimal.Decimal
ارائه شدهاند:
>>> -17 % 3
1 # Sign of the divisor
>>> decimal.Decimal(-17) % decimal.Decimal(3)
Decimal(-2) # Sign of the dividend
>>> 17 % -3
-1 # Sign of the divisor
>>> decimal.Decimal(17) % decimal.Decimal(-3)
Decimal("2") # Sign of dividend
>>> -13.3 % 1.1
1.0000000000000004 # Sign of the divisor
>>> decimal.Decimal("-13.3") % decimal.Decimal("1.1")
Decimal("-0.1") # Sign of the dividend
همچنین، مثالی در ادامه ارائه شده است که نشان میدهد نتیجه عملگر درصد در پایتون با روشهای decimal.Decimal
و math.fmod()
دارای علامت یکسانی است، اما عدد نتیجه آنها تفاوت دارد:
>>> decimal.Decimal("-13.3") % decimal.Decimal("1.1")
Decimal("-0.1")
>>> math.fmod(-13.3, 1.1)
-0.09999999999999964
همانطور که در مثالهای فوق مشاهده میشود، کار کردن با کلاس decimal.Decimal
همراه با عملگر درصد بسیار شبیه به کار کردن این عملگر با انواع عددی دیگر است. فقط باید به روش مشخص کردن علامت نتیجه آنها هنگام استفاده از عملوندهای منفی دقت شود. در بخش بعدی از مطلب «عملگر درصد در پایتون» به بررسی روش استفاده از عملگر باقیمانده در کلاسهای نوشته شده توسط برنامه نویس برای سفارشی کردن رفتار کلاسها پرداخته شده است.
استفاده از عملگر درصد در پایتون با کلاس های سفارشی
معمولاً همه دادههای زبان برنامه نویسی پایتون این امکان را دارند که متدهای داخلی اشیا پایتون را «نادیده بگیرند» (Override) و رفتار کلاس را سفارشی کنند. در این بخش روش نادیده گرفتن .__mod__()
و استفاده از عملگر درصد در پایتون مورد بررسی قرار میگیرد. طبق مثال، اگر کلاسی به نام Student
وجود داشته و هدف این کلاس نشان دادن مدت زمان مطالعه یک دانشآموز باشد، با استفاده از کدهای زیر مقداردهی اولیه این کلاس مشاهده میشود:
class Student:
def __init__(self, name):
self.name = name
self.study_sessions = []
def add_study_sessions(self, sessions):
self.study_sessions += sessions
در کلاس Student
فوق، مقداردهی اولیه آن با استفاده از پارامتر name
انجام میشود و کلاس با یک لیست خالی به نام study_sessions
شروع شده است که لیستی از اعداد صحیح نشاندهنده دقیقههای مطالعه دانشآموزان در هر جلسه خواهد بود. یک تابع .add_study_sessions()
نیز وجود دارد که پارامتر sessions
را دریافت میکند و باید لیستی از جلسات مطالعه را به study_sessions
اضافه کند.
حال در این مرحله با استفاده از تبدیل واحدها در پایتون، .convert_minutes_to_day()
از عملگر درصد پایتون برای تبدیل total_mins
به روز، ساعت و دقیقه استفاده کرده است. اکنون در ادامه کدهایی از یک نسخه اصلاح شده از آن روش پیادهسازی میشود تا مشاهده شود که چطور میتوان از یک کلاس سفارشی همراه با عملگر باقیمانده استفاده کرد:
def total_study_time_in_hours(student, total_mins):
hours = total_mins // 60
minutes = total_mins % 60
print(f"{student.name} studied {hours} hours and {minutes} minutes")
میتوان از تابع فوق همراه با کلاس Student
برای نمایش دادن همه ساعتهایی استفاده کرد که یک دانشآموز مطالعه میکند. ترکیب کدهای تابع فوق با کلاس Student
، به صورت زیر نمایش داده شده است:
class Student:
def __init__(self, name):
self.name = name
self.study_sessions = []
def add_study_sessions(self, sessions):
self.study_sessions += sessions
def total_study_time_in_hours(student, total_mins):
hours = total_mins // 60
minutes = total_mins % 60
print(f"{student.name} studied {hours} hours and {minutes} minutes")
اگر کدهای فوق را در یک «Python REPL» بارگذاری کرد، اطلاعات زیر نمایش داده میشوند:
>>> jane = Student("Jane")
>>> jane.add_study_sessions([120, 30, 56, 260, 130, 25, 75])
>>> total_mins = sum(jane.study_sessions)
>>> total_study_time_in_hours(jane, total_mins)
Jane studied 11 hours and 36 minutes
کدهای فوق کل ساعتهای مطالعه jane
را چاپ میکنند. این کدها به درستی عمل کردهاند، اما به مرحله اضافی برای جمعبندی study_sessions
نیز نیاز دارند تا total_mins
قبل از فراخوانی total_study_time_in_hours()
به دست بیاید. در ادامه روش تغییر کلاس Student
برای ساده شدن کدها ارائه شده است:
class Student:
def __init__(self, name):
self.name = name
self.study_sessions = []
def add_study_sessions(self, sessions):
self.study_sessions += sessions
def __mod__(self, other):
return sum(self.study_sessions) % other
def __floordiv__(self, other):
return sum(self.study_sessions) // other
با استفاده از نادیده گرفتن .__mod__()
و .__floordiv__()
، میتوان یک نمونه کلاس Student
را با عملگر باقیمانده استفاده کرد. محاسبه sum()
برای study_sessions
نیز در کلاس Student
انجام میشود. با این تغییرات میتوان نمونهای یک کلاس Student
را به طور مستقیم به وسیله تابع total_study_time_in_hours()
استفاده کرد. به دلیل اینکه دیگر به total_mins
نیازی نیست میتوان آن را در این کدها حذف کرد:
def total_study_time_in_hours(student):
hours = student // 60
minutes = student % 60
print(f"{student.name} studied {hours} hours and {minutes} minutes")
در ادامه همه کدها همراه با تغییرات آنها ارائه شدهاند:
class Student:
def __init__(self, name):
self.name = name
self.study_sessions = []
def add_study_sessions(self, sessions):
self.study_sessions += sessions
def __mod__(self, other):
return sum(self.study_sessions) % other
def __floordiv__(self, other):
return sum(self.study_sessions) // other
def total_study_time_in_hours(student):
hours = student // 60
minutes = student % 60
print(f"{student.name} studied {hours} hours and {minutes} minutes")
حال با استفاده از فراخوانی کدها در Python REPL میتوان مشاهده کرد که چقدر کدها چکیدهتر شدهاند:
>>> jane = Student("Jane")
>>> jane.add_study_sessions([120, 30, 56, 260, 130, 25, 75])
>>> total_study_time_in_hours(jane)
Jane studied 11 hours and 36 minutes
با نادیده گرفتن .__mod__()
به کلاسهای سفارشی این امکان داده میشود که در سطح بیشتری شبیه به انواع دادهای عددی پایتون رفتار کنند. در ادامه این مطلب، به بررسی روشهای استفاده از عملگر درصد در رشته یا همان Stringهای زبان پایتون پرداخته شده است.
چگونه می توان از عملگر درصد در رشته های پایتون استفاده کرد؟
روشهای زیادی برای نشان دادن فرمت و ظاهر رشتهها در پایتون وجود دارند که یکی از آنها استفاده از عملگر درصد در پایتون به حساب میآید. این عملگر در رشتهها به عنوان عملگر «قالببندی» (Formatting) یا «درونیابی» (Interpolation) رشتهها شناخته میشود. در این بخش از مطلب مشاهده میشود که چگونه از این عملگر برای ساخت رشتههایی با یک الگو خاص و متغیرهای حاوی دادههای برنامه استفاده شده است.
این نوع از نوشته شدن و استفاده از متن از ابتدای به وجود آمدن زبان پایتون مورد استفاده قرار میگیرد و همچنین به عنوان قالببندی «C-style» شناخته میشود، این نامگذاری به این دلیل است که قالببندی رشتهها در ابتدا فقط در زبان برنامه نویسی C استفاده میشد و یکی از روشهای اصلی این زبان برنامه نویسی است. این روش به عنوان «قالببندی موقعیتی ساده» (Simple Positional Formatting) نیز شناخته میشود. عملگر درصد در پایتون به «مفسر» (Interpreter) این امکان را میدهد که یک رشته را با استفاده از مجموعهای از متغیرها در یک تاپل کپسوله و با عملگر قالببندی کند. در ادامه یک مثال بسیار ساده از این موضوع ارائه شده است:
'%s is smaller than %s' % ('one', 'two')
در کدهای فوق، مفسر پایتون اولین جایی که %s
قرار دارد را با رشته داده «one» و دومین جایی که %s
قرار دارد را با رشته «two» در داخل پرانتز جایگزین میکند. در واقع این %s
ها محلهایی در رشته «الگو» هستند که جای قرار گرفتن هر رشته را نشان میدهند. در مثال بعدی که در «Python REPL» نوشته شده است، روش چگونگی چاپ مقدارهای رشتهای و اعشاری نشان داده میشوند:
>>> print("Mr. %s, the total is %.2f." % ("Jekyll", 15.53))
'Mr. Jekyll, the total is 15.33.'
در مثال فوق، دقیقاً مانند %s
که محل هر رشته را نشان میدهد، %f
نیز محل هر عدد اعشاری را نشان داده است. عدد ۲ که قبل از حرف f
نوشته میشود، نشاندهنده این است که چه تعداد عدد باید پس از اعشار عدد قرار بگیرند. این دو مثال چند نمونه از استفاده عملگر درصد در پایتون بودند، موارد بسیار دیگری نیز وجود دارند و در ادامه به صورت جامع همه این عملگرها را بررسی میکنیم:
- %c
: این عملگر «مکاننما» (Placeholder)، یک کاراکتر یا حرف تکی را نشان میدهد، مثال زیر برای درک بهتر این عملگر ارائه شده است:
>>> print("The character after %c is %c." % ("B", "C"))
The character after B is C.
ارائه بیش از یک کاراکتر به عنوان متغیر در مثال فوق، یک استثنا ایجاد میکند.
- %s
: این عملگر مکاننما از تبدیل رشته به وسیله str()
در جلوی قالببندی استفاده میکند. بنابراین مقدارهای زیادی میتوانند از طریق str()
به رشته تبدیل شوند و در این بخش مورد استفاده قرار بگیرند. در ادامه مثالی مرتبط با این عملگر درصد در پایتون ارائه شده است:
>>> place = "New York"
>>> print("Welcome to %s!" % place)
Welcome to New York!
در مثال فوق، فقط یک عنصر تکی برای استفاده در قالببندی رشته وجود دارد و همچنین نیازی نیست عنصر مانند مثال قبلی در یک تاپل کپسوله شود.
- %i
و %d
: این دو عملگر مکاننما، نشاندهنده عدد صحیح دَهدَهی علامتدار هستند. در ادامه مثالی برای این مکاننماها ارائه شده است:
>>> year = 2019
>>> print("%i will be a perfect year." % year)
2019 will be a perfect year.
به دلیل اینکه این عملگر مکاننما فقط اعداد صحیح را نشان میدهد، اگر به جای آن عدد اعشاری ارائه شود، آن عدد به یک تبدیل خواهد شد.
- %u
: این عملگر مکاننما، نشاندهنده عدد صحیح دَهدهی بدون علامت است.
- %o
: این عملگر مکاننما، اعداد صحیح «هشتهشتی» (Octal) را نشان میدهد. در ادامه مثالی برای درک بهتر آن ارائه شده است:
>>> number = 15
>>> print("%i in octal is %o" % (number, number))
15 in octal is 17
- %x
: این عملگر، یک عدد صحیح «شانزده شانزدهی» یا همان «در مبنای ۱۶» (Hexadecimal) را با استفاده از حروف کوچک نشان میدهد. در ادامه مثالی برای درک این عملگر مکاننما ارائه شده است:
>>> number = 15
>>> print("%i in hex is %02x" % (number, number))
15 in hex is 0f
با استفاده از پیشوند «۰۲» قبل از عملگر مکاننما، میتوان برای برنامه مشخص کرد که یک رشته «Hex» دو حرفی را چاپ کند.
- %X
: این عملگر مکاننما، اعداد صحیح شانزده شانزدهی را با استفاده از حروف بزرگ نشان میدهند. در ادامه مثالی برای درک بهتر این موضوع ارائه شده است:
>>> number = 15
>>> print("%i in hex is %04X" % (number, number))
15 in hex is 000F
این مثال نیز دقیقاً شبیه به مثال قبلی است و از پیشوند «۰۴» برای نشان دادن تعداد حروف چاپ شده در خروجی آن استفاده شده است.
- %e
: این عملگر مکاننما، یک نماد «نمایی» (Exponential) را با حروف کوچک «e» نشان میدهد.
- %E
: یک نماد نمایی با حروف بزرگ «E» با استفاده از این عملگر مکاننما نمایش داده میشود.
- %f
: این عملگر، یک عدد واقعی اعشاری را نشان میدهد. در ادامه مثالی برای درک بهتر آن ارائه شده است:
>>> price = 15.95
>>> print("the price is %.2f" % price)
the price is 15.95
- %g
: این عملگر، نسخه کوتاهتر عملگرهای %f
و %e
است.
- %G
: این عملگر مکاننما، نوع کوتاهتر عملگرهای %f
و %E
به حساب میآید.
عملگرهای مکاننمایی که در بخشهای فوق مورد بررسی قرار گرفتند، به برنامه نویسان این امکان را میدهند که رشتهها را با تعیین نوع داده آنها در فرمتهای مخصوصشان قالببندی کرد. با این حال، این موارد تنها ویژگیهای عملگرهای درونیابی نیستند و در بخش بعدی از این مطلب، به این موضوع پرداخته میشود که چگونه میتوان رشتههایی را با استفاده از عملگر درصد در پایتون با فضای خالی پر کرد.
همسو کردن یا Aligning خروجی ها در پایتون
در بخشهای قبلی تنها از استفاده کردن عملگر درصد برای فرمت متن رشته با استفاده از مکاننماهای ساده بحث شد. در این بخش با کمک یک مقدار عددی اضافی، میتوان همه فضای خالی را تعریف کرد که باید در دو طرف یک متغیر برای رشته خروجی در نظر گرفت. برای مثال، مقدار %10s
نشاندهنده ۱۰ کاراکتر است که فضای خالی در سمت چپ مکاننما را ایجاد میکند و مقدار %-10s
نشاندهنده فضای خالی در سمت راست مکاننما است. «کاراکتر Padding تکی» (Single Padding Character) یک فضای خالی است که نمیتوان آن را تغییر داد. در ادامه مثالی برای نشان دادن این عملگرهای مکاننما ارائه شده است:
>>> place = "London"
>>> print ("%10s is not a place in France" % place) # Pad to the left
London is not a place in France
>>> print ("%-10s is not a place in France" % place) # Pad to the right
London is not a place in France
این روش در هنگام استفاده از اعداد نیز به همین صورت عمل میکند و مثال آن در ادامه نمایش داده شده است:
>>> print ("The postcode is %10d." % 25000) # Padding on the left side
The postcode is 25000.
>>> print ("The postcode is %-10d." % 25000) # Padding on the right side
The postcode is 25000 .
جمعبندی
در این مطلب سعی شد به طور جامع به بررسی عملگر درصد و انواع ترفندهای برنامه نویسی پایتون پرداخته شود که با آن مطابقت دارند. عملگر درصد در پایتون یکی از عملگرهایی است که در زمینههای مختلفی در برنامه نویسی پایتون مورد استفاده قرار میگیرد. به طور کلی میتوان آن را به عنوان عملگری برای نشان دادن باقیمانده یا عملگری برای ایجاد مکاننما در رشتهها در نظر گرفت.
در این نوشتار به طور جامع همه مباحث مرتبط با عملگر باقیمانده همراه با مثال شرح داده شدند، همچنین برخی از موارد استفاده این عملگر به صورت پیشرفته نیز بررسی شدند. در بخش نهایی مطلب نیز به بررسی انواع مکاننماها و روشهای استفاده از عملگر درصد در رشتههای پایتون پرداخته شد. در این مطلب برای درک بهتر عملگر درصد و انواع ترفندهای برنامه نویسی پایتون چند نمونه از آموزشهای ویدیویی برنامه نویسی نیز به علاقهمندان معرفی شدهاند.