Python:多个参数是如何工作的?
我是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'),
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