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
حالا، چندین راه وجود دارد که میتوانیم کد بالا را ساده کنیم.
367
371
368
-
به عنوان مثال، میتوانیم شرطها را کاملاً حذف کنیم و فقط نوع خروجی مورد نظر را *به عنوان یک تابع* به برنامه بدهیم.
372
+
به عنوان مثال، میتوانیم شرطها را کاملاً حذف کنیم و فقط نوع خروجی مورد نظر را به عنوان یک تابع، متد، یا شیء [callable](https://typing.python.org/en/latest/spec/callables.html) دیگر به برنامه بدهیم.
حالا، وقتی تابع `()generate_data` را فراخوانی میکنیم، `np.random.uniform` را به عنوان آرگومان دوم ارسال میکنیم.
390
+
حالا، وقتی تابع `()generate_data` را فراخوانی میکنیم، `rng.uniform` را به عنوان آرگومان دوم ارسال میکنیم.
387
391
388
-
این شیء یک *تابع* است.
392
+
این شیء یک *callable* است؛ یعنی شیئی که میتوان با استفاده از پرانتز آن را فراخوانی کرد.
389
393
390
-
وقتی فراخوانی تابع `generate_data(100, np.random.uniform)` اجرا میشود، پایتون بلوک کد تابع را با `n` برابر با 100 و نام `generator_type` "متصل" به تابع `np.random.uniform` اجرا میکند.
394
+
وقتی فراخوانی تابع `generate_data(100, rng.uniform)` اجرا میشود، پایتون بلوک کد تابع را با `n` برابر با 100 و نام `generator_type` "متصل" به callable ای به نام `rng.uniform` اجرا میکند.
391
395
392
-
* در حالی که این خطوط اجرا میشوند، نامهای `generator_type` و `np.random.uniform` "مترادف" هستند و میتوانند به روشهای یکسان استفاده شوند.
396
+
* در حالی که این خطوط اجرا میشوند، نامهای `generator_type` و `rng.uniform` "مترادف" هستند و میتوانند به روشهای یکسان استفاده شوند.
393
397
394
398
این اصل به طور کلی هم کار میکند؛ به عنوان مثال، قطعه کد زیر را در نظر بگیرید:
395
399
@@ -404,7 +408,7 @@ m(7, 2, 4)
404
408
405
409
در اینجا ما نام دیگری برای تابع داخلی `()max` ایجاد کردیم که سپس میتوانست به روشهای یکسان استفاده شود.
406
410
407
-
در چارچوب برنامه ما، توانایی اتصال نامهای جدید به توابعبه این معنی است که هیچ مشکلی در *ارسال یک تابع به عنوان آرگومان به تابع دیگر* وجود ندارد؛همانطور که در بالا انجام دادیم.
411
+
در چارچوب برنامه ما، توانایی اتصال نامها به توابع، یا به طور کلیتر به اشیاء callable، به این معنی است که هیچ مشکلی در ارسال یک شیء callable به عنوان آرگومان به callable دیگر وجود ندارد؛همانطور که با `rng.uniform` در بالا انجام دادیم.
408
412
409
413
(recursive_functions)=
410
414
## فراخوانی توابع بازگشتی (پیشرفته)
@@ -502,7 +506,7 @@ factorial(4)
502
506
503
507
[متغیر تصادفی دوجملهای](https://en.wikipedia.org/wiki/Binomial_distribution) $Y \sim Bin(n, p)$ نشاندهنده تعداد موفقیتها در $n$ آزمایش دودویی است که هر آزمایش با احتمال $p$ موفق میشود.
504
508
505
-
بدون هیچ import به جز `from numpy.random import uniform`، تابعی به نام `binomial_rv` بنویسید به طوری که `binomial_rv(n, p)` یک نمونه از $Y$ تولید کند.
509
+
با استفاده از `rng = np.random.default_rng()`، تابعی به نام `binomial_rv` بنویسید به طوری که `binomial_rv(n, p)` یک نمونه از $Y$ تولید کند.
506
510
507
511
```{hint}
508
512
:class: dropdown
@@ -520,12 +524,12 @@ factorial(4)
520
524
یک راه حل این است:
521
525
522
526
```{code-cell} python3
523
-
from numpy.random import uniform
527
+
rng = np.random.default_rng()
524
528
525
529
def binomial_rv(n, p):
526
530
count = 0
527
531
for i in range(n):
528
-
U = uniform()
532
+
U = rng.uniform()
529
533
if U < p:
530
534
count = count + 1 # Or count += 1
531
535
return count
@@ -550,7 +554,7 @@ binomial_rv(10, 0.5)
550
554
551
555
- اگر شیر `k` بار یا بیشتر در این دنباله ظاهر شود، یک دلار پرداخت کنید.
552
556
553
-
از هیچ import به جز `from numpy.random import uniform`استفاده نکنید.
557
+
از `rng = np.random.default_rng()` برای تولید اعداد تصادفی استفاده کنید.
554
558
555
559
```{exercise-end}
556
560
```
@@ -562,15 +566,15 @@ binomial_rv(10, 0.5)
562
566
در اینجا تابعی برای دستگاه تصادفی اول آورده شده است:
563
567
564
568
```{code-cell} python3
565
-
from numpy.random import uniform
569
+
rng = np.random.default_rng()
566
570
567
571
def draw(k): # pays if k consecutive successes in a sequence
568
572
569
573
payoff = 0
570
574
count = 0
571
575
572
576
for i in range(10):
573
-
U = uniform()
577
+
U = rng.uniform()
574
578
count = count + 1 if U < 0.5 else 0
575
579
print(count) # print counts for clarity
576
580
if count == k:
@@ -590,7 +594,7 @@ def draw_new(k): # pays if k successes in a sequence
0 commit comments