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
@@ -155,7 +162,7 @@ next(nikkei_data)
155
162
next(nikkei_data)
156
163
```
157
164
158
-
### Iteratorها در حلقههای For
165
+
### Iteratorها در حلقههای for
159
166
160
167
```{index} single: Python; Iterators
161
168
```
@@ -317,7 +324,6 @@ max(y)
317
324
318
325
در این بخش، نحوه استفاده از آنها و تمایز موارد استفاده آنها را بررسی خواهیم کرد.
319
326
320
-
321
327
### باز کردن آرگومانها
322
328
323
329
وقتی روی لیستی از پارامترها عمل میکنیم، اغلب نیاز داریم که محتوای لیست را به عنوان آرگومانهای منفرد به جای یک مجموعه استخراج کنیم هنگام ارسال آنها به توابع.
@@ -484,6 +490,108 @@ arb(l1=l1, l2=l2, l3=l3)
484
490
485
491
تفاوت این است که توابع با `*args` قادر خواهند بود *آرگومانهای موضعی* با اندازه دلخواه بپذیرند، در حالی که `**kargs` به توابع اجازه میدهد تعداد دلخواه *آرگومانهای کلیدواژهای* بپذیرند.
486
492
493
+
## راهنمای نوع (Type Hints)
494
+
495
+
```{index} single: Python; Type Hints
496
+
```
497
+
498
+
پایتون یک زبان *با نوعدهی پویا* است، به این معنی که نیازی به اعلان نوع متغیرها ندارید.
499
+
500
+
(بحث {doc}`پیشین <need_for_speed>` ما درباره نوعهای پویا در برابر استاتیک را ببینید.)
501
+
502
+
با این حال، پایتون از **راهنمای نوع** (type hints) اختیاری (که به آن حاشیهنویسی نوع نیز گفته میشود) پشتیبانی میکند که به شما امکان میدهد نوعهای مورد انتظار متغیرها، پارامترهای تابع، و مقادیر بازگشتی را مشخص کنید.
503
+
504
+
راهنمای نوع از پایتون ۳.۵ معرفی شد و در نسخههای بعدی تکامل یافت.
505
+
تمام نحو نشاندادهشده در اینجا در پایتون ۳.۹ و بعد از آن کار میکند.
506
+
507
+
```{note}
508
+
راهنمای نوع *در زمان اجرا توسط مفسر پایتون نادیده گرفته میشود* --- آنها بر نحوه اجرای کد شما تأثیری ندارند. آنها صرفاً اطلاعاتی هستند و به عنوان مستندات برای انسانها و ابزارها عمل میکنند.
509
+
```
510
+
511
+
### نحو پایه
512
+
513
+
راهنمای نوع از دونقطه `:` برای حاشیهنویسی متغیرها و پارامترها، و از پیکان `->` برای حاشیهنویسی نوعهای بازگشتی استفاده میکند.
514
+
515
+
در اینجا یک مثال ساده آمده است:
516
+
517
+
```{code-cell} python3
518
+
def greet(name: str, times: int) -> str:
519
+
return (name + '! ') * times
520
+
521
+
greet('hello', 3)
522
+
```
523
+
524
+
در این تعریف تابع:
525
+
526
+
-`name: str` نشان میدهد که `name` انتظار میرود یک رشته باشد
527
+
-`times: int` نشان میدهد که `times` انتظار میرود یک عدد صحیح باشد
528
+
-`-> str` نشان میدهد که تابع یک رشته برمیگرداند
529
+
530
+
همچنین میتوانید متغیرها را مستقیماً حاشیهنویسی کنید:
یک نکته مهم برای برنامهنویسان جدید پایتون: راهنمای نوع در زمان اجرا *اجبار نمیشوند*.
561
+
562
+
پایتون در صورت ارسال نوع «اشتباه» خطایی ایجاد نمیکند:
563
+
564
+
```{code-cell} python3
565
+
def add(x: int, y: int) -> int:
566
+
return x + y
567
+
568
+
# Passes floats — Python doesn't complain
569
+
add(1.5, 2.7)
570
+
```
571
+
572
+
راهنماها میگویند `int`، اما پایتون با خوشحالی آرگومانهای `float` را میپذیرد و `4.2` برمیگرداند --- که آن هم `int` نیست.
573
+
574
+
این تفاوت کلیدی با زبانهای با نوعدهی ایستا مانند C یا Java است، که در آنها عدم تطابق نوعها باعث خطاهای کامپایل میشود.
575
+
576
+
### چرا از راهنمای نوع استفاده کنیم؟
577
+
578
+
اگر پایتون آنها را نادیده میگیرد، چرا زحمت بکشیم؟
579
+
580
+
1.**خوانایی**: راهنمای نوع امضای تابع را خوددستنویس (self-documenting) میکند. خواننده فوراً میداند که یک تابع چه نوعهایی را انتظار دارد و چه نوعهایی برمیگرداند.
581
+
2.**پشتیبانی ویرایشگر**: IDEهایی مانند VS Code از راهنمای نوع برای ارائه تکمیل خودکار بهتر، تشخیص خطا، و مستندات درخطی استفاده میکنند.
582
+
3.**بررسی خطا**: ابزارهایی مانند [mypy](https://mypy.readthedocs.io/) و [pyrefly](https://pyrefly.org/) راهنمای نوع را تجزیهوتحلیل میکنند تا اشکالات را *قبل از* اجرای کد شناسایی کنند.
583
+
4.**کد تولیدشده توسط LLM**: مدلهای زبانی بزرگ اغلب کدی با راهنمای نوع تولید میکنند، بنابراین درک نحو به شما کمک میکند خروجی آنها را بخوانید و استفاده کنید.
584
+
585
+
### راهنمای نوع در پایتون علمی
586
+
587
+
راهنمای نوع به بحث {doc}`نیاز به سرعت <need_for_speed>` ارتباط دارد:
588
+
589
+
* کتابخانههای پرکارایی مانند [JAX](https://jax.readthedocs.io/) و [Numba](https://numba.pydata.org/) برای کامپایل کد ماشین سریع به دانستن نوع متغیرها متکی هستند.
590
+
* در حالی که این کتابخانهها نوعها را در زمان اجرا استنتاج میکنند نه اینکه مستقیماً راهنمای نوع پایتون را بخوانند، *مفهوم* یکسان است --- اطلاعات صریح نوع، بهینهسازی را ممکن میسازد.
591
+
* با تکامل اکوسیستم پایتون، انتظار میرود ارتباط بین راهنمای نوع و ابزارهای کارایی بیشتر شود.
592
+
593
+
در حال حاضر، مزیت اصلی راهنمای نوع در پایتون روزمره *وضوح و پشتیبانی ابزار* است، که با افزایش اندازه برنامهها ارزش آن بیشتر میشود.
594
+
487
595
## Decoratorها و Descriptorها
488
596
489
597
```{index} single: Python; Decorators
@@ -598,7 +706,7 @@ g = check_nonneg(g)
598
706
599
707
در عین حال، منطق تست فقط یک بار نوشته شده است.
600
708
601
-
#### Decoratorها وارد میشوند
709
+
#### decoratorها وارد میشوند
602
710
603
711
```{index} single: Python; Decorators
604
712
```
@@ -770,7 +878,7 @@ car.kms
770
878
به عنوان یک property، وقتی مقدار آن را از طریق `car.miles = 6000` تنظیم میکنیم، متد setter
771
879
آن فعال میشود --- در این مورد `set_miles`.
772
880
773
-
#### Decoratorها و Propertyها
881
+
#### decoratorها و propertyها
774
882
775
883
```{index} single: Python; Decorators
776
884
```
@@ -823,7 +931,7 @@ class Car:
823
931
824
932
دو راه برای ساخت generatorها مطالعه خواهیم کرد: عبارات generator و توابع generator.
825
933
826
-
### عبارات Generator
934
+
### عبارات generator
827
935
828
936
سادهترین راه برای ساخت generatorها استفاده از *عبارات generator* است.
829
937
@@ -879,7 +987,7 @@ sum((x * x for x in range(10)))
879
987
sum(x * x for x in range(10))
880
988
```
881
989
882
-
### توابع Generator
990
+
### توابع generator
883
991
884
992
```{index} single: Python; Generator Functions
885
993
```
@@ -1026,7 +1134,7 @@ def g(x):
1026
1134
x = x * x
1027
1135
```
1028
1136
1029
-
### مزایای Iteratorها
1137
+
### مزایای iteratorها
1030
1138
1031
1139
مزیت استفاده از iterator اینجا چیست؟
1032
1140
@@ -1084,7 +1192,6 @@ sum(draws)
1084
1192
* نیاز به ایجاد لیستها/tupleهای بزرگ را از بین میبرند، و
1085
1193
* یک رابط یکنواخت برای تکرار فراهم میکنند که میتواند به صورت شفاف در حلقههای `for` استفاده شود
0 commit comments