You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Generators::Generator functions::Example 1: مثال 1
39
+
Generators::Generator functions::Example 2: مثال 2
40
+
Generators::Advantages of iterators: مزایای iteratorها
34
41
Exercises: تمرینها
35
42
---
36
43
@@ -47,14 +54,14 @@ heading-map:
47
54
48
55
## مروری کلی
49
56
50
-
توصیه ما برای این سخنرانی آخر این است که **در مرور اول آن را رد کنید**، مگر اینکه میل شدیدی به خواندن آن داشته باشید.
57
+
توصیه ما برای این درس آخر این است که *در مرور اول آن را رد کنید*، مگر اینکه میل شدیدی به خواندن آن داشته باشید.
51
58
52
-
این سخنرانی اینجاست
59
+
این درس اینجاست
53
60
54
61
1. به عنوان مرجع، تا بتوانیم در صورت نیاز به آن لینک دهیم، و
55
62
1. برای کسانی که تعدادی از کاربردها را انجام دادهاند و اکنون میخواهند بیشتر درباره زبان Python یاد بگیرند
56
63
57
-
موضوعات متنوعی در این سخنرانی بررسی میشوند، از جمله iteratorها، decoratorها و descriptorها، و generatorها.
64
+
موضوعات متنوعی در این درس بررسی میشوند، از جمله iteratorها، type hintها، decoratorها و descriptorها، و generatorها.
58
65
59
66
## Iterableها و Iteratorها
60
67
@@ -66,6 +73,7 @@ heading-map:
66
73
اکنون بیایید دقیقتر به نحوه کار آن نگاه کنیم، با تمرکز بر پیادهسازی Python از حلقه `for`.
67
74
68
75
(iterators)=
76
+
69
77
### Iteratorها
70
78
71
79
```{index} single: Python; Iterators
@@ -155,7 +163,7 @@ next(nikkei_data)
155
163
next(nikkei_data)
156
164
```
157
165
158
-
### Iteratorها در حلقههای For
166
+
### Iteratorها در حلقههای for
159
167
160
168
```{index} single: Python; Iterators
161
169
```
@@ -317,7 +325,6 @@ max(y)
317
325
318
326
در این بخش، نحوه استفاده از آنها و تمایز موارد استفاده آنها را بررسی خواهیم کرد.
319
327
320
-
321
328
### باز کردن آرگومانها
322
329
323
330
وقتی روی لیستی از پارامترها عمل میکنیم، اغلب نیاز داریم که محتوای لیست را به عنوان آرگومانهای منفرد به جای یک مجموعه استخراج کنیم هنگام ارسال آنها به توابع.
@@ -484,6 +491,108 @@ arb(l1=l1, l2=l2, l3=l3)
484
491
485
492
تفاوت این است که توابع با `*args` قادر خواهند بود *آرگومانهای موضعی* با اندازه دلخواه بپذیرند، در حالی که `**kargs` به توابع اجازه میدهد تعداد دلخواه *آرگومانهای کلیدواژهای* بپذیرند.
486
493
494
+
## راهنمای نوع
495
+
496
+
```{index} single: Python; Type Hints
497
+
```
498
+
499
+
پایتون یک زبان *با نوعبندی پویا* است، به این معنا که نیازی به اعلام نوع متغیرها ندارید.
500
+
501
+
(بحث {doc}`قبلی ما <need_for_speed>` درباره نوعبندی پویا در مقابل ایستا را ببینید.)
502
+
503
+
با این حال، پایتون از **راهنمای نوع** اختیاری (که به آن حاشیهنویسی نوع نیز گفته میشود) پشتیبانی میکند که به شما امکان میدهد نوعهای مورد انتظار متغیرها، پارامترهای تابع و مقادیر بازگشتی را مشخص کنید.
504
+
505
+
راهنمای نوع از پایتون ۳.۵ معرفی شده و در نسخههای بعدی توسعه یافته است.
506
+
تمام نحوی که در اینجا نشان داده شده در پایتون ۳.۹ و بعد از آن کار میکند.
507
+
508
+
```{note}
509
+
راهنمای نوع در زمان اجرا *توسط مفسر پایتون نادیده گرفته میشود* --- آنها بر نحوه اجرای کد شما تأثیر نمیگذارند. آنها صرفاً اطلاعاتی هستند و به عنوان مستندات برای انسانها و ابزارها عمل میکنند.
510
+
```
511
+
512
+
### نحو پایه
513
+
514
+
راهنمای نوع از دو نقطه `:` برای حاشیهنویسی متغیرها و پارامترها، و از پیکان `->` برای حاشیهنویسی نوعهای بازگشتی استفاده میکند.
515
+
516
+
در اینجا یک مثال ساده آمده است:
517
+
518
+
```{code-cell} python3
519
+
def greet(name: str, times: int) -> str:
520
+
return (name + '! ') * times
521
+
522
+
greet('hello', 3)
523
+
```
524
+
525
+
در این تعریف تابع:
526
+
527
+
-`name: str` نشان میدهد که `name` انتظار میرود یک رشته باشد
528
+
-`times: int` نشان میدهد که `times` انتظار میرود یک عدد صحیح باشد
529
+
-`-> str` نشان میدهد که تابع یک رشته برمیگرداند
530
+
531
+
همچنین میتوانید متغیرها را مستقیماً حاشیهنویسی کنید:
532
+
533
+
```{code-cell} python3
534
+
x: int = 10
535
+
y: float = 3.14
536
+
name: str = 'Python'
537
+
```
538
+
539
+
### نوعهای رایج
540
+
541
+
پرکاربردترین راهنمای نوع، نوعهای توکار هستند:
542
+
543
+
| نوع | مثال |
544
+
|-----------|----------------------------------|
545
+
|`int`|`x: int = 5`|
546
+
|`float`|`x: float = 3.14`|
547
+
|`str`|`x: str = 'hello'`|
548
+
|`bool`|`x: bool = True`|
549
+
|`list`|`x: list = [1, 2, 3]`|
550
+
|`dict`|`x: dict = {'a': 1}`|
551
+
552
+
برای ظرفها، میتوانید نوعهای عناصر آنها را مشخص کنید:
یک نکته مهم برای برنامهنویسان جدید پایتون: راهنمای نوع در زمان اجرا *اعمال نمیشود*.
562
+
563
+
پایتون در صورت ارسال نوع «اشتباه» خطایی ایجاد نمیکند:
564
+
565
+
```{code-cell} python3
566
+
def add(x: int, y: int) -> int:
567
+
return x + y
568
+
569
+
# Passes floats — Python doesn't complain
570
+
add(1.5, 2.7)
571
+
```
572
+
573
+
راهنمای نوع `int` را نشان میدهد، اما پایتون با خوشحالی آرگومانهای `float` را میپذیرد و `4.2` را برمیگرداند --- که آن هم `int` نیست.
574
+
575
+
این تفاوت کلیدی با زبانهای با نوعبندی ایستا مانند C یا Java است، که در آنها عدم تطابق نوعها باعث خطاهای کامپایل میشود.
576
+
577
+
### چرا از راهنمای نوع استفاده کنیم؟
578
+
579
+
اگر پایتون آنها را نادیده میگیرد، چرا زحمت آن را بکشیم؟
580
+
581
+
1.**خوانایی**: راهنمای نوع امضای تابع را خودمستندساز میکند. خواننده بلافاصله میداند که تابع چه نوعهایی را انتظار دارد و برمیگرداند.
582
+
2.**پشتیبانی ویرایشگر**: محیطهای توسعه یکپارچه مانند VS Code از راهنمای نوع برای ارائه تکمیل خودکار بهتر، تشخیص خطا و مستندات درونخطی استفاده میکنند.
583
+
3.**بررسی خطا**: ابزارهایی مانند [mypy](https://mypy.readthedocs.io/) و [pyrefly](https://pyrefly.org/) راهنمای نوع را تحلیل میکنند تا اشکالات را *قبل از* اجرای کد شناسایی کنند.
584
+
4.**کد تولیدشده توسط مدلهای زبانی بزرگ**: مدلهای زبانی بزرگ اغلب کدی با راهنمای نوع تولید میکنند، بنابراین درک نحو به شما کمک میکند تا خروجی آنها را بخوانید و استفاده کنید.
585
+
586
+
### راهنمای نوع در پایتون علمی
587
+
588
+
راهنمای نوع به بحث {doc}`نیاز به سرعت <need_for_speed>` مرتبط است:
589
+
590
+
* کتابخانههای پرکارایی مانند [JAX](https://jax.readthedocs.io/) و [Numba](https://numba.pydata.org/) برای کامپایل کد ماشین سریع به دانستن نوع متغیرها متکی هستند.
591
+
* در حالی که این کتابخانهها نوعها را در زمان اجرا استنتاج میکنند نه اینکه مستقیماً راهنمای نوع پایتون را بخوانند، *مفهوم* یکسان است --- اطلاعات صریح نوع، بهینهسازی را ممکن میسازد.
592
+
* با تکامل اکوسیستم پایتون، انتظار میرود ارتباط بین راهنمای نوع و ابزارهای کارایی رشد کند.
593
+
594
+
در حال حاضر، مزیت اصلی راهنمای نوع در پایتون روزمره *وضوح و پشتیبانی ابزاری* است، که با بزرگتر شدن برنامهها ارزش آن بیشتر میشود.
595
+
487
596
## Decoratorها و Descriptorها
488
597
489
598
```{index} single: Python; Decorators
@@ -656,6 +765,7 @@ def g(x):
656
765
به نظر بسیاری از افراد، این نحو decorator را به یک بهبود قابل توجه برای زبان تبدیل میکند.
657
766
658
767
(descriptors)=
768
+
659
769
### Descriptorها
660
770
661
771
```{index} single: Python; Descriptors
@@ -770,7 +880,7 @@ car.kms
770
880
به عنوان یک property، وقتی مقدار آن را از طریق `car.miles = 6000` تنظیم میکنیم، متد setter
771
881
آن فعال میشود --- در این مورد `set_miles`.
772
882
773
-
#### Decoratorها و Propertyها
883
+
#### Decoratorها و propertyها
774
884
775
885
```{index} single: Python; Decorators
776
886
```
@@ -814,6 +924,7 @@ class Car:
814
924
برای اطلاعات بیشتر میتوانید به [مستندات descriptor](https://docs.python.org/3/howto/descriptor.html) مراجعه کنید.
815
925
816
926
(paf_generators)=
927
+
817
928
## Generatorها
818
929
819
930
```{index} single: Python; Generators
@@ -823,7 +934,7 @@ class Car:
823
934
824
935
دو راه برای ساخت generatorها مطالعه خواهیم کرد: عبارات generator و توابع generator.
825
936
826
-
### عبارات Generator
937
+
### عبارات generator
827
938
828
939
سادهترین راه برای ساخت generatorها استفاده از *عبارات generator* است.
829
940
@@ -879,7 +990,7 @@ sum((x * x for x in range(10)))
879
990
sum(x * x for x in range(10))
880
991
```
881
992
882
-
### توابع Generator
993
+
### توابع generator
883
994
884
995
```{index} single: Python; Generator Functions
885
996
```
@@ -1026,7 +1137,7 @@ def g(x):
1026
1137
x = x * x
1027
1138
```
1028
1139
1029
-
### مزایای Iteratorها
1140
+
### مزایای iteratorها
1030
1141
1031
1142
مزیت استفاده از iterator اینجا چیست؟
1032
1143
@@ -1084,7 +1195,6 @@ sum(draws)
1084
1195
* نیاز به ایجاد لیستها/tupleهای بزرگ را از بین میبرند، و
1085
1196
* یک رابط یکنواخت برای تکرار فراهم میکنند که میتواند به صورت شفاف در حلقههای `for` استفاده شود
0 commit comments