美文网首页
python 高级特性

python 高级特性

作者: super静_jingjing | 来源:发表于2018-06-08 18:04 被阅读0次

    1.切片
    对取数据很方便,如取一个list的前n个元素,没有接触到切片的,可以使用循环,但是用切片就会很简单:

    arr = ["java" , "python","C++","C#"];
    arr[0:2];  //list[ 起始位置 : 知道该位置停止但是不包括]
    //结果  ['java', 'python']
    arr[1:2];  
    //结果  ['python']
    

    也支持倒数切片,但是倒数的索引从-1开始
    arr[-2 , -1] >>> >>> ['python']
    arr[-2:] >>> >>> ['python', 'C++']
    如果什么都不写,直 arr [:] , 可以原样赋值一个list
    以下还有一些高级应用

    // 前10个数,每两个取一个:
    arr [:10:2]
    //所有数,每5个取一个:
    arr [::5]
    

    truple也可以同样的方式使用切片;一个字符串也可以使用切片来分割字符串

     'ABCDEFG'[:3]
    // 结果  'ABC'
    'ABCDEFG'[::2]
    // 结果  'ACEG'
    
    1. 迭代
      用for循环来遍历list或者truple,这种遍历方式就称为迭代
      truple和list以及dict都可以用for...in的方式进行迭代,但是python的循环不像java用下标的方式
      如果想要用下标的方式进行迭代可以使用enumerate将list转变成索引+元素
     for i, value in enumerate(['1', '2', '3']):
          print(i, value)
    ...
    
    1. 列表生成式
      用来创建list
      生成一个[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))
      image.png
      生成一个[11, 22, 33, 44, 55, 66, 77, 88, 99, 1010]
    >>> [x*x for x in range(1,11)]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

    也可以使用两层循环

    >>> [m+n for m in 'abc' for n in 'de']
    ['ad', 'ae', 'bd', 'be', 'cd', 'ce']
    

    for循环后面还可以加上if判断

    >>> [m for m in 'abc' if  m!='b']
    ['a', 'c']
    

    4.生成器
    一边循环一边计算的机制,称为生成器:generator。
    创建:列表生成是[] ,生成器是()

    >>> (x*x for x in range(1,11))
    <generator object <genexpr> at 0x0000000001DF0BF8>
    

    打印出generator的每一个元素,使用next()

    >>> g=(x*x for x in range(1,11))
    >>> g
    <generator object <genexpr> at 0x0000000001DF0BA0>
    >>> next(g)
    1
    >>> next(g)
    4
    >>> next(g)
    9
    >>>
    

    计算到没有元素之后将会抛出异常StopIteration
    也可使用for循环遍历generator

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

    generator还可以用函数的方式,如果一个函数中有yield 关键字,就说明这个函数不是普通函数,而是generator
    generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

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

    同样的,把函数改成generator后,不会真的去使用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
    

    5 迭代器
    可以直接使用for循环的数据类型有:
    1). 集合数据类型,如list、tuple、dict、set、str等;
    2). generator,包括生成器和带yield的generator 函数。
    这些可以直接用for循环的对象都成为可迭代对象:Iterable
    可以用isinstance判断对象是否是可迭代对象

    >>> from collections import Iterable
    >>> isinstance([], Iterable)
    True
    >>> isinstance({}, Iterable)
    True
    

    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    可以用isinstance判断对象是否是Iterator对象
    生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
    把list、dict、str等Iterable变成Iterator可以使用iter()函数:

    >>> from collections import Iterator
    >>> isinstance(iter([]), Iterator)
    True
    

    相关文章

      网友评论

          本文标题:python 高级特性

          本文链接:https://www.haomeiwen.com/subject/wtmosftx.html