### 展示通用和专用方法的例子: 计算立方根 ###### 通用方法1:等距检查,选择最接近解的值 ##from math import fabs ##def cbrt(x): ## sign = 1 # 能转换也表示 x 是合理的参数 ## x = float(x) ## if x < 0.0: ## x = -x ## sign = -1 ## test, root = 0.0, 0.0 ## while test**3 <= x: ## if fabs(test**3 - x) < fabs(root**3 - x): ## root = test ## test += 0.00001 ## return sign * root def test_cbrt(a, b, d): z = a while z < b: # 由于 a/b/d 可能是浮点数,不能用 for r = cbrt(z) if fabs(r**3 - z) <= 0.001: print("Find cube root of", z, ":", r) else: print("Cannot find cube root of", z, "|| r**3:", r**3) z += d print("") # 空一行 ##test_cbrt(0.0, 1.0, 0.1) ##test_cbrt(-1.0, 0.0, 0.2) ##test_cbrt(0.0, 20.0, 1.5) #### 通用方法2:二分法逼近 ##from math import fabs ##def cbrt(x): ## y = fabs(x) ## a, b = 0.0, y ## m = (a + b)/2 ## while fabs(m**3 - y) > 0.001: ## if m**3 > y: ## b = m ## else: ## a = m ## m = (b + a)/2 ## ## return -m if x < 0.0 else m #test_cbrt(0.0, 20.0, 1.5) #test_cbrt(0.0, 100.0, 5.0) # Add a counter #test_cbrt(0.0, 1000.0, 100.0) # test 0.3 ##def cbrt(x): ## y = fabs(x) ## if y >= 1: ## a = 1.0; b = y ## else: ## a = y; b = 1.0 ## m = (a + b)/2 ## while fabs(m**3 - y) > 0.001: ## if m**3 > y: ## b = m ## else: ## a = m ## m = (b + a)/2 ## ## return -m if x < 0.0 else m #### 专用方法,采用立方根逼近公式 ##from math import fabs ##def cbrt(x): ## if x == 0.0: ## return 0.0 ## x1 = x ## x2 = (2.0 * x1 + x / x1 / x1) / 3 ## while fabs((x2 - x1)/x1) >= 1E-6: ## x1 = x2 ## x2 = (2.0 * x1 + x / x1 / x1) / 3 ## return x2 #### 把概念清晰的操作抽象为函数 ##from math import fabs ## ##def improve(x, x1): ## return(2.0 * x1 + x / x1 / x1) / 3 ## ##def accept(x1, x2): ## return fabs((x2 - x1)/x1) < 1E-6 ## ##def cbrt(x): ## if x == 0.0: ## return 0.0 ## x1 = x ## x2 = improve(x, x1) ## while not accept(x1, x2): ## x1 = x2 ## x2 = improve(x, x1) ## return x2 #### 同一函数的另一个定义,代码略微简化,消除了重复描述 ##def cbrt(x): ## if x == 0.0: ## return 0.0 ## x1 = x ## while True: ## x2 = improve(x, x1) ## if accept(x1, x2): ## return x2 ## x1 = x2 #### 将局部使用的函数放入主要函数内部,减少全局定义 ##from math import fabs ##def cbrt(x) : ## def improve(x, x1) : ## return (2.0 * x1 + x / x1 / x1) / 3 ## def accept(x1, x2) : ## return fabs((x2 - x1)/x1) < 1E-6 ## ## if x == 0.0: ## return 0.0 ## x1 = x ## while True: ## x2 = improve(x, x1) ## if accept(x1, x2): ## return x2 ## x1 = x2 ###### 说明局部作用域问题的实例 ##x = 1 ##def f(): # y = x ## y = x ## x = 2 ## return x + y ## ##f() ###### 说明嵌套作用域的代码示例 #### 注意:实践中,应尽量避免(在嵌套作用域里)重新定义同名变量 ##x = 3 ##y = 5 ##def f1(x): ## def g(v): ## global y ## nonlocal z ## u = v + x ## z = u + 1 ## y = z * 4 ## ## g(x + 1) ## z = z + y ## return z + 1 ## ##def f2(x): ## z = x + y ## f1(z * x) ## return z + y ## ##w = f2(1)