是否可以根据不同的输入信息创建功能?

时间:2018-08-07 03:04:14

标签: python function functional-programming

我有以下问题,我想知道是否有解决方案。

因为我刚刚了解到函数可以是python中的变量,所以我想知道是否有可能设计一个基于输入创建不同函数的函数。

比方说,我们有一长串字符: longlist = abcdefghijklmnopqrstuvwxyz

给出一个测试列表test = [1,2,3]

函数(func1)可以读取测试列表作为输入,并返回函数(func2)作为输出。 此功能可用于将一长串字符分成不同的组并打印出来 a,bc,def,g,hi,jkl,o,pq....遵循测试列表1,2,3模式并再次重复。

如果测试列表为test = [1,2,3,4]

then func1(test) --> func2 func2(longlist) prints out a,bc,def,ghij,k,lm,n

在这种情况下,它遵循1,2,3,4,1,2 ...模式

我制作的示例看起来并不有趣,但是基本的问题是是否可以基于不同的输入信息创建函数?

3 个答案:

答案 0 :(得分:3)

是的。这称为关闭。内部函数(func2)保留其定义范围。尝试以下操作:

def func1(x):
    def func2(y):
        ret = []
        for f in x * len(y):
            ret += [y[:f]]
            y = y[f:]
            if not y: 
                return ret
    return func2

print(func1([1, 2, 3, 4])('This should do what you want'))

答案 1 :(得分:1)

您可以在第一个函数中定义一个函数,然后再返回。函数1可用于设置参数等。以下是您特定问题的实现。

def make_func(params):
# Params must be a list of integers
    def split_string_in_pattern(string):
        res = []
        pattern_index = 0
        while True:
            res.append(string[:params[pattern_index]])
            print(res)
            string = string[params[pattern_index]:]
            print(string)
            if not string:
                return res
            if pattern_index >= len(params) - 1:
                pattern_index = 0
            else:
                pattern_index += 1
    return split_string_in_pattern

""" Test """ 
long_string = 'asdqweasdasdacasdasdadas'
split_func = make_func([1,2,3,4])
split_func(long_string)

答案 2 :(得分:1)

from itertools import permutations, combinations

# Here you can use which one is more suited for your situation: permutations or combinations

def func1(test):
    def func2(longlist):
        result = []
        for t in test:
            perms = permutations(longlist, t)
            result += perms
        result = [''.join(t) for t in result]
        return result
    return func2

f2 = func1([1, 2])
print(f2('abc'))

您得到

['a','b','c','ab','ac','ba','bc','ca','cb'],如果您使用排列

['a','b','c','ab','ac','bc'](如果使用组合)