Function 在Python中反转函数而不重写它

Function 在Python中反转函数而不重写它,function,python-3.x,Function,Python 3.x,我有一个字符串函数(我确信它是可逆的,所以不需要测试),我可以反向调用它来执行相反的操作吗 例如: def sample(s): return s[1:]+s[:1] 将字符串的第一个字母放在末尾并返回 “输出”将变成“输出” 当我想要得到相反的操作时,我可以使用相同的函数吗 “utputO”将返回“Output”。简短回答:否 更详细的回答:我可以想出3种,也许4种方法来实现您想要的——所有这些都取决于您如何允许更改函数(可能限制为Python或mini语言的子集)、训练函数,或者使

我有一个字符串函数(我确信它是可逆的,所以不需要测试),我可以反向调用它来执行相反的操作吗

例如:

def sample(s):
    return s[1:]+s[:1]
将字符串的第一个字母放在末尾并返回

“输出”将变成“输出”

当我想要得到相反的操作时,我可以使用相同的函数吗

“utputO”将返回“Output”。

简短回答:否

更详细的回答:我可以想出3种,也许4种方法来实现您想要的——所有这些都取决于您如何允许更改函数(可能限制为Python或mini语言的子集)、训练函数,或者使用您希望稍后反转的操作数正常运行函数

因此,方法(1)可能无法达到100%的决定论,并且需要对每个函数进行大量随机示例的培训:使用机器学习方法。这很酷,因为这是一个热门话题,这几乎是一个“机器学习hello world”,要使用Python现有的各种框架之一实现,甚至是自己的框架——只需为字符串转换设置一个神经网络,用几千(可能只有几百)训练它要反转的每个函数的字符串转换,应该具有反转函数。我认为这可能是最好的——至少是“最不正确”的方法——至少是更通用的方法

方法(2):使用可逆操作数为字符串转换创建一种微型语言。使用此迷你语言编写函数。反思你的函数并生成相反的函数

可能看起来很奇怪,但是想象一下一种最小的堆栈语言,它可以从字符串中的某个位置删除一个项,并将其推到堆栈上,将一个项弹出到字符串上的某个位置,还可以执行一些您可能需要的可逆原语(例如上/下)——

例如:

In [36]: sample = "push_op 0 pop_end"

In [37]: engine("Output", sample)
Out[37]: 'utputO'

In [38]: elpmas = inverter(sample)

In [39]: elpmas
Out[39]: 'push_end pop_op 0'

In [40]: engine("utputO", elpmas)
Out[40]: 'Output'
In [3]: @reverse_cache
...     def sample(s):
...        return s[1:]+s[:1]

In [4]:

In [5]: sample("Output")
Out[5]: 'utputO'

In [6]: sample.reverse_cache["utputO"]
Out[6]: 'Output'
In [47]: def sample(s):
   ....:         return s[1:] + s[0]
   ....: 

In [48]: sample("Output")
Out[48]: 'utputO'

In [49]: invert(sample, "uputO")
Out[49]: 'Ouput'

In [50]: 
方法3:如果可能的话,缓存每个调用的输入和输出很容易,只需使用它进行反向操作——可以在Python中作为装饰器来完成

from functools import wraps

def reverse_cache(func):
    reverse_cache = {}
    wraps(func)
    def wrapper(input_text):
        result = func(input_text)
        reverse_cache[result] = input_text
        return result
    wrapper.reverse_cache = reverse_cache
    return wrapper
例如:

In [36]: sample = "push_op 0 pop_end"

In [37]: engine("Output", sample)
Out[37]: 'utputO'

In [38]: elpmas = inverter(sample)

In [39]: elpmas
Out[39]: 'push_end pop_op 0'

In [40]: engine("utputO", elpmas)
Out[40]: 'Output'
In [3]: @reverse_cache
...     def sample(s):
...        return s[1:]+s[:1]

In [4]:

In [5]: sample("Output")
Out[5]: 'utputO'

In [6]: sample.reverse_cache["utputO"]
Out[6]: 'Output'
In [47]: def sample(s):
   ....:         return s[1:] + s[0]
   ....: 

In [48]: sample("Output")
Out[48]: 'utputO'

In [49]: invert(sample, "uputO")
Out[49]: 'Ouput'

In [50]: 
方法4:如果字符串操作仅限于以确定性方式洗牌字符串内容,如您的示例中所示(并且可能通过常量偏移字符代码值,但不进行任何其他操作),不使用神经网络编程就可以编写学习者函数:它将构造一个字符串,每个字符串有一个字符(可能有升序的代码点),将其传递给函数,并记下输出字符串的数字顺序- 因此,在您的示例中,重构的输出顺序将是(1,2,3,4,5,0)-给定该顺序,只需根据这些索引对反转函数的输入进行重新排序-这在Python中很简单:

def order_map(func, length):
    sample_text = "".join(chr(i) for i in range(32, 32 + length))
    result = func(sample_text)
    return [ord(char) - 32 for char in result]

def invert(func, text):
    map_ = order_map(func, len(text))
    reordered = sorted(zip(map_, text))
    return "".join(item[1] for item in reordered)
例如:

In [36]: sample = "push_op 0 pop_end"

In [37]: engine("Output", sample)
Out[37]: 'utputO'

In [38]: elpmas = inverter(sample)

In [39]: elpmas
Out[39]: 'push_end pop_op 0'

In [40]: engine("utputO", elpmas)
Out[40]: 'Output'
In [3]: @reverse_cache
...     def sample(s):
...        return s[1:]+s[:1]

In [4]:

In [5]: sample("Output")
Out[5]: 'utputO'

In [6]: sample.reverse_cache["utputO"]
Out[6]: 'Output'
In [47]: def sample(s):
   ....:         return s[1:] + s[0]
   ....: 

In [48]: sample("Output")
Out[48]: 'utputO'

In [49]: invert(sample, "uputO")
Out[49]: 'Ouput'

In [50]: 

对不起,我不太明白。您是在尝试反转任意函数(因为这是一个数学问题),还是反转特定的字符串函数(这可能是一个python问题),还是想知道python是否具有内置的任意反转功能(不,不可能)?好的,这是一个更好的问题:)您能在问题中澄清这一点吗(“我有一个功能”,而不是“如果我有一个功能”,这对我来说听起来更一般),并显示在某些单位情况下发生的情况以及您认为的行为是什么?我认为这样会得到更好的响应。反转仅适用于无副作用的内射函数。只需在执行函数时创建一个查找表,然后反向查找。开玩笑;)@nucleon hmm函数必须是双射函数(即满射和内射)是可逆的。我不明白无副作用是如何意味着满射的,或者是否有一个隐式的嵌入条件提供了这种条件,就像有限状态一样?例如,一个以内射方式获取字符串并将其映射到实数的函数是不可逆的(不可能存在“反函数”),因为空格没有对齐