zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    Android4.0 以后不允许在主线程进行网络连接
    关于升级linux下apache
    事物复制中大项目(Large Article)出问题如何快速修复
    国企银行面试总结
    Git命令详解(一)-个人使用
    函数体的规模要小,尽量控制在 50 行代码之内
    函数的功能要单一,不要设计多用途的函数
    在函数体的“出口处”,对 return 语句的正确性和效率进行检查
    在函数体的“入口处”,对参数的有效性进行检查
    有些场合用“引用传递”替换“值传 递”可以提高效率
  • 原文地址:https://www.cnblogs.com/SUNYZBlog/p/9634297.html
Copyright © 2011-2022 走看看