|
1 | 1 | .. role:: emoji-size |
2 | 2 |
|
3 | 3 | .. meta:: |
4 | | - :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش دستورهای کنترلی در پایتون، آموزش دستور انتخاب در پایتون، آموزش دستور تکرار در پایتون، if در پایتون، else در پایتون، حلقه در پایتون، for در پایتون |
5 | | - :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, انواع شی, انواع داده, انواع شی در پایتون, انواع داده در پایتون, پایتون |
| 4 | + :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامهنویسی پایتون - درس نهم: دستورهای کنترلی در پایتون |
| 5 | + :keywords: معرفی پایتون, تاریخچه پایتون, کارایی پایتون, نسخه های پایتون, ویژگی های پایتون, آشنایی با پایتون, آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون |
| 6 | + |
| 7 | + |
| 8 | +.. _lesson-09: |
6 | 9 |
|
7 | 10 |
|
8 | 11 | درس ۰۹: دستورهای کنترلی در پایتون |
9 | 12 | ================================== |
10 | 13 |
|
11 | 14 | .. figure:: /_static/pages/09-python-if-else-for-while.jpg |
12 | 15 | :align: center |
13 | | - :alt: دستورهای کنترلی در پایتون |
| 16 | + :alt: درس نهم: دستورهای کنترلی در پایتون |
14 | 17 | :class: page-image |
15 | 18 |
|
16 | 19 | Photo by `Lynda Sanchez <https://unsplash.com/photos/GCbGxU4mBu0>`__ |
|
32 | 35 |
|
33 | 36 | ---- |
34 | 37 |
|
| 38 | + |
| 39 | +.. _python-selection: |
| 40 | + |
35 | 41 | انتخاب |
36 | 42 | -------- |
37 | 43 |
|
38 | | -با استفاده از دستور انتخاب میتوان بر حسب شرایط برنامه در زمان اجرا تعیین کرد که آیا یک بلاک دستور اجرا شود یا خیر و همچنین از بین دو یا چند بلاک دستور کدام یک انتخاب و اجرا گردد. پایتون تنها یک ساختار انتخاب را ارایه میدهد که میتواند به سه شکل «تک انتخابی»، «دو انتخابی» و «چند انتخابی» پیادهسازی گردد؛ این ساختار به نام دستور ``if`` خوانده میشود و در ادامه بررسی خواهد شد. |
| 44 | +با استفاده از دستور انتخاب میتوان بر حسب شرایط برنامه در زمان اجرا تعیین کرد که آیا یک بلاک دستور اجرا شود یا خیر و همچنین از بین دو یا چند بلاک دستور کدام یک انتخاب و اجرا گردد. رایجترین دستور انتخاب در پایتون ``if`` است که میتواند به سه شکل «تک انتخابی»، «دو انتخابی» و «چند انتخابی» پیادهسازی گردد. این ساختار در ادامه بررسی خواهد شد. |
| 45 | + |
| 46 | + |
| 47 | +.. _python-if: |
39 | 48 |
|
40 | 49 | دستور if |
41 | 50 | ~~~~~~~~~~ |
|
266 | 275 | 50-75 % |
267 | 276 | 25-50 % |
268 | 277 |
|
269 | | -.. rubric:: دستور switch/case |
270 | 278 |
|
271 | | -در صورتی که سابقه برنامهنویسی با زبانهای دیگری همچون C و Java را داشته باشید حتما با دستور switch نیز آشنا هستید؛ **این دستور در زبان پایتون پیادهسازی نشده است**. |
| 279 | +.. _python-match-case: |
272 | 280 |
|
273 | | -دستور switch مقداری را دریافت میکند و سپس آن را با مقدارهای هر case درون ساختار خود به ترتیب مقایسه میکند؛ در صورتی که این مقدار با یکی از case ها برابر باشد، دستورهای مرتبط با آن case را اجرا کرده و از بررسی دیگر case ها صرف نظر میکند. همچنین اگر مقدار دریافتی با هیچ یک از case ها مطابقت نداشته باشد دستورهای مربوط به بخش default (در صورت وجود) را اجرا میکند. در پایین نمونهایی از این دستور در زبان **Java** آورده شده است: |
| 281 | +دستور match/case |
| 282 | +~~~~~~~~~~~~~~~~~~~~ |
274 | 283 |
|
275 | | -.. code-block:: java |
| 284 | +در صورتی که سابقه برنامهنویسی با زبانهای دیگری همچون C و Java را داشته باشید حتما با دستور switch نیز آشنا هستید؛ تا پیش **از نسخه 3.10 پایتون** این دستور در زبان پایتون پیادهسازی نشده بود و تنها میتوانستیم از ساختار ``if/elif/else`` استفاده نماییم. ولی اکنون پایتون از ساختار مشابهی به نام ``match/case`` پشتیبانی میکند که ساختاری برابر زیر دارد:: |
276 | 285 |
|
277 | | - int success; |
278 | | - char grade = 'B'; |
279 | 286 |
|
280 | | -.. code-block:: java |
| 287 | + match value: |
| 288 | + case matching_rule_1: statement_1 |
| 289 | + case matching_rule_2: statement_2 |
| 290 | + case matching_rule_3: statement_3 |
| 291 | + . |
| 292 | + . |
| 293 | + . |
281 | 294 |
|
282 | | - switch (grade) { |
283 | | - case 'A': |
284 | | - System.out.println("Excellent grade"); |
285 | | - success = 1; |
286 | | - break; |
287 | | - case 'B': |
288 | | - System.out.println("Very good grade"); |
289 | | - success = 1; |
290 | | - break; |
291 | | - case 'C': |
292 | | - System.out.println("Good grade"); |
293 | | - success = 1; |
294 | | - break; |
295 | | - case 'D': |
296 | | - case 'E': |
297 | | - case 'F': |
298 | | - System.out.println("Low grade"); |
299 | | - success = 0; |
300 | | - break; |
301 | | - default: |
302 | | - System.out.println("Invalid grade"); |
303 | | - success = -1; |
304 | | - break; |
305 | | - } |
| 295 | +این دستور یک مقدار را دریافت میکند و با الگوهای درج شده توسط ``case`` مطابقت میدهد (از بالا به پایین) و با نخستین عمل انطباق موفق، دستورهای مرتبط با آن را اجرا کرده و سپس پایان مییابد. |
306 | 296 |
|
307 | | -برای پیادهسازی چنین ساختاری در پایتون میتوان از ``if/elif/else`` استفاده کرد: |
308 | | - |
309 | | -.. code-block:: python |
310 | | -
|
311 | | - grade = 'B' |
312 | | -
|
313 | | -.. code-block:: python |
314 | | -
|
315 | | - if grade == 'A': |
316 | | - print('Excellent grade') |
317 | | - success = 1 |
318 | | - elif grade == 'B': |
319 | | - print('Very good grade') |
320 | | - success = 1 |
321 | | - elif grade in ('D', 'E', 'F'): |
322 | | - print('Low grade') |
323 | | - success = 0 |
324 | | - else: |
325 | | - print('Invalid grade') |
326 | | - success = -1 |
| 297 | +خواهید دید که این دستور بسیار منعطف بوده و پیشرفتهتر از دستور ``switch`` سنتی است. با یک مثال ساده شروع میکنیم:: |
327 | 298 |
|
| 299 | + |
| 300 | + >>> list = [4, 5, 6, 0, 2, 1, 3] |
| 301 | + >>> |
| 302 | + >>> first_num = list[0] |
| 303 | + >>> |
| 304 | + >>> match first_num: |
| 305 | + ... case 0: print('Zero') |
| 306 | + ... case 1: print('One') |
| 307 | + ... case 2: print('Two') |
| 308 | + ... case 3: print('Three') |
| 309 | + ... case 4: print('Four') |
| 310 | + ... case 5: print('Five') |
| 311 | + ... case 6: print('Six') |
| 312 | + ... |
| 313 | + Four |
| 314 | + >>> |
| 315 | + |
| 316 | +در مثال بالا مقدار حروفی مربوط به عدد اندیس یکم از شی list چاپ خواهد شد. |
| 317 | + |
| 318 | +مثالی دیگر، تشخیص زوج بودن یک عدد:: |
| 319 | + |
| 320 | + |
| 321 | + >>> list = [4, 5, 6, 0, 2, 1, 3] |
| 322 | + >>> |
| 323 | + >>> first_num = list[0] |
| 324 | + >>> |
| 325 | + >>> match first_num % 2: |
| 326 | + ... case 0: |
| 327 | + ... print('The number is even') |
| 328 | + ... case 1: |
| 329 | + ... print('The number is odd') |
| 330 | + ... |
| 331 | + The number is even |
| 332 | + |
| 333 | +هدف اصلی از ایجاد دستور ``match/case`` در پایتون، سادهسازی و افزایش خوانایی کد در زمان استفاده از دستور ``if/elif/else`` است. |
| 334 | + |
| 335 | + |
| 336 | +هر بخش ``case`` میتواند بیش از یک انطباق را بررسی کند. برای این منظور میتوان از کاراکتر ``|`` برای جداسازی الگوها استفاده نمود:: |
| 337 | + |
| 338 | + >>> list = [4, 5, 6, 0, 2, 1, 3] |
| 339 | + >>> |
| 340 | + >>> first_num = list[0] |
| 341 | + >>> |
| 342 | + >>> match first_num: |
| 343 | + ... case 0 | 2 | 4 | 6 | 8: |
| 344 | + ... print('The number is even') |
| 345 | + ... case 1 | 3 | 5 | 7 | 9: |
| 346 | + ... print('The number is odd') |
| 347 | + ... |
| 348 | + The number is even |
| 349 | + |
| 350 | +همچنین میتوان یک ``case`` پیشفرض نیز برای این ساختار در نظر گرفت، برای پردازش مقدار در زمانی که با هیچ یک از الگوهای موجود تطابق پیدا نکرد. برای درج ``case`` پیشفرض از الگو ``_`` استفاده میگردد. این الگو در ساختار ``match/case`` با هر مقداری تظابق داده میشود و میبایست برای جلوگیری از خطاهای منطقی، حتما به عنوان آخرین ``case`` قرار داده شود:: |
| 351 | + |
| 352 | + |
| 353 | + >>> list = [1, 2, 3, 'A', 'A', 'AAA'] |
| 354 | + >>> first_num = list[-1] |
| 355 | + >>> match first_num: |
| 356 | + ... case 0 | 2 | 4 | 6 | 8: |
| 357 | + ... print('The number is even') |
| 358 | + ... case 1 | 3 | 5 | 7 | 9: |
| 359 | + ... print('The number is odd') |
| 360 | + ... case _: |
| 361 | + ... print("The received value is not a number") |
| 362 | + ... |
| 363 | + The received value is not a number |
| 364 | + |
| 365 | +در بخش ``case`` حتی میتوان از دستور ``if`` نیز استفاده نمود:: |
| 366 | + |
| 367 | + >>> list = [4, -5, 6, 0, 2, -1, 3] |
| 368 | + >>> |
| 369 | + >>> num = list[0] |
| 370 | + >>> |
| 371 | + >>> match num: |
| 372 | + ... case num if num < 0: |
| 373 | + ... print('The number is negative') |
| 374 | + ... case num if num == 0: |
| 375 | + ... print('The number is zero') |
| 376 | + ... case num if num > 0: |
| 377 | + ... print('The number is positive') |
| 378 | + ... |
| 379 | + The number is positive |
| 380 | + |
| 381 | +به این نگارش یا سینتکس از دستور ``if`` در جامعه پایتون، تکنیک ``guard`` گفته میشود. در این ساختار متغیری که در پشت ``if`` قرار میگیرد، همان مقدار دریافتی است. این متغیر میتواند هر نامی داشته باشد ولی حتما میبایست با متغیر درون دستور ``if`` همنام باشد (در مثال بالا برای جلوگیری از ابهام، همنام با خود مقدار دریافتی در نظر گرفته شده است). در این شرایط چنانچه ارزیابی دستور ``if`` برابر مقدار ``True`` باشد، دستورهای ``case`` آن اجرا میگردد و در غیر اینصورت الگوی ``case`` بعدی مورد پردازش قرار خواهد گرفت. |
| 382 | + |
| 383 | + |
| 384 | +.. _python-loop: |
328 | 385 |
|
329 | 386 | تکرار |
330 | 387 | ------- |
331 | 388 |
|
332 | | -گاهی نیاز پیدا میکنیم که بلاکی را چندین بار پشت سرهم اجرا نماییم. به ساختار تکرار «حلقه» (Loop) گفته میشود؛ در ادامه به بررسی ساختار دو حلقه ارایه شده در زبان پایتون خواهیم پرداخت. |
| 389 | +گاهی نیاز پیدا میکنیم که بلاکی را چندین بار پشت سرهم اجرا نماییم. به ساختار تکرار، «حلقه» (Loop) گفته میشود؛ در ادامه به بررسی ساختار دو حلقه ارایه شده در زبان پایتون خواهیم پرداخت. |
| 390 | + |
| 391 | + |
| 392 | +.. _python-while: |
333 | 393 |
|
334 | 394 | دستور while |
335 | 395 | ~~~~~~~~~~~~~ |
|
0 commit comments