zoukankan      html  css  js  c++  java
  • 第三章-高级特性

    1 切片

      当要取list,tuple和str的某个元素到某个元素, 除了逐个列出以外, 还可以用切片(slice)来完成.

      使用方法:

        名字[起始Index : 结束Index]

    >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
    >>> L[0:3]
    ['Michael', 'Sarah', 'Tracy']
    

        表示从起始索引开始, 逐个取值, 但是结束于结束索引前一个元素.

        当结束Index不写的时候取元素取到最后

        同理起始Index不写表示从第一个开始

    >>> L[-2:]
    ['Bob', 'Jack']
    

      可以使用切片的有list, tuple, str 

    2 迭代

      利用for循环来遍历list和tuple等, 这种遍历叫做迭代(iteration)

      迭代的方式主要是采用for..in的方式

      判断该对象是否可以迭代

        导入from collections import Iterable

        利用 isinstance(判断的对象, Iterable)

        其中isinstance方法不仅能够判断迭代器的类型, 还可以python的其余任意类型

    >>> from collections import Iterable
    >>> isinstance('abc', Iterable) # str是否可迭代
    True
    >>> isinstance([1,2,3], Iterable) # list是否可迭代
    True
    >>> isinstance(123, Iterable) # 整数是否可迭代
    False
    

      迭代字典元素的三种方法

        方法一 遍历key

    >>> d = {'a': 1, 'b': 2, 'c': 3}
    >>> for key in d:
    ...     print(key)
    ...
    a
    c
    b
    

        方法二 遍历value

    >>> d = {'a': 1, 'b': 2, 'c': 3}
    >>> for value in d.values():
    ...	print(value)
    ...	
    1
    3
    2

        方法三 同时迭代key和value

    >>> d = {'a': 1, 'b': 2, 'c': 3}
    >>> for k,v in d.items():
    ...	print("key={},value={}".format(k,v))
    ...	
    key=c,value=3
    key=a,value=1
    key=b,value=2
    >>> 
    

      迭代的时候获取索引值, 课使用内置的方法enumerate来实现

    >>> for i, value in enumerate(['A', 'B', 'C']):
    ...     print(i, value)
    ...
    0 A
    1 B
    2 C
    

    3 列表生成式

      列表生成式(List Comprehensions), 主要是用来创建list的生成式

      方法一:

        list(range(N, M))

        获取的值为N, N+1, ... ,M-1

      方法二:

        [ x * x  for x in range(1, 11) if x % 2 == 0 ]

        例子1

    >>> [x * x for x in range(1, 11)]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

        例子2

    >>> [x * x for x in range(1, 11) if x % 2 == 0]
    [4, 16, 36, 64, 100]
    

        例子3

    >>> [m + n for m in 'ABC' for n in 'XYZ']
    ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
    

        例子4

    >>> import os # 导入os模块,模块的概念后面讲到
    >>> [d for d in os.listdir('.')]  # os.listdir('.')可以列出 当前 文件和目录
    ['元类.py', '复习.py', '新式类与经典类.py', '类.py', '练习1.py']
    

        例子5

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

        例子6

    >>> L = ['Hello', 'World', 'IBM', 'Apple']
    >>> [s.lower() for s in L]
    ['hello', 'world', 'ibm', 'apple']
    

    4 生成器

      生成器(generator), 作用与列表生成式类似. 生成器产生的原因是列表生成式是生成的列表, 但是由于内存的限制, 列表生成式能够生成的数量是有限制的

      生成器的最简单的写法就是将列表生成式的[]改为()

    >>> 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()方法获取

    >>> next(g)
    0
    >>> next(g)
    1
    >>> next(g)
    4
    >>> next(g)
    9
    >>> next(g)
    16
    

        方法二: 利用for..in方法迭代

    >>> g = (x * x for x in range(10))
    >>> for n in g:
    ...     print(n)
    ... 
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
    

      生成器的定义方法二: 在函数中利用yield关键字

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    

      这类的generator与函数的区别在于执行顺序不同

        函数: 从头执行到尾, 遇到return停止

        generator: 从头到尾执行, 遇到yield停止, 下次运行是从上次yield的位置继续执行

      由于这种generator也可以利用next和for来获得数据, 且next一样有可能越界, 故同样常用for遍历

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    

      

    >>> for n in fib(6):
    ...     print(n)
    ...
    1
    1
    2
    3
    5
    8
    

      由此可见, for循环无法得到最后return的值, 要获得该值需要使用StopIteration异常

    >>> 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

     

    人若有恒 无所不成
  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/weihuchao/p/6602063.html
Copyright © 2011-2022 走看看