关于python:代码注释:解释代码中发生的事情

Code notes: Explaining the what is happening in the code

本问题已经有最佳答案,请猛点这里访问。

我是个新手。我已经使用了下面的代码,但我想了解最后一行是如何工作的,有人能给我解释一下代码的最后一行return eval(((str(a)+"*")*b)[:-1])吗?

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


eval评估python代码,或者让python程序在自己内部运行python代码。例子:

1
CODE:

a = 15
eval('print(a + 3)')

1
OUTPUT:
1
18

当您返回以下内容时

1
eval(((str(a)+"*")*b)[:-1])

你基本上是这样做的(例如,如果你是计算能力(2,5)):

1
2
3
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。


return eval(((str(a)+"*")*b)[:-1])

等于

1
2
3
4
5
6
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

它相当于(真的更好;-)!):

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


最好的方法是使用a**b来获得计算能力。但是,如果您想使用eval,那么考虑以这种方式连接字符串:eval('*'.join(str(a)*b))。在这种情况下,str(a)将整数a转换为字符串a,然后*b将重复ab times,最后,'*'.join()将把所有a*连接在一起,并创建一个类似于a*a*a*a的字符串。然后,eval将对字符串进行计算,就像它是一个表达式一样。


一个可怕的想法,如其他人所说-如果你是一个新手,考虑找一个更好的向导!

eval读取一个字符串,并将其作为非字符串进行计算(就好像它不在引号中一样)。所以我们构造一个EDOCX1(即a^b)字符串,让python读取它,然后返回除最后一个字符以外的所有字符。很没意义,但你来了。


使用eval()从来不是一个好主意。在这里阅读它的危险行为。

您只需要**操作符,相当于您在其他语言中看到的^操作符:

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