Slicing
12345 |
L[:10:2] # [0, 2, 4, 6, 8]L[::5] # 所有数,每5个取一个# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95] L[:] # copy L |
Iterating
12 |
for x, y in [(1, 1), (2, 4), (3, 9)]: print(x, y) |
List Comprehension
A list comprehension allows you to easily create a list based on some processing or selection criteria.
12345 |
myList = [x * x for x in range(1, 11) if x % 2 != 0][ch.upper() for ch in 'comprehension' if ch not in 'aeiou'] combinations = [m + n for m in 'ABC' for n in 'XYZ']# ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] |
Generator
Referennce: https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128
Create a generator:
12345678910 |
L = [x * x for x in range(10)]L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]g = (x * x for x in range(10))g<generator object <genexpr> at 0x1022ef630>next(g)0>>> for n in g: print(n) |
Create a generator for fibbonacci:
12345678910111213141516171819 |
def (k): # print first k fibbonacci number n, a, b = 0, 0, 1 while n < k: print(b) a, b = b, a + b n = n + 1 return 'done' def (max): n, a, b = 0, 0, 1 while n < max: yield b # Change print to yield, and fib would be a generator a, b = b, a + b n = n + 1 return 'done' >>> f = fib(6)>>> f<generator object fib at 0x104feaaa0> |
generator和函数的执行流程不一样。函数是顺序执行,遇到return 大专栏 [Python] Advanced features
语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
12345678910111213141516171819202122 |
def odd(): print('step 1') yield 1 print('step 2') yield(3) print('step 3') yield(5) >>> o = odd()>>> next(o)step 11>>> next(o)step 23>>> next(o)step 35>>> next(o)Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration |
118. Pascal’s Triangle
Leetcode: https://leetcode.com/problems/pascals-triangle/
1234567891011121314 |
def generate(self, numRows): """ :type numRows: int :rtype: List[List[int]] """ def row(num): n, prev, cur = 1, [1], [1, 1] while n <= num: yield prev prev = cur temp = [0] + prev + [0] cur = [temp[i] + temp[i - 1] for i in range(1, len(temp))] n += 1 return [r for r in row(numRows)] |
Iterator
可以直接作用于for
循环的对象统称为可迭代对象:Iterable
. list
, set
, dict
, str
, tuple
.
而生成器不但可以作用于for
循环,还可以被next()
函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值了。可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
All generators
are Interator
, not all Iterable
are Iterator
.(list
, set
, dict
, str
, tuple
)
But we can use iter()
to transform iterables into interator.
1234 |
>>> isinstance(iter([]), Iterator)True>>> isinstance(iter('abc'), Iterator)True |
Python的Iterator
对象表示的是一个数据流,Iterator
对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator
甚至可以表示一个无限大的数据流,例如全体自然数。而使用list
是永远不可能存储全体自然数的。
原文地址:https://www.cnblogs.com/lijianming180/p/12366611.html