Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实现检查数学模块中是否存在用户输入的超越函数字符串?_Python_Python 3.x - Fatal编程技术网

Python 如何实现检查数学模块中是否存在用户输入的超越函数字符串?

Python 如何实现检查数学模块中是否存在用户输入的超越函数字符串?,python,python-3.x,Python,Python 3.x,这是我的第一篇文章,我是以Python 3为第一语言编写代码的新手,请耐心等待: 我不知道或甚至不知道要搜索什么函数来尝试和学习如何编写一些代码,这些代码可以使用while循环来检查用户键入的超越函数是否是有效函数,该函数存在于数学模块中: user_fn_str = str(input("Type a transcendental function in this form: e.g. 'sin' or 'exp'")) 并假设用户键入: sim 检查将失败。math.sim不存在,它们

这是我的第一篇文章,我是以Python 3为第一语言编写代码的新手,请耐心等待:

我不知道或甚至不知道要搜索什么函数来尝试和学习如何编写一些代码,这些代码可以使用while循环来检查用户键入的超越函数是否是有效函数,该函数存在于数学模块中:

 user_fn_str = str(input("Type a transcendental function in this form: e.g. 'sin' or 'exp'"))
并假设用户键入:

sim
检查将失败。math.sim不存在,它们将保留在while循环中,直到有有效的输入

提前感谢。

您可以检查目录。。比如说:

但这也会给你像“\uuuu doc\uuuuu”和“pi”这样的值,所以你不能保证它是一个函数

import math
s1 = 'sim'
assert not hasattr(math, s1)
s2 = 'sin'
assert hasattr(math, s2)
因此,您需要做的是获取该属性,并通过检查它是否附加了_call__'属性来检查它是否可调用。因此,完整测试将类似于:

import math

def is_math_function(funcname):
    func = getattr(math,funcname,None)
    return func is not None and hasattr(func, '__call__')
您可以对此进行进一步优化,因为None没有调用,所以您可以简单地声明:

def is_math_function(funcname):
    return hasattr(getattr(math,funcname,None),'__call__')
把它做成一行

一些补充说明:

如果测试成功,这本身并不意味着它是一个数学函数:数学可以包含一些额外的函数,比如isnan,好吧,你可以讨论这是否是一个数学函数;和 它没有说明参数的数量,它可以是一个用于数学的参数。例如,sin,但是可以有多个参数,或者严格地说,甚至没有参数,但是对于数学来说可能不是这样。 你可以检查目录。。比如说:

但这也会给你像“\uuuu doc\uuuuu”和“pi”这样的值,所以你不能保证它是一个函数

import math
s1 = 'sim'
assert not hasattr(math, s1)
s2 = 'sin'
assert hasattr(math, s2)
因此,您需要做的是获取该属性,并通过检查它是否附加了_call__'属性来检查它是否可调用。因此,完整测试将类似于:

import math

def is_math_function(funcname):
    func = getattr(math,funcname,None)
    return func is not None and hasattr(func, '__call__')
您可以对此进行进一步优化,因为None没有调用,所以您可以简单地声明:

def is_math_function(funcname):
    return hasattr(getattr(math,funcname,None),'__call__')
把它做成一行

一些补充说明:

如果测试成功,这本身并不意味着它是一个数学函数:数学可以包含一些额外的函数,比如isnan,好吧,你可以讨论这是否是一个数学函数;和 它没有说明参数的数量,它可以是一个用于数学的参数。例如,sin,但是可以有多个参数,或者严格地说,甚至没有参数,但是对于数学来说可能不是这样。 您可以使用hasattr内置函数

import math
s1 = 'sim'
assert not hasattr(math, s1)
s2 = 'sin'
assert hasattr(math, s2)
您可以使用hasattr内置函数

import math
s1 = 'sim'
assert not hasattr(math, s1)
s2 = 'sin'
assert hasattr(math, s2)

很好,完整的答案@tagc:用户说用户类型的超越函数是有效的。我将其解释为:用户输入一个他/她知道是超越的函数。但是问题是:它在数学中受支持吗?@WillemVanOnsem这很有意义。@tagc这样的属性在数学模块中无论如何都不存在,因此您无法查找它。@Ev.Kounis没有,但我的想法是,可能还有其他的库SymPy?这可以告诉你一个特定的函数是超越的还是非超越的,基于它的名字,你可以在Willem已经做过的基础上加上它作为附加条件。但这是一个很长的机会,如果这不是OP需要的东西,那么不管怎样,这都不重要。很好,完整的答案@tagc:用户说用户类型的超越函数是有效的。我将其解释为:用户输入一个他/她知道是超越的函数。但是问题是:它在数学中受支持吗?@WillemVanOnsem这很有意义。@tagc这样的属性在数学模块中无论如何都不存在,因此您无法查找它。@Ev.Kounis没有,但我的想法是,可能还有其他的库SymPy?这可以告诉你一个特定的函数是超越的还是非超越的,基于它的名字,你可以在Willem已经做过的基础上加上它作为附加条件。但这是一个很长的机会,如果这不是OP需要的东西,那么它无论如何都不重要。