我的个人博客

人生三境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

Python基础——3特性

特性

切片

 1 L=[0,1,2,3,4,5,6,7,8,9,10]
 2 L[:3]=[0,1,2]
 3 L[-2:]=[9,10]
 4 L[1:3]=[1,2]
 5 L[::3]=[0,3,6,9]
 6 L[:5:2]=[0,2,4]
 7 >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 8 >>> alist[-1: -5: -1]
 9 [9, 8, 7, 6]
10 >>> alist[9: 5: -1]
11 [9, 8, 7, 6]
12 >>> alist[-1::-1]
13 [9, 8, 7, 6, 5, 4, 3, 2,1,0]
14 >>> alist[6:-8:-1]
15 [6, 5, 4, 3]

列表生成式

例如:生成一个1,2,3 …… 的平方的List,用列表生成式就很方便

[x*x for x in range(1:n)]

还可以添加条件筛选

[x*x for x in range(1:n) if x%2 ==]

可以生成全队列

[x+y for x in ‘AB’ for y in ‘CD’]

[‘AC’,’AD’,’BC’,’BD’]

dict用于行列生成式

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

列表生成器

由于当列表生成式生成大量数据时会占用大量的内存,所以如果列表的元素可以通过一边循环一边计算出来,可以节省大量的空间,这种一边循环一边计算的方式成为生成器:generator

g = (x*x for x in [1,2,3,4,5,6,7,8,9]) #定义一个生成器

next(g)   1

next(g) 4

…..

因为生成器也是可迭代对象,所以可以用for n in g print(n)读取生成器数据

例子:斐波拉契数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到   1,1,2,3,5,8,13,21,34…

def fei(n)
    a,b = 0,1
    while n:
        yield b
        a,b = b,a+b
        n = n-1
    return ‘done’

其中yield是关键字,可以把定义的函数变成一个generator,这里最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

f = fei(6)

next (f)  1

next(f)   1

或者for x in fib(6)

       print(x)

但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break
...

g: 1

g: 1

g: 2

g: 3

g: 5

g: 8

Generator return value: done

例子

def yang ()
    L = [1]
    while True
        yield  L
        L = [1] + [L[i]+L[i+1]  for i in range(len(L)-1)] + [1]

 

posted on 2018-09-12 13:34  把子肉爱上热干面  阅读(175)  评论(0编辑  收藏  举报

导航