Python:多个参数是如何工作的?

Python:多个参数是如何工作的?,python,function,arguments,Python,Function,Arguments,我是Python和编程新手。有人能详细解释一下下面的代码吗 def myzip(*seqs): seqs = [list(S) for S in seqs] res = [] while all(seqs): res.append(tuple(S.pop(0) for S in seqs)) return res >>> myzip([1, 2, 3], ['a', 'b', 'c']) [(1, 'a'), (2, 'b'),

我是Python和编程新手。有人能详细解释一下下面的代码吗

def myzip(*seqs):
    seqs = [list(S) for S in seqs]
    res = []
    while all(seqs):
        res.append(tuple(S.pop(0) for S in seqs))
    return res

>>> myzip([1, 2, 3], ['a', 'b', 'c'])
[(1, 'a'), (2, 'b'), (3, 'c')]
特别是,我不理解
S
是列表中的元素(例如
1
2
…)或列表(
[1,2,3]


我想我需要对每一行进行详细解释。

在列表理解中,
S
被分配给传递给函数的每个参数
seqs
是传入的参数列表,您传入了两个列表。所以
S
首先绑定到
[1,2,3]
然后
['a','b','c']

>>> seqs = [[1, 2, 3], ['a', 'b', 'c']]
>>> seqs[0]
[1, 2, 3]
第一行只是确保所有参数都被显式地转换为列表,以便以后可以调用
list.pop(0)
。这允许您将字符串、元组、字典或任何其他iterable作为参数传递到此函数:

>>> myzip('123', 'abc')
[('1', 'a'), ('2', 'b'), ('3', 'c')]
while all(seqs):
循环然后迭代,直到至少有一个参数为空。换句话说,循环在最短序列用尽时终止:

>>> myzip('1', 'abc')
[('1', 'a')]

在循环中,每个输入参数的第一个元素从列表中删除,并作为元组添加到
res
。对于两个输入列表,这意味着首先将
(1,'a')
添加到
res
,然后将
(2,'b')
,然后
(3,'c')

seqs是两个单独列表的列表:[1,2,3]和['a',b',c']

现在
而all(seqs):
将迭代seqs的元素——上面提到的两个列表。 然后,我们创建一个空列表res并将其附加到
tuple
对象。 每个元组对象将逐步包含seqs中每个列表的第一个元素
pop(0)
将返回第一个元素并将其从列表中删除,从而更改列表(列表是可变的)

因此,您所做的是创建一个元组列表,该列表通过将两个列表中的相应元素配对而获得


当您说
seqs=[seqs中S的列表]
时,S指的是seqs中的每个列表元素。但是,在对函数的这个特定调用中,由于您将列表作为元素传递,因此该语句变得多余。

首先您需要知道什么是函数。因为这个函数与python中的zip做的工作相同

def myzip(*seqs):
第一行表示此函数获取您想要的任意多个参数,所有参数都将作为
seqs
收集在一个列表中。像
myzip([1,2,3],'a','b','c'])这样的用法提供了
seqs=[[1,2,3],'a','b','c']

    seqs = [list(S) for S in seqs]
然后您需要确保
seqs
中的每个项目都是列表项目。此行将每个项目转换为列表。这就是我们要做的。(偶数
'123'
['1','2','3']

在这四行中,它弹出
seqs
的每个
S
的第一个元素,并为最终结果创建一个元组。最后的结果是一个列表(
res=[]
)。 循环内条件:它检查
seqs
的所有元素是否可用。如果其中一个变空,则会中断循环。 在循环中,
pop(0)
S
中删除第一个元素,并将其作为值
S.pop(0)
返回。这样,它会更新
seqs
的所有元素。下一个循环

在所有第一个元素中创建类似于
(1,'a')
的元组。下一次迭代将是`(2,'b'),因为所有第一个元素都在前面弹出


列表
res
中的所有这些元组都是它的目标
res.append
将这些元组添加到最终结果中。

为什么即使是“append”和“tuple”都在“for”循环之外,似乎“for”循环也更外部?例如:对于seqs:res.append(tuple(S.pop(0))中的S,我认为因为for循环在更内部,结果应该是:(1,2,3,'a',b',c')为什么我错了?为什么for循环的位置无关紧要?
    res = []
    while all(seqs):
        res.append(tuple(S.pop(0) for S in seqs))
    return res