代码说明:解释代码中发生的事情

时间:2018-12-24 07:39:13

标签: python

我是新手开发人员。我使用了下面的代码,但是我想了解最后一行的工作方式,有人可以向我解释代码的最后一行return eval(((str(a)+"*")*b)[:-1])吗?

def power(a,b):
    if b == 0:
        return 1
    else:
        return eval(((str(a)+"*")*b)[:-1])

5 个答案:

答案 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)

eval()从来都不是一个好主意。了解其危险行为here

您只需要**运算符,就等于您在其他语言中看到的^(提高到)运算符:

def power(a,b):
    return a ** b

答案 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然后将字符串视为表达式。