我是新手开发人员。我使用了下面的代码,但是我想了解最后一行的工作方式,有人可以向我解释代码的最后一行return eval(((str(a)+"*")*b)[:-1])
吗?
def power(a,b):
if b == 0:
return 1
else:
return eval(((str(a)+"*")*b)[:-1])
答案 0 :(得分:1)
return eval(((str(a)+"*")*b)[:-1])
等同于
a_str=str(a) # convert a in STRING
a_star=a_str+"*" # concat the string a_str with "*"
a_repeted=a_star*b # repeat a_star "b" times
exp=(a_repeted)[:-1] # get all a_repeted car except the last on (ex 3*3*3*3 for a=3 and b=4)
res=eval(exp) # evalutate the expression
return res
相当于(真的更好;-)!):
def power(a,b):
return a ** b
答案 1 :(得分:1)
eval评估python代码或让Python程序在其内部运行Python代码。 示例:
CODE:
a = 15
eval('print(a + 3)')
OUTPUT:
18
返回以下内容
eval(((str(a)+"*")*b)[:-1])
这基本上是做什么的(例如,如果您正在计算能力(2,5)):
str(a) -> changes the value of a to string. in this case "2"
str(a)+"*" -> concatinate the above string to the multiplication sign. now we have "2*"
(str(a)+"*")*b) -> duplicates the above string b times. That is "2*"+"2*"+"2*"+"2*"+"2*", that is five times and now you have "2*2*2*2*2*"
但是正如您所看到的,末尾还有一个额外的“ *”。要删除这一行,我们使用[:-1]。这基本上是在选择除最后一个以外的所有内容。 “:”基本上就是全部。
因此要计算的最终表达式为"2*2*2*2*2"
。是2 ^ 5。
答案 2 :(得分:0)
答案 3 :(得分:0)
就像其他人所说的,这是一个可怕的想法-如果您是新手,请考虑寻找更好的指南!
eval
读取一个字符串,并对其进行评估,就好像不是这样(好像它不在引号中一样)。因此,我们构造了一个a ** b
(即a ^ b)字符串,并要求Python读取它,然后返回除最后一个字符以外的所有字符。毫无意义,但是你去了。
答案 4 :(得分:0)
最好的方法是使用a**b
来提高计算能力。但是,如果要使用eval,请考虑通过以下方式连接字符串:eval('*'.join(str(a)*b))
。在这种情况下,str(a)将整数a
转换为字符串a
,然后*b
将重复a
b times
,最后'*'.join()
将将所有a
与其中的*
连接在一起,并创建类似a*a*a*a
的字符串。 eval
然后将字符串视为表达式。