我有以下问题,我想知道是否有解决方案。
因为我刚刚了解到函数可以是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 ...模式
我制作的示例看起来并不有趣,但是基本的问题是是否可以基于不同的输入信息创建函数?
答案 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'](如果使用组合)