Python 代码注释:解释代码中发生的事情

Python 代码注释:解释代码中发生的事情,python,Python,我是一个新手开发人员。我使用了下面的代码,但我想了解最后一行是如何工作的,请有人向我解释代码的最后一行return eval(((str(a)+“*”)*b)[:-1]) def power(a,b): if b == 0: return 1 else: return eval(((str(a)+"*")*b)[:-1]) 返回eval(((str(a)+“*”)*b)[:-1]) 相当于 a_str=str(a) #

我是一个新手开发人员。我使用了下面的代码,但我想了解最后一行是如何工作的,请有人向我解释代码的最后一行
return eval(((str(a)+“*”)*b)[:-1])

def power(a,b):
    if b == 0:
        return 1
    else:
        return eval(((str(a)+"*")*b)[:-1])
返回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
这相当于(真的更好;-)!:

eval()。了解它的危险行为

您只需要一个运算符,它相当于您在其他语言中看到的
^
(提升到)运算符:

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

一个可怕的想法,正如其他人所说的——如果你是新手,就考虑找一个更好的向导吧!p>
eval
读取字符串并对其求值,就好像它不是(就好像它不在引号中一样)。因此,我们构造一个
a**b
(即a^b)字符串,让Python读取它,然后返回除最后一个字符以外的所有字符。这是毫无意义的,但你可以这样做。

最好的方法是使用
a**b
来提高计算能力。但是,如果你想使用EVE,那么考虑以这种方式加入字符串:<代码> EVAL('*'。加入(STR(a)*b))< /代码>。在这种情况下,str(a)将整数
a
转换为字符串
a
,然后
*b
a
重复
b次
,最后是
'*'<然后,code>eval将对字符串进行求值,就像它是一个表达式一样。

eval对python代码求值,或者让python程序在自身内部运行python代码。 例如:

CODE: 当您返回以下内容时

eval(((str(a)+"*")*b)[:-1])
您基本上是这样做的(例如,如果您是计算能力(2,5)):

但正如你所看到的,在结尾有一个额外的“*”。要删除此项,我们使用[:-1]。这基本上是选择除最后一个之外的所有。“:”基本上意味着一切


因此,要计算的最终表达式是
“2*2*2*2*2”
。这是2^5。

这是非常糟糕的代码。如果要计算幂,只需使用
**
运算符。如果您想将计算能力任务作为学习计算机编程基础知识的机会,请使用循环或递归,而不是
eval
。阅读关于内置的内容。一般而言,请参阅。事实上,这段代码真的很糟糕。顺便说一句,一个很好的编程入门是,但不使用pythonnie问题,太。。。即使被关闭,你也可以在这里接受答案。这实际上会促使你拥有“向上投票权”,这会让你有更多的方式去欣赏,比如在一个问题上有多个有用的答案;-)我感谢你的帮助。谢谢我想避免使用**b@T-伯格,你有没有
b
为负值的场景?谢谢。这个解释很有道理 OUTPUT:
18
eval(((str(a)+"*")*b)[:-1])
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*"