Python中如何实现变量匹配和赋值?

现某字符串有一个四则运算:
假设如下:
nnn = ‘(40+2655)-1102-11’

要为每个数字设置变量,即:
a = 40
b = 26
c = 55
d = 1102
f = 11
要为每个运算符设置变量,即:
a1 = (
a2 = +
a3 = *
a4 = )- #运算符在一起的时候为 1 个变量
a5 = -

还有就是,nnn 有可能是这样的
nnn = '40+26
55-1102-11’

这时第一个字符不是运算符的时候 a1 必须要为空

请教该怎么搞啊??弄了半天 if 头都大了
Python中如何实现变量匹配和赋值?


8 回复

用正则表达式先把所有的数字搞出来
再用正则表达式把所有的非数字搞出来


在Python里,变量匹配和赋值最直接的就是用等号 =。不过如果你指的是像解包(unpacking)或者模式匹配(pattern matching)这种更高级的“匹配”,那方法就多了。

1. 基础赋值和多变量赋值

# 单个赋值
x = 10

# 多变量同时赋值
a, b, c = 1, 2, 3
print(a, b, c)  # 输出: 1 2 3

# 交换变量,经典用法
a, b = b, a
print(a, b)  # 输出: 3 2

2. 可迭代对象解包 (Unpacking) 这是最常用的“匹配”方式,把序列里的元素按位置分给变量。

# 列表/元组解包
data = [‘Alice‘, 30, ‘Engineer‘]
name, age, job = data
print(name, age, job)  # Alice 30 Engineer

# 用星号(*)收集多余元素
first, *middle, last = [1, 2, 3, 4, 5]
print(first, middle, last)  # 1 [2, 3, 4] 5

# 字典解包(解包的是键)
d = {‘x‘: 1, ‘y‘: 2}
key1, key2 = d
print(key1, key2)  # x y

3. 字典解包到变量(Python 3.8+):= 海象运算符可以在表达式里赋值,但更常见的字典“匹配”是这样:

# 如果你有一个字典想直接转成变量
data_dict = {‘name‘: ‘Bob‘, ‘age‘: 25}
name = data_dict[‘name‘]
age = data_dict[‘age‘]

# 或者用简单的一行(但要注意键名必须存在且是有效变量名)
locals().update(data_dict)  # 通常不推荐,作用域可能乱

4. 结构模式匹配(Python 3.10+) 这就是专门的 match...case 语句,能根据数据结构来匹配并提取值。

def handle_data(data):
    match data:
        case [name, age]:  # 匹配两个元素的列表
            print(f“Name: {name}, Age: {age}“)
        case {‘name‘: n, ‘age‘: a}:  # 匹配包含这些键的字典
            print(f“Name: {n}, Age: {a}“)
        case _:
            print(“Unknown format“)

handle_data([“Charlie“, 40])  # Name: Charlie, Age: 40
handle_data({“name“: “Diana“, “age“: 35})  # Name: Diana, Age: 35

总结 要哪种“匹配”看你的需求:基础用 =,解构用解包,复杂结构用 match

了解一下有限状态机

逆波兰表达式了解下。

本来字符和数字匹配用正则都是可以的,不过你是为了什么 ,计算四则运算?
这种还是用 后缀表达式比较好,就是楼上就的逆波兰表达式 可以了解一下。

python cookbook 上有现成的代码。

-- coding: utf-8 --

# 不是很清楚你的需求,写了个函数收集字符串中的连续数字和连续符号,供参考。
def collect(string):
operands = []
operators = []

last_symbol = ‘’
is_last_digit = False

for s in string:
if is_last_digit:
if s.isdigit():
# both are digist, append
last_symbol += s
else:
# digist and not digist, end scaning
operands.append(last_symbol)
last_symbol = s
else:
if not s.isdigit():
# both are not digist, append
last_symbol += s
else:
# digist and not digist, end scaning
operators.append(last_symbol)
last_symbol = s

is_last_digit = s.isdigit()

# append last symbol
if is_last_digit:
operands.append(last_symbol)
else:
operators.append(last_symbol)

return operands, operators


if name == ‘main’:
print(collect(’(40+2655)-1102-11’))
print(collect('40+26
55-1102-11’))

# for# appending last symbol 后的 if 一个缩进层级,其他的缩进层级应该不需要额外的说明。
# 输出结果如下(本地没 python3 )
# ([‘40’, ‘26’, ‘55’, ‘1102’, ‘11’], [’(’, ‘+’, ‘’, ‘)-’, ‘-’])
# ([‘40’, ‘26’, ‘55’, ‘1102’, ‘11’], [’’, ‘+’, '
’, ‘-’, ‘-’])


哪用得着那么麻烦啊, 看着都累。

>>> nnn = ‘(40+2655)-1102-11’
>>> import re
>>> numbers = re.findall(’\d+’, nnn)
>>> operators = re.split(’\d+’, nnn)
>>> [numbers, operators]
[[‘40’, ‘26’, ‘55’, ‘1102’, ‘11’], [’(’, ‘+’, '
’, ‘)-’, ‘-’, ‘’]]
>>>

回到顶部