当前位置:   article > 正文

Python-VBA函数之旅-pow函数

Python-VBA函数之旅-pow函数

目录

一、pow函数的常见应用场景

二、pow函数使用注意事项

三、如何用好pow函数?

1、pow函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:神奇夜光杯-CSDN博客 

一、pow函数的常见应用场景

        Python中的pow()函数在多种实际应用场景中都非常有用,特别是在需要执行幂运算的情况下,其常见的应用场景有:

1、科学计算:在科学计算中,经常需要进行幂运算,pow()函数能够方便地计算一个数的任意次幂。

2、工程和数学领域:在工程和数学领域,pow()函数同样被广泛使用,例如在物理学、化学、生物学等学科的数学模型中,经常需要进行幂运算。

3、密码学:在密码学中,pow()函数的模幂运算(当提供modulus参数时)被广泛用于加密和解密算法中,如RSA加密算法。

4、图像处理和计算机图形学:在图像处理和计算机图形学中,幂运算可以用于调整图像的亮度和对比度。例如,通过将像素值进行幂运算,可以增强或减弱图像的明暗效果。

5、机器学习:在机器学习和数据科学中,pow()函数可以用于各种数学运算和模型计算中。例如,在回归模型中,可能需要计算特征的幂次来捕获数据中的非线性关系。

6、物理模拟和动画:在物理模拟和动画中,幂运算可以用于模拟各种物理现象,如弹性碰撞、阻尼运动等,通过调整幂次,可以精确地控制模拟结果。

7、金融和经济学:在金融和经济学中,幂运算被用于计算复利、计算投资回报率等,pow()函数可以方便地执行这些计算,帮助投资者和分析师更好地理解市场动态和投资决策。

8、数据分析:在数据分析中,幂运算可以用于对数据进行缩放或转换,以便更好地进行可视化或建模。例如,可以使用pow()函数将数据转换为对数尺度,以便在图表中更清晰地显示数据的分布和趋势。

9、编程优化:在编程时,使用pow()函数可以简化代码并提高计算精度,与手动编写幂运算的循环或递归相比,使用内置函数通常更快、更可靠且更易于维护。

        总之,pow()函数在Python编程中具有广泛的应用场景,无论是用于科学计算、工程和数学领域、密码学、图像处理和计算机图形学、机器学习还是其他领域,它都是一个非常有用的工具。

 

二、pow函数使用注意事项

        在Python中使用pow()函数时,需注意以下事项:

1、参数类型:pow()函数可以接受整数、浮点数或复数作为参数,但是,当使用浮点数或复数时,结果的精度可能会受到限制,尤其是在涉及非常大的数值或复杂的计算时。

2、整数溢出:当使用非常大的整数作为base或exponent时,可能会遇到整数溢出的问题;Python的整数类型通常是无限的(在大多数现代Python实现中),但如果你在使用其他编程语言或工具(如C语言的某些版本)时调用Python的pow()函数,并且这些工具对整数大小有限制,那么可能会遇到溢出问题。

3、浮点数精度:当使用浮点数作为base或exponent时,结果的精度可能会受到影响;浮点数在计算机中的表示是近似的,因此计算结果可能不是完全精确的,在进行需要高精度的计算时,可能需要使用专门的数学库或工具。

4、性能考虑:虽然pow()函数在大多数情况下都很快,但在进行大量的幂运算或涉及非常大的数值时,性能可能会成为一个问题;如果你发现pow()函数的性能不足以满足你的需求,可能需要考虑使用其他方法或工具来优化你的代码。

5、模幂运算:当使用modulus参数进行模幂运算时,需要确保modulus不是零,因为除以零是未定义的;此外,如果modulus是负数,那么结果将取决于你的Python实现和版本,因为不同的实现可能对负数模数有不同的处理方式。

6、整数除法:在Python 3中,整数除法默认是精确的(即返回浮点数),但在某些情况下,你可能希望进行整数除法并丢弃小数部分;如果你使用pow()函数进行整数除法并期望得到整数结果,需要确保base、exponent和modulus(如果有)都是整数,并且使用`//`运算符来获取整数结果。

7、避免不必要的计算:在使用pow()函数之前,确保你的计算是必要的;有时候,你可以通过其他方式避免进行昂贵的幂运算,例如通过查找表、近似算法或数学公式来优化你的代码。

8、错误处理:当使用pow()函数时,始终考虑可能出现的错误情况,并编写适当的错误处理代码来捕获和处理这些错误。例如,如果modulus参数是负数,或者如果函数返回了意外的结果,你的代码应该能够优雅地处理这些情况。

三、如何用好pow函数?

        在Python中,pow()函数是一个内置函数,用于计算一个数的幂。你可以直接使用它而无需导入额外的模块,因为它与math.pow()函数功能相同但更加方便。以下是使用Python中pow()函数的一些建议:

1、基本用法:result = pow(base, exponent),其中base是底数,exponent是指数。

2、处理浮点数:pow()函数可以用于浮点数。

3、处理负数指数:当指数为负数时,pow()函数会计算底数的倒数的绝对值的幂,并返回结果的倒数。

4、处理模幂运算:pow()函数还可以接受一个可选的第三个参数,用于模幂运算(也称为模方),这在密码学和一些数学运算中特别有用。

5、避免不必要的调用:如果你多次使用相同的底数和指数计算幂,那么最好将结果存储在一个变量中,以避免重复计算。

6、性能考虑:虽然pow()函数在大多数情况下都很快,但如果你在处理大量数据或需要极致性能的场景中,仍然应该考虑优化;对于整数幂运算,使用内置的`**`运算符可能更为高效,因为Python内部可能为此进行了优化。

7、类型检查:虽然Python是动态类型的,但如果你在处理不确定类型的输入时,最好进行类型检查以确保它们都是数值类型,因为非数值类型的输入会导致TypeError错误。

8、文档和测试:始终参考Python官方文档以获取关于pow()函数的最新信息和细节;同时,编写单元测试以确保你的代码在预期范围内正确工作是很重要的。

9、代码清晰性:确保你的代码易于阅读和理解,当使用pow()函数时,最好为变量选择有意义的名称,并在需要时添加注释。

10、错误处理:虽然pow()函数通常不会引发异常(除了当底数为负数且指数为非整数且没有提供模数时),但在处理用户输入或不确定的数据时,最好添加适当的错误处理逻辑来捕获和处理任何潜在的异常。

1、pow函数
1-1、Python:
  1. # 1.函数:pow
  2. # 2.功能:用于计算一个数的幂次
  3. # 3.语法:pow(base, exponent, [modulus=None])
  4. # 4.参数:
  5. # 4-1、base:必须参数,表示基数,即要计算幂次的那个数
  6. # 4-2、exponent:必须参数,表示指数,即基数要乘以自身的次数
  7. # 4-3、modulus:可选参数,默认为None,表示模数,如果提供了这个参数,则函数会返回(base ** exponent) % modulus的结果
  8. # 5.返回值:
  9. # 5-1、无modulus参数:返回base的exponent次幂
  10. # 5-2、有modulus参数:返回base的exponent次幂对modulus取余
  11. # 6.说明:
  12. # 6-1、如果参数base和exponent有一个是浮点数,则结果转换成浮点数
  13. # 6-2、如果参数base和exponent都是正整数,则结果也是正整数
  14. # 6-3、如果参数exponent为负整数,则结果返回浮点数(浮点数不能取模,此时可选参数modulus不能传入值)
  15. # 6-4、如果pow()函数中设置了可选参数modulus的值,则参数base和exponent必须为整数,且exponent不能为负整数
  16. # 6-5、pow()函数所有参数必须是数值类型
  17. # 7.示例:
  18. # 用dir()函数获取该函数内置的属性和方法
  19. print(dir(pow))
  20. # ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
  21. # '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__',
  22. # '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__',
  23. # '__str__', '__subclasshook__', '__text_signature__']
  24. # 用help()函数获取该函数的文档信息
  25. help(pow)
  26. # 应用一:科学计算
  27. # 示例1:计算整数幂
  28. # 计算2的10次方
  29. result = pow(2, 10)
  30. print(f"2的10次方是 {result}")
  31. # 计算3的5次方
  32. result = pow(3, 5)
  33. print(f"3的5次方是 {result}")
  34. # 2的10次方是 1024
  35. # 3的5次方是 243
  36. # 示例2:计算浮点数幂
  37. # 计算2.71828的3次方(e的3次方)
  38. result = pow(2.71828, 3)
  39. print(f"e的3次方近似为 {result}")
  40. # 计算1.5的平方根(即1.5的0.5次方)
  41. result = pow(1.5, 0.5)
  42. print(f"1.5的平方根是 {result}")
  43. # e的3次方近似为 20.085496391455553
  44. # 1.5的平方根是 1.224744871391589
  45. # 示例3:模幂运算(加密中使用)
  46. # 在模数 23 下,计算 5 的 10 次方
  47. result = pow(5, 10, 23)
  48. print(f"在模 23 下,5 的 10 次方是 {result}")
  49. # RSA 加密算法中的一个简化示例
  50. p = 61 # 质数 p
  51. q = 53 # 质数 q
  52. n = p * q # 模数 n
  53. phi = (p - 1) * (q - 1) # 欧拉函数 φ(n)
  54. e = 17 # 公钥指数 e,与 φ(n) 互质
  55. # 计算私钥指数 d,满足 e*d mod φ(n) = 1
  56. d = pow(e, -1, phi) # 使用扩展欧几里得算法或模逆元算法计算
  57. # 打印公钥和私钥
  58. print(f"公钥 (e, n): ({e}, {n})")
  59. print(f"私钥 (d, n): ({d}, {n})")
  60. # 在模 23 下,5 的 10 次方是 9
  61. # 公钥 (e, n): (17, 3233)
  62. # 私钥 (d, n): (2753, 3233)
  63. # 示例4:比较pow()和**运算符
  64. # 使用pow()函数和**运算符计算3的4次方
  65. result_pow = pow(3, 4)
  66. result_exp = 3 ** 4
  67. print(f"使用pow(): {result_pow}")
  68. print(f"使用**运算符: {result_exp}")
  69. # 性能上,两者通常没有显著差异,但在某些极端情况下,** 运算符可能更优化
  70. # 使用pow(): 81
  71. # 使用**运算符: 81
  72. # 应用二:工程和数学领域
  73. # 示例1:物理学中的能量计算
  74. # 假设一个物体的质量为 2 kg,速度为 3 m/s
  75. mass = 2 # kg
  76. velocity = 3 # m/s
  77. # 动能公式:E_k = 1/2 * m * v^2
  78. kinetic_energy = 0.5 * mass * pow(velocity, 2)
  79. print(f"物体的动能为:{kinetic_energy} 焦耳")
  80. # 物体的动能为:9.0 焦耳
  81. # 示例2:数学中的幂律关系
  82. # 假设有两个变量 x 和 y,它们之间存在关系 y = x^2
  83. x = 4
  84. n = 2
  85. # 使用 pow() 函数计算 y
  86. y = pow(x, n)
  87. print(f"当 x = {x} 且 n = {n} 时,y = {y}")
  88. # 当 x = 4 且 n = 2 时,y = 16
  89. # 示例3:数值方法中的迭代算法
  90. def sqrt_newton_method(x, epsilon=1e-10, max_iter=100):
  91. guess = x / 2.0
  92. for _ in range(max_iter):
  93. if abs(guess * guess - x) < epsilon:
  94. return guess
  95. guess = (guess + x / guess) / 2.0
  96. print("迭代次数超过最大限制,可能无法收敛到精确值")
  97. return guess
  98. # 计算 2 的平方根
  99. root = sqrt_newton_method(2)
  100. print(f"2 的平方根近似值为:{root}")
  101. # 这里的pow()函数虽然没有直接用到,但它是我们验证结果的一个工具
  102. print(f"验证:{pow(root, 2)} 接近于 2")
  103. # 2 的平方根近似值为:1.4142135623746899
  104. # 验证:2.0000000000045106 接近于 2
  105. # 示例4:统计学中的指数分布(使用了math库做为替代方案)
  106. import math
  107. # 假设 λ = 0.5
  108. lambda_param = 0.5
  109. # 计算在 x = 2 处的概率密度
  110. x = 2
  111. pdf_value = lambda_param * math.exp(-lambda_param * x)
  112. print(f"当 λ = {lambda_param} 且 x = {x} 时,指数分布的概率密度函数值为:{pdf_value}")
  113. # 当 λ = 0.5 且 x = 2 时,指数分布的概率密度函数值为:0.18393972058572117
  114. # 应用三:密码学
  115. def generate_keypair(p, q):
  116. # 生成 RSA 密钥对
  117. n = p * q # 模数 n
  118. phi = (p - 1) * (q - 1) # 欧拉函数 φ(n)
  119. # 选择公钥 e,使得 e 与 φ(n) 互质,并且 e < φ(n)
  120. e = 65537 # 常见的公钥 e 值
  121. # 使用扩展欧几里得算法计算私钥 d,使得 e*d mod φ(n) = 1
  122. d = pow(e, -1, phi) # 这里使用了 pow() 函数的模幂运算功能
  123. return ((e, n), (d, n)) # 返回公钥和私钥
  124. def encrypt(pk, plaintext):
  125. # 使用公钥加密
  126. key, n = pk
  127. ciphertext = [pow(ord(char), key, n) for char in plaintext]
  128. return ciphertext
  129. def decrypt(pk, ciphertext):
  130. # 使用私钥解密
  131. key, n = pk
  132. plaintext = [chr(pow(char, key, n)) for char in ciphertext]
  133. return ''.join(plaintext)
  134. # 示例
  135. # 选择两个不同的质数 p 和 q
  136. p = 61
  137. q = 53
  138. # 生成密钥对
  139. public_key, private_key = generate_keypair(p, q)
  140. print("公钥:", public_key)
  141. print("私钥:", private_key)
  142. # 要加密的消息
  143. message = "Hello, RSA!"
  144. # 加密消息
  145. encrypted = encrypt(public_key, message)
  146. print("加密后的消息:", encrypted)
  147. # 解密消息
  148. decrypted = decrypt(private_key, encrypted)
  149. print("解密后的消息:", decrypted)
  150. # 公钥: (65537, 3233)
  151. # 私钥: (2753, 3233)
  152. # 加密后的消息: [3000, 1313, 745, 745, 2185, 678, 1992, 1859, 2680, 2790, 1853]
  153. # 解密后的消息: Hello, RSA!
  154. # 应用四:图像处理和计算机图形学
  155. import numpy as np
  156. from PIL import Image
  157. def adjust_brightness_contrast(image_path, brightness=1.0, contrast=1.0):
  158. # 加载图像为灰度图
  159. image = Image.open(image_path).convert('L')
  160. image_np = np.array(image)
  161. # 调整亮度:添加亮度偏移量
  162. # 注意:这里我们假设亮度调整是线性的,通过添加一个常数来实现
  163. # 在实际应用中,亮度调整可能更复杂
  164. adjusted_image = np.clip(image_np * brightness, 0, 255).astype(np.uint8)
  165. # 调整对比度:使用pow()函数进行非线性变换
  166. # 这里我们假设对比度调整是通过对像素值应用幂函数来实现的
  167. # alpha参数控制对比度的强度,你可以根据需要调整它
  168. alpha = contrast
  169. gamma_corrected = np.clip(np.power(adjusted_image / 255.0, alpha) * 255.0, 0, 255).astype(np.uint8)
  170. # 将调整后的图像转换回PIL图像对象
  171. result_image = Image.fromarray(gamma_corrected)
  172. # 显示图像或保存图像(取消注释以保存图像)
  173. # result_image.save('adjusted_image.png')
  174. result_image.show()
  175. # 使用示例
  176. adjust_brightness_contrast('input.jpg', brightness=1.2, contrast=1.5)
  177. # 应用五:机器学习
  178. # 示例1:数据预处理-特征转换
  179. import numpy as np
  180. # 假设我们有一个特征数组
  181. X = np.array([1, 2, 3, 4, 5])
  182. # 我们想将这个特征转换为它的平方
  183. X_squared = np.power(X, 2)
  184. print(X_squared)
  185. # 现在,你可以将 X_squared 作为新特征添加到你的数据集中
  186. # [ 1 4 9 16 25]
  187. # 示例2:特征工程-多项式特征
  188. import numpy as np
  189. from sklearn.preprocessing import PolynomialFeatures
  190. # 假设我们有两个特征
  191. X = np.array([[1, 2], [3, 4], [5, 6]])
  192. # 我们想添加这些特征的平方和乘积作为新的特征
  193. poly = PolynomialFeatures(degree=2, include_bias=False)
  194. X_poly = poly.fit_transform(X)
  195. # 但如果你想手动做这件事(只是为了说明)
  196. X_manual_poly = np.column_stack((
  197. X[:, 0],
  198. X[:, 1],
  199. np.power(X[:, 0], 2),
  200. np.power(X[:, 1], 2),
  201. X[:, 0] * X[:, 1]
  202. ))
  203. print(X_poly) # 这将输出与 X_manual_poly 类似的结果
  204. # 示例3:评估模型-计算均方误差(MSE)的平方根
  205. from sklearn.metrics import mean_squared_error
  206. import math
  207. import numpy as np
  208. # 假设 y_true 是真实值,y_pred 是模型预测值
  209. y_true = np.array([3, -0.5, 2, 7])
  210. y_pred = np.array([2.5, 0.0, 2, 8])
  211. # 计算 MSE
  212. mse = mean_squared_error(y_true, y_pred)
  213. # 使用pow()计算RMSE(尽管在实践中,我们会直接使用 np.sqrt())
  214. rmse = math.pow(mse, 0.5)
  215. print(rmse) # 输出RMSE的值
  216. # 示例4:正则化项-L2正则化(权重衰减)
  217. import numpy as np
  218. # 假设w是模型的权重向量
  219. w = np.array([0.5, -0.2, 0.3])
  220. # 计算L2正则化项(注意:在实际应用中,你会乘以一个正则化系数)
  221. l2_reg = np.sum(np.power(w, 2))
  222. print(l2_reg) # 输出权重的平方和
  223. # 0.38
  224. # 应用六:物理模拟和动画
  225. import matplotlib.pyplot as plt
  226. import numpy as np
  227. # 初始化参数
  228. g = 9.81 # 重力加速度
  229. m = 1.0 # 物体质量
  230. v0 = 0.0 # 初始速度
  231. y0 = 10.0 # 初始高度
  232. damping_exponent = 0.5 # 阻尼的非线性指数
  233. time_step = 0.1 # 时间步长
  234. total_time = 5.0 # 总模拟时间
  235. # 初始化数组来存储时间和位置
  236. times = np.arange(0, total_time, time_step)
  237. positions = np.zeros_like(times)
  238. velocities = np.zeros_like(times)
  239. # 模拟下落过程
  240. positions[0] = y0
  241. for i in range(len(times) - 1):
  242. # 使用牛顿第二定律 F = ma 来计算加速度
  243. # 在这里,我们假设阻尼力与速度的非线性幂次成正比
  244. acceleration = -g - np.sign(velocities[i]) * np.abs(velocities[i]) ** damping_exponent
  245. # 更新速度和位置
  246. velocities[i + 1] = velocities[i] + acceleration * time_step
  247. positions[i + 1] = positions[i] + velocities[i + 1] * time_step
  248. # 绘制结果
  249. plt.figure(figsize=(10, 6))
  250. plt.plot(times, positions, label='Position')
  251. plt.plot(times, velocities, label='Velocity')
  252. plt.xlabel('Time (s)')
  253. plt.ylabel('Value')
  254. plt.legend()
  255. plt.title('Non-linear Damping Simulation')
  256. plt.grid(True)
  257. plt.show()
  258. # 应用七:金融和经济学
  259. # 示例1:计算复利
  260. def compound_interest(principal, rate, time, periods_per_year):
  261. # 假设rate是年利率(小数形式),time 是年数,periods_per_year 是一年中的计息次数(如12表示月复利)
  262. # 计算每个计息周期的利率
  263. period_rate = rate / periods_per_year
  264. # 使用pow()函数计算复利后的总金额
  265. future_value = principal * pow(1 + period_rate, periods_per_year * time)
  266. return future_value
  267. # 示例:本金1000元,年利率5%,投资5年,按年复利计算
  268. principal = 1000
  269. annual_rate = 0.05
  270. time_years = 5
  271. periods_per_year = 1 # 年复利
  272. future_value = compound_interest(principal, annual_rate, time_years, periods_per_year)
  273. print(f"After {time_years} years, the future value is: {future_value:.2f}")
  274. # After 5 years, the future value is: 1276.28
  275. # 示例2:计算股票投资的指数增长
  276. def stock_price_after_years(initial_price, growth_rate, years):
  277. # 假设 growth_rate 是年增长率(小数形式)
  278. final_price = initial_price * pow(1 + growth_rate, years)
  279. return final_price
  280. # 示例:初始价格100元,年增长率10%,5年后的价格
  281. initial_price = 100
  282. growth_rate = 0.10
  283. years = 5
  284. final_price = stock_price_after_years(initial_price, growth_rate, years)
  285. print(f"After {years} years, the stock price is expected to be: {final_price:.2f}")
  286. # After 5 years, the stock price is expected to be: 161.05
  287. # 示例3:计算折旧
  288. def straight_line_depreciation(cost, salvage_value, useful_life):
  289. """
  290. 计算直线折旧法下的年折旧额
  291. :param cost: 资产原值
  292. :param salvage_value: 残值
  293. :param useful_life: 使用年限
  294. :return: 年折旧额
  295. """
  296. depreciable_cost = cost - salvage_value
  297. annual_depreciation = depreciable_cost / useful_life
  298. return annual_depreciation
  299. # 示例
  300. cost = 100000 # 资产原值 100,000 元
  301. salvage_value = 10000 # 残值 10,000 元
  302. useful_life = 5 # 使用年限 5 年
  303. annual_depreciation = straight_line_depreciation(cost, salvage_value, useful_life)
  304. print(f"年折旧额是: {annual_depreciation} 元")
  305. # 年折旧额是: 18000.0 元
  306. # 示例4:指数增长
  307. def exponential_growth(base, growth_rate, time):
  308. """
  309. 计算指数增长
  310. :param base: 基期值
  311. :param growth_rate: 增长率(小数形式)
  312. :param time: 时间(年)
  313. :return: 最终值
  314. """
  315. return base * pow(1 + growth_rate, time)
  316. # 示例
  317. base = 100 # 基期值
  318. growth_rate = 0.03 # 增长率 3%
  319. time = 10 # 时间 10 年
  320. final_value = exponential_growth(base, growth_rate, time)
  321. print(f"最终值: {final_value:.2f}")
  322. # 最终值: 134.39
  323. # 应用八:数据分析
  324. # 示例1:指数衰减函数
  325. import numpy as np
  326. import matplotlib.pyplot as plt
  327. def exponential_decay(time, initial_value, decay_rate):
  328. """
  329. 计算指数衰减
  330. :param time: 时间数组
  331. :param initial_value: 初始值
  332. :param decay_rate: 衰减率(通常是一个小于1的正数)
  333. :return: 衰减后的值数组
  334. """
  335. return initial_value * np.power(decay_rate, time)
  336. # 示例
  337. time = np.arange(0, 10, 0.1) # 从0到10,步长为0.1
  338. initial_value = 100 # 初始值
  339. decay_rate = 0.95 # 衰减率
  340. decayed_values = exponential_decay(time, initial_value, decay_rate)
  341. # 绘制结果
  342. plt.plot(time, decayed_values)
  343. plt.title('Exponential Decay')
  344. plt.xlabel('Time')
  345. plt.ylabel('Value')
  346. plt.show()
  347. # 示例2:加权指数移动平均线(WEMA)
  348. import pandas as pd
  349. import matplotlib.pyplot as plt
  350. import numpy as np
  351. def weighted_exponential_moving_average(data, alpha):
  352. """
  353. 计算加权指数移动平均线
  354. :param data: 数据数组
  355. :param alpha: 平滑因子(0 < alpha <= 1)
  356. :return: 加权指数移动平均线数组
  357. """
  358. n = len(data)
  359. wema = np.zeros_like(data)
  360. wema[0] = data[0] # 第一个值就是数据本身
  361. for i in range(1, n):
  362. wema[i] = (data[i] * alpha) + (wema[i - 1] * (1 - alpha))
  363. return wema
  364. # 示例(假设我们有一个股票价格数组)
  365. # 假设data是一个包含股票价格的pandas Series
  366. data = pd.Series([100, 102, 103, 101, 104, 105, 107, 106, 108, 110])
  367. alpha = 0.1 # 平滑因子
  368. wema_values = weighted_exponential_moving_average(data, alpha)
  369. # 绘制结果
  370. plt.plot(data, label='Price')
  371. plt.plot(wema_values, label='WEMA')
  372. plt.title('Weighted Exponential Moving Average')
  373. plt.xlabel('Day')
  374. plt.ylabel('Price')
  375. plt.legend()
  376. plt.show()
  377. # 应用九:编程优化
  378. # 示例1:快速幂算法
  379. def fast_power(base, exponent, mod=None):
  380. """
  381. 快速幂算法
  382. :param base: 底数
  383. :param exponent: 指数
  384. :param mod: 如果需要取模,则提供模数
  385. :return: base 的 exponent 次幂(如果需要取模,则返回取模后的结果)
  386. """
  387. result = 1
  388. base = base % mod if mod else base
  389. while exponent > 0:
  390. # 如果指数为奇数,则乘以底数
  391. if exponent % 2 == 1:
  392. result = (result * base) % mod if mod else result * base
  393. # 底数平方
  394. base = (base * base) % mod if mod else base * base
  395. # 指数减半
  396. exponent //= 2
  397. return result
  398. # 示例
  399. base = 2
  400. exponent = 10
  401. print(f"{base}{exponent} 次幂是 {fast_power(base, exponent)}")
  402. # 带有取模的快速幂
  403. base = 2
  404. exponent = 100000000
  405. mod = 1000000007
  406. print(f"{base}{exponent} 次幂模 {mod} 的结果是 {fast_power(base, exponent, mod)}")
  407. # 2 的 10 次幂是 1024
  408. # 2 的 100000000 次幂模 1000000007 的结果是 494499948
  409. # 示例2:优化循环中的幂运算
  410. # 假设我们有一个列表,并且我们想要计算列表中每个元素的平方
  411. numbers = [1, 2, 3, 4, 5]
  412. # 不优化的方法:在循环中计算平方
  413. squares_slow = []
  414. for num in numbers:
  415. squares_slow.append(num ** 2)
  416. # 优化的方法:使用列表推导式和内置的pow()函数(尽管在这个简单例子中,** 更快)
  417. squares_fast = [num ** 2 for num in numbers]
  418. # 或者,如果你确实想使用pow()函数
  419. squares_fast_pow = [pow(num, 2) for num in numbers]
  420. print("不优化的方法结果:", squares_slow)
  421. print("优化的方法结果:", squares_fast)
  422. print("使用pow()函数优化的方法结果:", squares_fast_pow)
  423. # 不优化的方法结果: [1, 4, 9, 16, 25]
  424. # 优化的方法结果: [1, 4, 9, 16, 25]
  425. # 使用pow()函数优化的方法结果: [1, 4, 9, 16, 25]
1-2、VBA
略,待后补。
2、推荐阅读:

2-1、Python-VBA函数之旅-open()函数

Python算法之旅:Algorithm

Python函数之旅:Functions

个人主页:神奇夜光杯-CSDN博客 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/625229
推荐阅读
相关标签
  

闽ICP备14008679号