python - 类函数变量

标签 python function variables representation

[灵感来自this question ]

假设我有两个列表:

list1 = ['tom', 'mary', 'frank', 'joe', 'john', 'barry']
list2 = [1, 2, 3, 4]

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

我知道我可以使用带 enumerate 的 for 循环来解决这个问题和 random.choice .事实上,我已经提供了 such a solution到原来的问题。
但是,我想知道是否可以这样做:

for name, number in itertools.izip_longest(list1, list2, fillvalue=MAGIC):
    print name, number

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

MAGIC = random.choice(list1)

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

我将如何着手创建一个在被调用时调用某个函数的变量? itertools.izip_longest如何使用 fillvalue多变的?是 __repr__那个变量叫什么?如果是这样,我可以用 __repr__ 上课吗?在里面调用一个函数?

最佳答案

似乎这里最简单的方法是创建一个生成器,它永久生成所有填充值,然后将其与生成列表 2 中的值链接起来:

def inf_gen(f):
    while True:
        yield f()

请注意,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

您也可以只使用 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

关于python - 类函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21614236/

相关文章:

perl - Perl中的函数别名

javascript - 设置Javascript变量,var win = window.dialogArguments || 的作用是什么开场白||父||顶部;做?

python - 如何在seaborn.tsplot()中显示SD而不是SEM?

python - 如何将具有多个值的嵌套字典导出到 excel

Python 内部中断函数

检查矩阵的行是否在 O(1) 时间内充满 1

variables - Docker Compose 中的环境变量赋值 - 冒号方式

mysql - 显示变量的默认值

python - Keras 中的策略梯度

python - 如何检查 2 个数据库是否打开或关闭(一个在 sqlite3 中,另一个在 MySQL 中)- Python 3.3?