我该如何解释这个Python代码?

时间:2015-09-25 01:42:03

标签: python list

这是我正在查看的代码https://github.com/Katee/quietnet

在这个项目中,有一个名为prettynet.py

的文件

在这个文件中,它就是。

def chunks(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

我不知道如何理解l[i:i+n]的含义。

7 个答案:

答案 0 :(得分:0)

:是列表的切片运算符。

从此answer

a[start:end] # items start through end-1
a[start:]    # items start through the rest of the array
a[:end]      # items from the beginning through end-1
a[:]         # a copy of the whole array

所以,有一个例子

l = [1,2,3,4,5] 
print l[1:3]
>> [2, 3]

答案 1 :(得分:0)

正在切片。因此,在该部分中,它将列表li切换为i+n-1(包括索引i中的元素,直到索引i+n-1,但排除了元素index i+n

答案 2 :(得分:0)

l[i:i+n]slicing syntax,它从索引i(包括)到索引i+n(不包括)得到一个子序列。与索引不同,它从不引发异常;如果切片超出序列,则切片比您预期的短。

答案 3 :(得分:0)

表达式l[i:i+n]返回一个数组l的切片,特别是ii+n-1的元素。这是一个生成器表达式,每次调用都会返回自上次调用以来数组中的下一个n元素。

答案 4 :(得分:0)

这是一种名为slicing的字符串格式。它涉及使用切片表示法:切割字符串的一部分。以下是它的工作原理:

[starting_point:ending_point]
>>>l = [1,2,3,4,5]
>>>a = l[1:3]
>>>print a
[2,3,4]

一旦您知道这一点,代码就变得易于阅读。您正在将i部分中的字符串切片为n应该是的字符串。 n显然也是范围随着每次迭代而跳跃的间隔。

您可以在此处阅读有关切片的更多信息:https://pythonhosted.org/bitstring/slicing.html

答案 5 :(得分:0)

该函数是一个生成器,它返回l元素长的n增量切片。

请考虑以下事项:

def chunks(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

a_list = [1,2,3,4,5,6,7,9,10,11,12,13,14]

for slice in chunks(a_list, 4):
    print(slice)

产地:

[1, 2, 3, 4]
[5, 6, 7, 9]
[10, 11, 12, 13]
[14]

哪些是非重叠切片。这方面的技巧是切片表示法从起始索引中提取元素到(结束索引-1)。

答案 6 :(得分:0)

最简单的方法是尝试一些数据。例如,让我们列出一个清单:

>>> l = list("abcdefghijklmnopqrstuvwxyz")
>>> l
['a', 'b', 'c', 'd', 'e', 'f', ... 'x', 'y', 'z']

我缩短了列表,但它是你所期望的所有字母。现在尝试一下:

>>> list(chunks(l, 3))
[['a', 'b', 'c'],
 ['d', 'e', 'f'],
 ['g', 'h', 'i'],
 ['j', 'k', 'l'],
 ['m', 'n', 'o'],
 ['p', 'q', 'r'],
 ['s', 't', 'u'],
 ['v', 'w', 'x'],
 ['y', 'z']]

所以这里发生的事情是,当i通过循环递增(一次跳过n个元素)时,例程会产生下一个n元素。原始清单。这种返回策略称为"生成器,"并且它由yield声明发出信号。收益率类似于return,但如果再次调用该例程,它将继续从最后一次停止的位置开始。"

另一种方法是循环:

>>> for c in chunks(l, 4):
>>>     print c
['a', 'b', 'c', 'd']
['e', 'f', 'g', 'h']
['i', 'j', 'k', 'l']
['m', 'n', 'o', 'p']
['q', 'r', 's', 't']
['u', 'v', 'w', 'x']
['y', 'z']

每次循环,c成为下一个" chunk"最初的可迭代的。从chunks到循环的结果是原始列表l[i:i+n]的一部分。在这种情况下,我要求n=4,以便您可以看到差异。

当您学习如何使用enumeratechunks和类似的生成器时,您会发现它们非常有用。参见例如itertools模块。