类似函数的变量

ins*_*get 4 python variables function representation

[灵感来自这个问题 ]

假设我有两个列表:

list1 = ['tom', 'mary', 'frank', 'joe', 'john', 'barry']
list2 = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我希望将每个名字list1与一个数字相匹配list2.由于有四个数字list2,我想将前四个名称中的每一个与相应的数字配对list2,并将随机数分配给其余的名称list1.

我知道我可以使用for enumerate和for来解决这个问题random.choice.实际上,我已经为原始问题提供了这样的解决方案.
我想知道,如果有可能做这样的事情:

for name, number in itertools.izip_longest(list1, list2, fillvalue=MAGIC):
    print name, number
Run Code Online (Sandbox Code Playgroud)

最初,我想过使用这样的东西:

MAGIC = random.choice(list1)
Run Code Online (Sandbox Code Playgroud)

但是,random.choice(list1)首先执行,然后将答案用作fillvalue压缩操作.这没有吸引力,因为它没有为它拉链的每对值选择一个新的随机值.因此很明显,它itertools.izip_longest需要它fillvalue本身具有价值的东西,而它并不称之为.实际上,如果我要为它提供一个函数,它将产生一个由名称和可调用函数组成的对,它也是低调的.因此,lambda功能不是可行的解决方案.

我如何创建一个在调用函数时调用某个函数的变量?如何itertools.izip_longest使用fillvalue变量?是__repr__该变量的叫什么?如果是这样,我可以创建一个__repr__调用其中的函数的类吗?

Cla*_*diu 8

似乎这里最简单的方法是创建一个生成所有填充值永恒的生成器,然后通过生成list2中的值来链接它:

def inf_gen(f):
    while True:
        yield f()
Run Code Online (Sandbox Code Playgroud)

注意,inf_gen(f)实际上相当于iter(f, None),因为f永远不会返回.iter有两个参数调用第一个参数,直到它返回第二个参数.

然后使用它:

>>> from itertools import izip, chain
>>> for name, number in izip(list1,chain(list2, iter(lambda: random.choice(list2), None))):
    print name, number

tom 1
mary 2
frank 3
joe 4
john 1
barry 4
Run Code Online (Sandbox Code Playgroud)

您也可以使用itertools来完成此操作,而无需使用生成器理解来定义单独的函数itertools.count:

>>> from itertools import izip, chain, count
>>> for name, number in izip(list1, chain(list2, (random.choice(list2) for _ in count()))):
    print name, number
Run Code Online (Sandbox Code Playgroud)