[Python] Advanced features

Slicing

1
2
3
4
5
L [: 10 : 2 ] 
# [0, 2,. 4,. 6,. 8]
L [:: 5 ] # all numbers, every five take a
# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
L [:] # Copy L

Iterating

1
2
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.

1
2
3
4
5
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:

1
2
3
4
5
6
7
8
9
10
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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>

and execution flow generator function is not the same. Function execution order is encountered statement or statement returns the last line of the function. Becomes a function generator, each call time of execution, encounters statement returns, execution again returned from the last statement continues execution.return 大专栏  [Python] Advanced featuresnext()yieldyield

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)

>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> 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/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.

1
2
3
4
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

Python's Iteratorobject represents a data stream, Iteratorthe object can be next()invoked function and continue to return next data until the absence of data thrown StopIterationerror. This data stream can be seen as an ordered sequence, but we can not know in advance the length of the sequence, can only continue through the next()realization of next-demand computing a data function, so the Iteratorcalculations are inert, only need to return the next data it will be calculated.

IteratorEven represent an infinite stream of data, such as all natural numbers. The use listis never stored all natural numbers.

Guess you like

Origin www.cnblogs.com/lijianming180/p/12366611.html