• 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]
    
  • 相关阅读:
    js 中 && 和 ||
    The server time zone value 'EDT' is unrecognized or represents more than one time zone.
    docker进入容器
    docker 挂载本地目录
    Docker for Windows 挂载目录失败
    docker下redis启动 根据本地配置文件
    docker 安装 nacos/nacos-server 镜像并配置本地数据库
    spring cloud Nacos Config配置中心
    Docker卸载
    虚拟机centos添加硬盘和分区挂载
  • 原文地址:https://www.cnblogs.com/SUNYZBlog/p/9634297.html
Copyright © 2020-2023  润新知