@@ -100,7 +100,6 @@ type(22)
100100
101101Python 内置函数的完整列表在[ 这里] ( https://docs.python.org/3/library/functions.html ) 。
102102
103-
104103### 第三方函数
105104
106105如果内置函数不能满足我们的需求,我们要么需要导入函数,要么创建自己的函数。
@@ -280,7 +279,6 @@ quad(lambda x: x**3, 0, 2)
280279
281280这里由 ` lambda ` 创建的函数被称为* 匿名* 函数,因为它从未被赋予名称。
282281
283-
284282### 为什么要编写函数?
285283
286284用户自定义函数对于提高代码的清晰度非常重要,通过
@@ -294,16 +292,19 @@ quad(lambda x: x**3, 0, 2)
294292
295293## 应用
296294
295+
297296### 随机抽取
298297
299- 再次考虑{doc}` 前一讲 <python_by_example> ` 中的以下代码
298+ 再次考虑 {doc}` 前一讲 <python_by_example> ` 中的以下代码
300299
301300``` {code-cell} python3
301+ rng = np.random.default_rng()
302+
302303ts_length = 100
303304ϵ_values = [] # 空列表
304305
305306for i in range(ts_length):
306- e = np.random.randn ()
307+ e = rng.standard_normal ()
307308 ϵ_values.append(e)
308309
309310plt.plot(ϵ_values)
@@ -324,7 +325,7 @@ plt.show()
324325def generate_data(n):
325326 ϵ_values = []
326327 for i in range(n):
327- e = np.random.randn ()
328+ e = rng.standard_normal ()
328329 ϵ_values.append(e)
329330 return ϵ_values
330331
@@ -354,9 +355,9 @@ def generate_data(n, generator_type):
354355 ϵ_values = []
355356 for i in range(n):
356357 if generator_type == 'U':
357- e = np.random .uniform(0, 1)
358+ e = rng .uniform(0, 1)
358359 else:
359- e = np.random.randn ()
360+ e = rng.standard_normal ()
360361 ϵ_values.append(e)
361362 return ϵ_values
362363
@@ -376,7 +377,7 @@ plt.show()
376377
377378现在,有几种方法可以简化上面的代码。
378379
379- 例如,我们可以完全去掉条件判断,只需将所需的生成器类型 * 作为函数 * 传递 。
380+ 例如,我们可以完全去掉条件判断,只需将所需的生成器类型作为函数、方法或其他 [ 可调用 ] ( https://typing.python.org/en/latest/spec/callables.html ) 对象传递 。
380381
381382要理解这一点,请考虑以下版本。
382383
@@ -389,18 +390,18 @@ def generate_data(n, generator_type):
389390 ϵ_values.append(e)
390391 return ϵ_values
391392
392- data = generate_data(100, np.random .uniform)
393+ data = generate_data(100, rng .uniform)
393394plt.plot(data)
394395plt.show()
395396```
396397
397- 现在,当我们调用函数 ` generate_data() ` 时,我们将 ` np.random .uniform` 作为第二个参数传递。
398+ 现在,当我们调用函数 ` generate_data() ` 时,我们将 ` rng .uniform` 作为第二个参数传递。
398399
399- 这个对象是一个* 函数 * 。
400+ 这个对象是一个* 可调用对象 * ——即可以使用括号调用的对象 。
400401
401- 当函数调用 ` generate_data(100, np.random. uniform) ` 被执行时,Python 以 ` n ` 等于 100 和名称 ` generator_type ` "绑定"到函数 ` np.random .uniform` 来运行函数代码块。
402+ 当函数调用 ` generate_data(100, rng. uniform) ` 被执行时,Python 以 ` n ` 等于 100 和名称 ` generator_type ` "绑定"到可调用对象 ` rng .uniform` 来运行函数代码块。
402403
403- * 在这些行被执行时,名称 ` generator_type ` 和 ` np.random .uniform` 是"同义词",可以以相同的方式使用。
404+ * 在这些行被执行时,名称 ` generator_type ` 和 ` rng .uniform` 是"同义词",可以以相同的方式使用。
404405
405406这个原则更普遍地适用——例如,考虑以下代码
406407
@@ -415,7 +416,7 @@ m(7, 2, 4)
415416
416417这里我们为内置函数 ` max() ` 创建了另一个名称,然后可以以相同的方式使用它。
417418
418- 在我们程序的背景下,将新名称绑定到函数的能力意味着 * 将函数作为参数传递给另一个函数 * 没有任何问题——正如我们上面所做的那样 。
419+ 在我们程序的背景下,将名称绑定到函数或更一般地绑定到可调用对象的能力,意味着将一个可调用对象作为参数传递给另一个可调用对象没有任何问题——正如我们上面使用 ` rng.uniform ` 所做的那样 。
419420
420421
421422(recursive_functions)=
@@ -518,7 +519,7 @@ factorial(4)
518519
519520[ 二项随机变量] ( https://en.wikipedia.org/wiki/Binomial_distribution ) $Y \sim Bin(n, p)$ 表示 $n$ 次二元试验中的成功次数,其中每次试验以概率 $p$ 成功。
520521
521- 除了 ` from numpy .random import uniform ` 之外不使用任何其他导入 ,编写一个函数
522+ 使用 ` rng = np .random.default_rng() ` ,编写一个函数
522523` binomial_rv ` ,使得 ` binomial_rv(n, p) ` 生成 $Y$ 的一次抽取。
523524
524525``` {hint}
@@ -538,12 +539,12 @@ factorial(4)
538539这是一种解法:
539540
540541``` {code-cell} python3
541- from numpy .random import uniform
542+ rng = np .random.default_rng()
542543
543544def binomial_rv(n, p):
544545 count = 0
545546 for i in range(n):
546- U = uniform()
547+ U = rng. uniform()
547548 if U < p:
548549 count = count + 1 # 或者 count += 1
549550 return count
@@ -569,7 +570,7 @@ binomial_rv(10, 0.5)
569570
570571- 如果在此序列中正面出现 ` k ` 次或更多次,支付一美元。
571572
572- 除了 ` from numpy .random import uniform ` 之外不使用任何其他导入 。
573+ 使用 ` rng = np .random.default_rng() ` 来生成随机数 。
573574
574575``` {exercise-end}
575576```
@@ -584,15 +585,15 @@ binomial_rv(10, 0.5)
584585
585586
586587``` {code-cell} python3
587- from numpy .random import uniform
588+ rng = np .random.default_rng()
588589
589590def draw(k): # 如果序列中连续成功 k 次则支付
590591
591592 payoff = 0
592593 count = 0
593594
594595 for i in range(10):
595- U = uniform()
596+ U = rng. uniform()
596597 count = count + 1 if U < 0.5 else 0
597598 print(count) # 打印计数以便清楚
598599 if count == k:
@@ -612,7 +613,7 @@ def draw_new(k): # 如果序列中成功 k 次则支付
612613 count = 0
613614
614615 for i in range(10):
615- U = uniform()
616+ U = rng. uniform()
616617 count = count + ( 1 if U < 0.5 else 0 )
617618 print(count)
618619 if count == k:
@@ -626,7 +627,6 @@ draw_new(3)
626627``` {solution-end}
627628```
628629
629-
630630## 进阶练习
631631
632632在以下练习中,我们将一起编写递归函数。
@@ -706,4 +706,4 @@ print([recursion_factorial(i) for i in range(1, 10)])
706706```
707707
708708``` {solution-end}
709- ```
709+ ```
0 commit comments