【问题标题】:Code notes: Explaining the what is happening in the code [duplicate]代码注释:解释代码中发生的事情[重复]
【发布时间】:2019-05-23 10:44:39
【问题描述】:

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

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

【问题讨论】:

  • 这是非常糟糕的代码。如果要计算幂,只需使用 ** 运算符。如果您想利用计算能力的任务作为学习计算机编程基础知识的机会,请使用循环或递归,而不是 eval
  • 了解 Python's eval 内置。一般请参考Python's documentation。确实,该代码非常糟糕。顺便说一句,编程的一个很好的介绍是 SICP 但不使用 Python
  • 这个问题也很好......即使关闭了,您也可以在这里接受答案。这实际上会促使您获得“投票权”,从而提供更多欣赏方式,例如当一个问题有多个有用的答案时;-)
  • 感谢您的帮助

标签: python


【解决方案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

【讨论】:

    【解决方案2】:

    eval 评估 Python 代码或让 Python 程序在自身内部运行 Python 代码。 示例:

    代码:

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

    输出:
    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。

    【讨论】:

      【解决方案3】:

      最好的方法是使用a**b 来获得计算能力。但是,如果您想使用 eval,请考虑以这种方式加入字符串:eval('*'.join(str(a)*b))。在此,str(a) 将整数a 转换为字符串a 然后*b 将重复a b times 最后'*'.join() 将加入所有a 和@987654330 @ 在两者之间创建一个类似于a*a*a*a 的字符串。然后eval 将评估字符串,就好像它是一个表达式一样。

      【讨论】:

      • 谢谢。这个解释很有道理
      【解决方案4】:

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

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

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

      【讨论】:

      • 我想避免使用 a**b
      • @T-Burg,您是否有b 为负数的情况?
      【解决方案5】:

      正如其他人所说,这是一个糟糕的想法 - 如果您是新手,请考虑寻找更好的指南!

      eval 读取一个字符串并评估它,就好像它不是(好像它不在引号中)。所以我们构造了一个a ** b 的字符串(即a^b),并让Python 读取它,然后返回除最后一个字符之外的所有字符。毫无意义,但你去吧。

      【讨论】:

      • 注明。谢谢
      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 2012-02-24
      • 2016-07-13
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多