Python 3.x 如何为名称与字符串匹配的变量赋值
有没有办法让下面的代码更优雅?意思是,比如说几行Python 3.x 如何为名称与字符串匹配的变量赋值,python-3.x,Python 3.x,有没有办法让下面的代码更优雅?意思是,比如说几行 if beta == 'a': a = E3632A if beta == 'b': b = E3632A if beta == 'c': c = E3632A if beta == 'd': d = E3632A
if beta == 'a':
a = E3632A
if beta == 'b':
b = E3632A
if beta == 'c':
c = E3632A
if beta == 'd':
d = E3632A
if beta == 'e':
e = E3632A
if beta == 'f':
f = E3632A
if beta == 'g':
g = E3632A
if beta == 'h':
h = E3632A
if beta == 'i':
i = E3632A
if beta == 'j':
j = E3632A
average=(a+b+c+d+e+f+g+h+i+j)/10
这里有一种使用
exec
的方法,该方法可行,但不推荐使用,因为exec
通常是一种容易出错的方法:
import string
if beta in string.ascii_lowercase[:10]:
exec("%s = E3632A" % beta)
average=(a+b+c+d+e+f+g+h+i+j)/10
更好的方法是将变量分配到字典:
vars = {'a':a,
'b':b,
'c':c,
'd':d,
'e':e,
'f':f,
'g':g,
'h':h,
'i':i,
'j':j
# other vars ...
}
import string
if beta in string.ascii_lowercase[:10]:
vars[beta] = E3632A
average=sum(vars.values())/len(vars.values())
指定一个示例值
我想,在这种情况下,我们必须将一个字符作为变量,所以在这种情况下,我们可能必须使用global,如果这是在一个类中,我们可以使用settattr
class example:
def method_example(self):
E3632A = 10
for i in range(ord('a'), ord('j')+1):
setattr(self, chr(i), E3632A)
avergae = (a+b+c+d+e+f+g+h+i+j)/10
print(avergae)
嗨,FCASAN,欢迎来到SO!通常,可能更漂亮的工作代码不太适合堆栈溢出,因此如果您没有得到您在这里寻找的响应,我可能会尝试代码复查。另外,我也很喜欢用字典来做类似的事情。。也。。。最后一行是做什么的?Hi@en_Knight My code的可能副本pics在120秒内每12秒计算一次电源电压和电流消耗,以计算电压/电流并获得系统的平均值。结果会告诉我能量消耗是否正确。谢谢@JosephSible,但你分享的链接不是我想要的。现在我正在查看Ruzihm的回复,可能这正是我想要的。@FCasian您找到解决方案了吗?我想,您可以删除IF块。在第二个例子中,字典会抛出一个nameerror,因为a,b,c,d。。。不是defined@roshanok你指的是哪一个来移除IF块?当
beta
不是a-j时,Asker不想更改任何内容。他们可能会以其他方式使用其他变量,而这在他们的问题中并没有表现出来。对于nameerror,在代码片段Asker显示之前,变量显然已经定义好了。我同意你的观点,并且完全理解。这是对提问者的一个建议和信息——如果它能帮助解决这个用例的话。第一个只有在a-j是全局变量的情况下才有效。如果Asker的代码片段出现在函数中,那么它将无法工作。第二个将所有变量a-j设置为E3632A
,这不是Asker想要做的。因为问题本身是关于分配名称与字符串匹配的变量,所以我认为他可能正在寻找字符串作为变量,所以我的答案强调如何将字符串作为变量。我只是试着用这个例子,所以我用了a到j,反正提问者只能选择他想要的。谢谢你的评论
class example:
def method_example(self):
E3632A = 10
for i in range(ord('a'), ord('j')+1):
setattr(self, chr(i), E3632A)
avergae = (a+b+c+d+e+f+g+h+i+j)/10
print(avergae)