You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现无星号的数学公式元素相乘?

解决Python物理计算程序识别无星号乘法的问题

问题分析

程序报错是因为Python将ue识别为一个未定义的变量名,而非u * e的缩写。要让程序支持无星号乘法,需先对输入的公式字符串进行预处理,在变量名(或变量与数字)之间自动插入乘号。

解决方案

核心思路:收集所有已定义的物理常量变量名,通过正则表达式对输入公式进行替换,在需要的位置插入*后,再交给eval执行计算。

完整代码实现

import re

# 定义物理常量(根据需求补充更多常量)
u = 1.66054 * 10**(-27)
e = 1.602176634 * 10**(-19)  # 补充你用到的电子电荷常量
pi = 3.141592653589793238462643383279502884197169
c2 = 299792458**2

# 收集所有常量的变量名到集合中
constants = {'u', 'e', 'pi', 'c2'}

def preprocess_formula(formula, constants):
    # 优先处理长变量名,避免短变量拆分长变量(比如pi不会被拆成p和i)
    sorted_constants = sorted(constants, key=lambda x: -len(x))
    
    # 用占位符暂代常量名,防止正则匹配出错
    placeholder_map = {}
    for idx, const in enumerate(sorted_constants):
        placeholder = f'__CONST_{idx}__'
        placeholder_map[placeholder] = const
        formula = formula.replace(const, placeholder)
    
    # 处理常量间的无星号乘法:比如 "__CONST_0____CONST_1__" → "__CONST_0__*__CONST_1__"
    formula = re.sub(r'(__CONST_\d+__)(__CONST_\d+__)', r'\1*\2', formula)
    
    # 处理数字与常量间的无星号乘法:比如 "2__CONST_0__" → "2*__CONST_0__","__CONST_0__2" → "__CONST_0__*2"
    formula = re.sub(r'(\d)(__CONST_\d+__)', r'\1*\2', formula)
    formula = re.sub(r'(__CONST_\d+__)(\d)', r'\1*\2', formula)
    
    # 将占位符还原为原常量名
    for placeholder, const in placeholder_map.items():
        formula = formula.replace(placeholder, const)
    
    return formula

# 主程序逻辑
formula = input("Input formula: ")
processed_formula = preprocess_formula(formula, constants)
answer = eval(processed_formula)
print(answer)

代码说明

  1. 常量集合与排序:将物理常量名存入集合,按长度从长到短排序,确保长变量名不会被拆分为单个字母处理。
  2. 占位符替换:用占位符暂代常量名,避免正则匹配时误拆分变量结构。
  3. 正则插入乘号:通过正则匹配三种需要插入乘号的场景:
    • 两个常量名相邻
    • 数字紧跟常量名
    • 常量名紧跟数字
  4. 还原变量名:将占位符替换回原常量名,再传入eval执行计算。

测试效果

输入ue时,程序会自动转换为u*e,执行后得到期望的2.6604783878223602e-46。

内容的提问来源于stack exchange,提问作者Zapasowe Konto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:17:03