【问题标题】:Input in terms of variables [closed]根据变量输入[关闭]
【发布时间】:2014-09-15 07:22:20
【问题描述】:

我正在使用 pygame 在 python 中制作一个简单的函数绘图仪。我希望用户能够通过控制台输入xy的功能。例如:
math.sin(x) + math.sin(y) 应该是一个有效的输入。 我该如何做到这一点?
注意:x y 尚未分配任何值,因为该值将替换变量输入。

【问题讨论】:

    标签: python variables input plot


    【解决方案1】:

    使用 exec 语句和 def 语句,您可以从用户给出的字符串 arg 创建一个函数。

    >>> arg = raw_input() 
    >>> arg
    'math.sin(x) + math.cos(y)'
    >>> exec 'def f(x,y): return ' + arg
    >>> f
    <function f at 0x000000000021F9E48>
    

    【讨论】:

    • 有没有一种方法可以做到这一点,而无需对每个点使用 eval?它消耗了大量的计算能力......
    • 据我所知,eval 函数和 exec 语句是将字符串转换为代码的唯一方法。如果你想要一个 def 语句,你必须使用 exec。
    【解决方案2】:

    但您不是“对每个点都使用 eval”。一旦exec 编译代码f() 的行为就像一个正常的函数。用这段代码做一些计时,自己看看

    #! /usr/bin/env python
    
    '''
    exec speed test
    '''
    
    import sys, math
    from random import seed, random
    
    def main():
        m = len(sys.argv) > 1 and int(sys.argv[1]) or 250000
    
        def f(x, y):
            return math.sin(x) + math.cos(y)
    
        funcstr = 'math.sin(x) + math.cos(y)'
        exec 'def g(x,y): return ' + funcstr in globals(), locals()
    
        #print f, g
    
        seed(42)
    
        z = 0.0
        for i in xrange(m):
            z += f(random(), random())
            #z += g(random(), random())
    
        print z
    
    
    if __name__ == '__main__':
        main()
    

    在 *nix 上你可以做 time python progname.py;抱歉,我不知道 Windows 等价物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2019-02-21
      • 2018-10-20
      • 1970-01-01
      • 2021-10-18
      • 2020-02-09
      • 1970-01-01
      相关资源
      最近更新 更多