زبان برنامهنویسی پایتون درون خود انواع طبقهبندی شدهی داده را مانند: لیست (List)، دسته (Set), Tuple, دیکشنری و… به همراه دارد. توابع Range یکی از مدلهای دستهبندی اطلاعات در زبان برنامهنویسی Python است. توابع Range معمولاً در Loopها بیشترین کاربرد را دارند. تابع Range ترفندی است که در مواقعی که دادههای زیادی برای دستهبندی وجود دارد به کار میرود. این تابع از لحاظ سینتسکی با تابع Slice که برای جدا کردن بخشی از دنباله استفاده میگردد، شباهت بسیاری دارد.
آنچه در این محتوا یاد خواهید گرفت:
۳ موقعیت برای استفاده از تابع Range
اعضای تشکیل دهندهی تابع Range چیست؟
اعداد شناور (Float numbers) در تابع Range
چگونه تابع Range را به List تبدیل کنیم؟
همه چیز دربارهی تابع Slice و شباهتهای آن با تابع Range
تابع Range چیست؟
تابع range() Python دنبالهی تغییرناپذیر اعداد را تولید میکند که از عدد صحیح دادهشده، شروع شده تا آخرین عدد صحیح موجود در آن مجموعه متوقف میشود. به زبان ساده، range() به شما امکان می دهد یک سری اعداد را در یک محدوده مشخص تولید کنید. بسته به تعداد آرگومان هایی که به تابع ارسال می کنید، می توانید تصمیم بگیرید که آن سری از اعداد کجا شروع و پایان می یابد و همچنین تفاوت بین یک عدد و عدد بعدی چقدر است. همچنین با استفاده از یک حلقه for میتوانیم یک سری داده را بارها تکرار کنیم. بنابراین وقتی مینویسید: “for i in range(x)” به این معنا است که برای هر آیتم در این لیست اینکار را انجام بده. به مثال زیر برای درک بهتر کاربرد تابع range توجه کنید:
در این حلقه for، شما به سادگی توانستید محدودهای از اعداد را ایجاد کنید که بر 3 بخش پذیر هستند، بنابراین لازم نیست هر کدام را خودتان حساب کنید و جداگانه دستور پرینت دهید. (نکته: در حالی که این مثال استفاده مناسب از range() را نشان میدهد، معمولاً استفاده از range() اغلب در حلقههای for نادیده گرفته میشود.) به عنوان مثال، استفاده زیر از range() به طور کلی پایتونیک در نظر گرفته نمی شود:
range() برای ایجاد تکرارپذیری اعداد یکی ابزار عالی است، اما زمانی که نیاز به تکرار دادههایی دارید که میتوانند با عملگر in حلقه شوند، بهترین انتخاب نیست.
اگرچه range() در پایتون 2 و range() در پایتون 3 ممکن است یک نام مشترک داشته باشند، اما هر کدام ماهیت کاملاً متفاوتی از یکدیگر دارند. در واقع، range() در پایتون 3 فقط یک نسخه تغییر نام یافته از تابعی است که در پایتون 2 xrange نامیده میشود. در اصل در هر دو نسخه تابع Range اعدادی که میتوانستند با حلقههای for تکرار شوند تولید میکردند. در پایتون ۲ این اعداد در فهرستی به یکباره پرینت گرفتهمیشد در حالی که در پایتون ۳ این یکی یکی برگردانده میشدند.
۳ موقعیت برای استفاده از تابع Range:
- در مرحله (توقف) فقط یک آرگومان میگیرد.
- در محدوده (شروع، توقف) دو آرگومان میگیرد.
- در محدوده (شروع، توقف، مرحله) سه آرگومان میگیرد.
Range(Stop): وقتی range() را با یک آرگومان استفاده میکنید، یک سری اعداد دریافت خواهید کرد که از 0 شروع میشوند و شامل هر عدد کامل تا عددی است که شما بهعنوان توقف ارائه کردهاید، اما شامل آن نمیشود. تصویر زیر چیزی است که در عمل به نظر می رسد:
خروجی حلقه شما به شکل زیر خواهد بود:
range(start, stop): زمانی که range() را با دو آرگومان به کار میبرید، نه تنها میتوانید تصمیم بگیرید که سری اعداد کجا متوقف میشوند، بلکه از کجا شروع میشوند، بنابراین لازم نیست همیشه از 0 شروع کنید. می توانید از range() برای تولید یک سری اعداد از A تا B با استفاده از محدوده (A, B) استفاده کنید. در ادامه به بررسی این که چگونه می توان محدوده ای را با شروع از 1 ایجاد کرد میپردازیم. به مثال زیر توجه کنید:
خروجی به صورت زیر خواهد بود:
شما همه اعداد کامل را از 1 (عددی که به عنوان شروع ارائه کردید) تا 8 (عددی که به عنوان توقف ارائه کردید) را در اختیار دارید. اما اگر یک آرگومان دیگر اضافه کنید، آنگاه میتوانید خروجیای را که قبلاً هنگام استفاده از لیستی به نام numbers_divisible_by_three دریافت کردهاید، بازتولید کنید.
range(start, stop, step): زمانی که range() را با سه آرگومان به کار گرفتهاید، نه تنها میتوانید انتخاب کنید که سری اعداد کجا شروع و متوقف شوند، بلکه میتوانید تفاوت بین یک عدد و عدد بعدی را نیز انتخاب کنید. اگر مرحلهای را ارائه نکنید، range() به طور خودکار با تمامی دادهها به یک شکل رفتار خواهدکرد. مثال زیر را بررسی کنید:
نکته: گام می تواند یک عدد مثبت یا یک عدد منفی باشد، اما نمی تواند 0 باشد: اکنون که نحوه استفاده از step را میدانید، در نهایت می توانید حلقه ای را که قبلاً با تقسیم بر 3 دیدیم، دوباره بررسی کنید. همچنین اگر سعی کنید از 0 به عنوان مرحله خود استفاده کنید، با خطا مواجه خواهید شد.
تمرین زیر را خودتان امتحان کنید:
پاسخ: خروجی شما دقیقاً شبیه خروجی حلقه for خواهد بود که قبلاً در این مقاله ، زمانی که از لیستی به نام numbers_divisible_by_three استفاده میکردید، مشاهده کردید:
.
اعضای تشکیلدهندهی تابع Range چیست؟
در ابتدا نگاهی به سینتکس تابع Range میاندازیم: در سینتکس تابع زیر نشان داده شده است که تابع Range سه پارامتر دریافت میکند که دو تا از این پارامترها اختیاری یا همان Optional هستند، که از range (start, stop[, step]) تشکیل شدهاست.
start: شماره شروع لیست اعداد صحیح است. این حد پایین لیست است. تقریبا همیشه با 0 شروع میشود، با پارامترStart، شروع دنباله اعداد را در یک تابع محدوده مشخص میکنیم.
Stop: این نقطه پایان دنباله است، عدد به محض رسیدن به پارامتر توقف متوقف میشود. به عنوان یک (Upper limit) شناخته میشود همچنین به یاد داشتهباشید که range() هرگز عدد توقف را در نتیجه خود شامل نمی شود به زبان دیگر عدد پایانی قسمت Stop بخشی از خروجی نیست.
Step: تفاوت بین هر عدد در خروجی است. تقریبا همیشه 1 به عنوان پیش فرض است، در غیر این صورت، باید مراتب مد نظرتان را مشخص کنیم.
قوانین استفاده از تابع Range:
1_ همه آرگومانها: start، stop و step فقط عدد صحیح هستند. غیر صحیح یا انواع دادههای دیگر مجاز به استفاده در تابع range() نیستند.
2_هر سه استدلال ممکن است مثبت یا منفی باشند.
3_تابع range() فقط شامل اعداد صحیح در خروجی خود می شود.
4_ در صورتی که مقدار step صفر است و پیغام خطا میدهد. به طور پیش فرض، 1 یا بیشتر از 1 است.
مراحل استفاده از تابع Range:
1_ مقادیر start و stop را به range() منتقل کنید.
به عنوان مثال: محدوده (0، 6). در اینجا، start=0 و stop = 6. اعداد صحیح از شماره شروع تا توقف -1 تولید می کند. یعنی [0، 1، 2، 3، 4، 5]
2_ مقدار step و شرایط آن را به range() منتقل کنید.
مثال: مقدار مورد نظرتان برای تغییر را مشخص کنید. به عنوان مثال، محدوده (0، 6، 2). در اینجا، step = 2. نتیجه [0، 2، 4] است.
3_ برای دسترسی به هر عدد از حلقه for استفاده کنید.
Incrementing در تابع Range():
اگر میخواهید افزایش دهید، باید قدمی(Step) داشته باشید تا یک عدد مثبت باشد. برای اینکه بفهمید در عمل به چه معناست، کد زیر را تایپ کنید:
اگر عدد مد نظر شما ۲۵ باشد، خروجی حلقه شما به شکل زیر خواهد بود:
با مرحلهای که ایجاد کردید شما طیفی از اعداد را دریافت کردید که هر کدام ۲۵ از عدد قبلی بزرگتر بودند. در این قسمت که دیدید چگونه میتوانید در یک محدوده مشخص از اعداد به مقدار افزایشی خروجی داشته باشید، زمان آن رسیده است که ببینید چگونه میتوانید به عقب برگردید.
Decrementingدر تابع Range:
در صورتی که قصد دارید فاصله بین اعداد خروجی در تابع Range شما روند کاهشی داشته باشد، تغییرات لازم را باید در بخش Step ایجاد کنید. به مثال زیر توجه کنید: در اینجا Step شما -۲ می باشد بدین معنا که هر خروجی به مقدار ۲ کاهش مییابد.
شما طیفی از اعداد را دریافت کردید که هر کدام از عدد قبلی 2 کوچکتر بودند، قدر مطلق مرحلهای که ارائه کردید. به صورت تصویر بعدی است:
پایتونیک ترین راه برای ایجاد محدوده ای که کاهش می یابد، استفاده از محدوده (شروع، توقف، مرحله) است. اما پایتون یک تابع معکوس داخلی دارد. اگر range() را داخل reversed() قرار دهید، می توانید اعداد صحیح را به ترتیب معکوس چاپ کنید.
خروجی شما به شکل زیر خواهد بود:
range() امکان تکرار بر روی یک دنباله کاهشی از اعداد را فراهم میکند، در حالی که ()reversed معمولاً برای حلقه زدن روی یک دنباله به ترتیب معکوس استفاده میشود.
نکته: reversed() با Strings نیز کار میکند. شما میتوانید در مورد عملکرد reversed() با Strings در نحوه معکوس کردن یک رشته در پایتون اطلاعات بیشتری کسب کنید.
مثالهای پیشرفته از کاربرد تابع Range در پایتون:
اکنون که اصول اولیه نحوه استفاده از range() را میدانید، وقت آن است که کمی در کاربردها و حل مسئله با این تابع فراتر روید.
range() عمدتا برای دو منظور استفاده می شود: ۱ـ اجرای بدنه یک حلقه for به تعداد مشخص. ۲ـ ایجاد تکرارپذیری کارآمدتر از اعداد صحیح نسبت به لیستها یا تاپلها. اولین استفاده احتمالاً رایجترین است، و شما میتوانید این موضوع را مطرح کنید که itertools نسبت به range() راه کارآمدتری برای ساخت iterables به شما ارائه میدهد. در ادامه به بررسی نکاتی جزءی میپردازیم:
range() نوعی در پایتون است:
شما میتوانید به آیتمهای یک range() همانند یک لیست با فهرست دسترسی داشته باشید:
حتی میتوانید از علامتگذاری برش(Slice) در محدوده () استفاده کنید، اما خروجی در REPL ممکن است در ابتدا کمی عجیب به نظر برسد:
اگرچه ممکن است آن خروجی عجیب به نظر برسد، اما برش یک range() فقط محدوده دیگری را برمی گرداند.
استفاده از تابع Range در ایجاد الگوها در پایتون:
با استفاده از حلقههای Nested For میتوانیم در برنامهنویسی پایتون الگو برای اعداد، ستارهها *، اهرام و اشکال الماس ایجاد کنیم. برای تولید الگوها ساختارهای اساسی وجود دارد که برنامهنویس باید از آنها پیروی کند. به طور کلی از حلقه Nested استفاده میشود همچنین در حالی که حلقه والدparent loop سطرها را تعریف میکند و حلقه فرزندchild loop ستونهای الگو را مشخص می کند. تابع print() برای چاپ الگوی هرم، دیمون، ستاره و عدد استفاده میشود. دقت کنید که حلقه فرزند به مقدار حلقه والد بستگی دارد. بعد از هر سطر یک خط جدید با استفاده از: print(“\n”) اضافه کنید. به مثالهای زیر توجه کنید و در خانه همگی را در سیستم خود اجرا کنید:
در این مثال، میتوانیم ببینیم که کد الگوی نیمه هرمی وجود دارد. برای i و برای j برای حلقه ها تودرتو یا Nested هستند. تابع ()input برای گرفتن تعداد ردیفهایی که درج کردهایم 6 تا در i ذخیره میشوند و تکرار با j تودرتو برای حلقه پیادهسازی میشود، جایی که i با 1 تا محدودهای از مقدار 6 ردیف افزایش مییابد. print(“\r”) برای enter است، در غیر این صورت از print(“\n”) برای enter با یک ردیف استفاده کنید.
این مثال یک الگوی عددی با محدوده (7) است. در حلقه for بیرونی start=1،stop مقدار عدد پایانی است که 7 است. حلقه for داخلی کد تکرار را تا 7 اجرا میکند و سطرها و ستون ها را به شکل مثلث با اضافه کردن 1 در هر سطر چاپ میکند.
مقادیر ASCII برای چاپ کاراکترها با تابع chr() برای توابع range() استفاده میشود. در مثال بالا حروف به ردیف ۷ تایی محدود شدهاند. ASCII 65 که مقدار A را به عنوان آرگومان شروع ذخیره شده در متغیر asciiNumber_start به ما میدهد. از 65 تا 90 از A تا Z بزرگ است و 91 و 92 به ترتیب [ و \ هستند.
اعداد شناور (Float numbers) در تابع Range:
در پایتون، اگر یک عدد یک عدد کامل نباشد، یک شناور Float است. تفاوتهایی بین اعداد صحیح و شناور وجود دارد.
ویژگسهای اعداد کامل(int):
۱- یک عدد کامل است
۲- شامل نقطه اعشار نمی شود
۳- می تواند مثبت، منفی یا 0 باشد
ویژگیهای یک عدد ممیز (نوع داده شناور):
۱- می تواند هر عددی باشد که شامل یک نقطه اعشار باشد
۲- می تواند مثبت یا منفی باشد
در ادامه سعی کنید range() را با یک float اجرا کنید تا ببینید چه نتیجهای خواهد داد:
در خروجی خود باید پیغام خطای زیر را دریافت کنید:
استفاده از تابع Range در NumPy
NumPy یک کتابخانه پایتون third party است. اگر میخواهید از NumPy استفاده کنید، اولین قدم شما این است که بررسی کنید آیا آن را نصب کرده اید یا خیر. در تصویر زیر نحوه بررسی اینکار در پایتون برایتان گذاشته شده:
اگر یک ModuleNotFoundError دریافت کردید، باید آن را نصب کنید. برای انجام این کار، به خط فرمان خود بروید و pip install numpy را وارد کنید. پس از نصب، موارد زیر را وارد کنید:
در ادامه با خروجی زیر مواجه خواهید شد:
اگر می خواهید هر عدد را روی خط خودش پرینت کنید، می توانید موارد زیر را انجام دهید:
خروجی نهایی به صورت زیر خواهد بود:
احتمالاً برایتان سوأل پیش آمده است که عدد 0.8999999999999999 از کجا آمده است؟
کامپیوترها در ذخیره اعداد ممیز شناور اعشاری در اعداد ممیز شناور باینری مشکل دارند. این منجر به انواع نمایش های غیرمنتظره اعداد میشود.
معکوس تابع Range در پایتون
در پارامترهای تابع Range پایتون میتوان هم از عدد مثبت و هم از اعداد منفی استفاده کرد. میتوان با استفاده از این ویژگی، فرصتی برای پیادهسازی حلقههای معکوس به دست آورد. در این روش، بزرگترین عدد به عنوان پارامتر start ، کوچکترین عدد به عنوان پارامتر stop و عدد منفی برای مقدار step در نظر گرفته میشود. برای معکوس کردن یک محدوده در پایتون، از تابع ()reversed با تابع range() استفاده کنید. متد range() را در متد reversed() قرار دهید، میتوانید اعداد صحیح را به ترتیب معکوس چاپ کنید. پایتونیکترین راه برای تولید محدودهای که روند کاهشی دارد، استفاده از محدوده (شروع، توقف، مرحله) است. در نهایت پایتون یک تابع ()reversed داخلی در اختیار ما قرار میدهد.
در ادامه مثالی برای درک بهتر این روش ارائه شده است.
توجه داشته باشید که range() تکرار را از طریق یک سری کاهشی از اعداد آسان میکند، در حالی که ()reversed برای حلقه زدن روی سری به ترتیب معکوس استفاده میشود.
معکوس range پایتون با استفاده از روش دستی:
برای معکوس کردن یک محدوده (5، 0، -1)، شما باید مراحل زیر را دنبال کنید:
۱ـ شروع شما باید حداکثر تعداد تابع range شما باشد.
۲-توقف شما باید حداقل عدد باشد – 1 در تابع range شما باشد.
۳-شما باید 1 (-1) کاهش دهید تا دقیقاً عکس لیست خود را بدست آورید.
معکوس کردن یک محدوده یا دنباله ای از اعداد منجر به این می شود که دنباله ای حاوی اعداد از محدوده به ترتیب معکوس باشد. اگر آرگومان گامی شما منفی است، آنگاه شما در یک دنباله از اعداد در حال کاهش حرکت میکنید این به ما امکان می دهد تا اعداد را به عقب برگردانیم.
در این مثال، مرحله ما -1 است. این بدان معناست که برای هر حلقه 1 عدد کاهش مییابد.
در کد بالا باید عدد 1 را به 5 برگردانیم که به معنای 5 به 1 است. بنابراین، حداکثر مقدار ما شروع می شود، که 5 است، سپس مقدار حداقل -1 یعنی 1-1 0 است، که مقدار توقف است، و ما آن را در محدوده لحاظ نکردیم. سپس مرحله ما -1 است. یعنی 5، 5-1 = 4، 5-2=3، 5-3=2، 5-4=1. بنابراین، مقدار معکوس دقیق را دریافت میکنیم.
البته توجه داشته باشید که روش بالا یک روش استاندارد نیست و صرفاً جهت آسانسازی مثال زده شد.
چگونه تابع Range را به List تبدیل کنیم؟
دادهها در تابع Range در حافظه ذخیره نمیشوند، اما در List پایتون تمامی دادهها در حافظه ذخیره میشوند. Python Range میتواند منابع حافظه را ذخیره کند در حالی که لیست میتواند دادهها را با سرعت ارائه دهد. بنابراین، بر اساس نیاز، ممکن است نیاز داشته باشید که یک شی محدوده پایتون را به یک لیست تبدیل کنید. برای تبدیل یک محدوده پایتون به لیست پایتون، از سازنده list() استفاده کنید که پارامتر محدوده به عنوان آرگومان ارسال میشود. سازنده list() یک لیست تولید شده با استفاده از محدوده را برمی گرداند یا می توانید از یک حلقه for برای اضافه کردن هر آیتم از محدوده به لیست استفاده کنید. به مثال زیر توجه کنید:
خروجی تبدیل دادهی ایجاد شده به لیست در پایتون:
چگونه با استفاده از range() و حلقه for یک لیست را تکرار کنید؟
می توانید انواع دنباله پایتون مانند list و string را با استفاده از range() و برای حلقه تکرار کنید. وقتی لیست را فقط با استفاده از یک حلقه تکرار می کنید، فقط می توانید به موارد دسترسی داشته باشید. وقتی لیست را فقط با استفاده از یک حلقه تکرار میکنید، فقط میتوانید به آیتمهای آن دسترسی داشته باشید، اما وقتی از range() همراه با حلقه استفاده میکنید، میتوانید به شماره فهرست هر آیتم دسترسی داشته باشید. مزیت استفاده از range() برای تکرار یک لیست این است که به ما امکان دسترسی به شماره فهرست هر آیتم را می دهد. با استفاده از اعداد فهرست، میتوانیم به موارد فهرست دسترسی داشته باشیم و در صورت نیاز آنها را اصلاح کنیم. به مثال زیر توجه کنید:
با استفاده از تابع len() تعداد کل آیتم های لیست را به range() منتقل کنید. range() از آن به عنوان یک آرگومان توقف استفاده کنید.
خروجی شما به شکل زیر خواهد بود:
مثال دوم: الگوی اعداد زیر را با استفاده از range() Python و یک حلقه پرینت کنید.
پاسخ:
نکاتی دربارهی تابع Slice و شباهتهای آن با تابع Range
تابع Slice در تعیین نحوه برش یک دنباله کاربرد دارد. سینتکس تابع Slice دقیقاً همانند تابع رنج در پایتون است، اما هر پارامتر آن وظیفه متفاوتی از پارامترهای تابع رنج Range دارند. تابع Slice در پایتون تعیین میکند که دادهها از کجا شروع شوند و با چه گامهایی و تا کجا مورد استفاده قرار بگیرند.
سخن آخر: خلاصهای از نکات دربارهی تابع Range
در این محتوا در مورد توابع range() با الگوهای مختلف ساختارها مروری داشتیم. کاربردهای اصلی دیگری مانند آرگومانها در تابع range() و تکرار در حلقه برای با تابع range() وجود دارد که با مثالها و تصاویر دقیق مورد بحث قرار دادیم. تابع range() به طور خاص با اعداد صحیح استفاده میشود، اما در این محتوا آموختیم که از این تابع با کاراکترها استفاده کنیم. .تابع Range در پایتون دارای سه پارامتر ساده Start ،Stop و Step است که میتوان با تعریف این سه پارامتر دنباله مورد نظر خود را در هر برنامه یا حلقهای ایجاد کرد. خروجی این تابع یک دنباله است و میتوان با استفاده از ترفند اعداد منفی در جایگاه پارامتر Step دنبالهای معکوس نیز با تابع Range در پایتون ایجاد کرد.