美文网首页
python的高级特性

python的高级特性

作者: 抽象语法树 | 来源:发表于2017-11-04 22:16 被阅读0次

    切片

    • 对于取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。
    lit = ['jack','cat',8,'tom'];
    x=lit[0:3];
    y=lit[-2:-1]
    z=lit[:]
    print(x);
    print(y);
    print(z);
    
    

    输出:

    ======================= RESTART: D:/pythonTest/def.py =======================
    ['jack', 'cat', 8]
    [8]
    ['jack', 'cat', 8, 'tom']
    
    • 由于String也可以看作一种List,所以自然也可以用切片的形式取出某段字符串
    str="i love u";
    print(str[2:6]);
    ======================= RESTART: D:/pythonTest/def.py =======================
    love
    
    • 同时支持隔几个数取一个数
    L=list(range(100));
    #前十个数,隔2取1
    print(L[:10:2]);
    #所以数,隔5取1
    print(L[::5])
    ======================= RESTART: D:/pythonTest/def.py =======================
    [0, 2, 4, 6, 8]
    [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
    

    迭代(Iteration)

    • 在Python中,迭代是通过for ... in来完成的
    • Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代
      各种迭代类型:
    L = ['a', 'b', 'c']
    T = ('a', 'b', 'c')
    D = {1: 'a', 2: 'b', 3: 'c'}
    S = "i love u"
    for l in L:
        print(l, end='')
    
    print()
    
    for t in T:
        print(t, end='')
    
    print()
    
    #迭代键
    for key in D:
        print(key, end='')
    
    print()
    
    #迭代值
    for value in D.values():
        print(value, end='')
    
    print()
    
    #迭代键和值
    for k, v in D.items():
        print("%d" % k + ":" + v)
    
    for s in S:
        print(s, end="")
    

    输出:

    abc
    abc
    123
    abc
    1:a
    2:b
    3:c
    i love u
    
    • 通过collections模块的Iterable类型判断是否可迭代
    import collections
    print(isinstance('abc', collections .Iterable))
    print(isinstance(['a', 'b', 'c'], collections .Iterable))
    print(isinstance(range(100), collections .Iterable))
    ================================================
    True
    True
    True
    
    • Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
    for i, value in enumerate(['A', 'B', 'C']):
        print(i, value)
    ===========================
    0 A
    1 B
    2 C
    

    列表生成器

    • 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
      如生成:[1x1, 2x2, 3x3, ..., 10x10]
    L = [x * x for x in range(1, 11)]
    print(L)
    =================================
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

    for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方

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

    还可以使用两层循环,可以生成全排列:

    S = [ m + n for m in "AB" for n in "CD"]
    print(S)
    ================================
    ['AC', 'AD', 'BC', 'BD']
    

    列表生成式使用两个变量来生成list:

    D = {"x": "A", "Y": "B", "Z": "C"}
    P = [k + "=" + z for k, z in D.items()]
    print(P)
    =================================
    ['x=A', 'Y=B', 'Z=C']
    

    生成器(generator)

    • 在Python中,一边循环一边计算的机制,称为生成器
    • generator保存的是算法,每次调用next(generator),就计算出generator的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
    • 但一般用for循环来输出其元素,这样不用担心StopIteration的错误
    g = (x * x for x in range(10))
    for v in g :
        print(v)
    ==================================
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
    
    • generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。
    • 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
    • 变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
    def fun ():
        print("step 1")
        yield 1
        print("step 2")
        yield 2
        print("step 3")
        yield 3
    
    f = fun()
    next(f)
    next(f)
    next(f)
    ========================
    step 1
    step 2
    step 3
    
    • 捕获StopIteration错误
    f = fun()
    while True:
        try:
            print(next(f))
        except StopIteration as e:
            print("generator end")
            break
    ==========================
    step 1
    1
    step 2
    2
    step 3
    3
    generator end
    

    迭代器

    • 可以直接作用于for循环的数据类型有以下几种:
      a. 一类是集合数据类型,如list、tuple、dict、set、str等;

      b.一类是generator,包括生成器和带yield的generator function。

    • 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

    • 可以使用isinstance()判断一个对象是否是Iterable对象:

    >>> from collections import Iterable
    >>> isinstance([], Iterable)
    True
    >>> isinstance({}, Iterable)
    True
    >>> isinstance('abc', Iterable)
    True
    >>> isinstance((x for x in range(10)), Iterable)
    True
    >>> isinstance(100, Iterable)
    False
    
    • 生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值

    • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

    • 可以使用isinstance()判断一个对象是否是Iterator对象:

    >>> from collections import Iterator
    >>> isinstance((x for x in range(10)), Iterator)
    True
    >>> isinstance([], Iterator)
    False
    >>> isinstance({}, Iterator)
    False
    >>> isinstance('abc', Iterator)
    False
    

    生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

    • 把list、dict、str等Iterable变成Iterator可以使用iter()函数:
    >>> isinstance(iter([]), Iterator)
    True
    >>> isinstance(iter('abc'), Iterator)
    True
    
    • 为什么list、dict、str等数据类型不是Iterator?
    • 这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
    • Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

    总结

    • 凡是可作用于for循环的对象都是Iterable类型;
    • 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
    • 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
    • Python的for循环本质上就是通过不断调用next()函数实现的

    相关文章

      网友评论

          本文标题:python的高级特性

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