美文网首页python3学习
Python3(4) Python 高级特性

Python3(4) Python 高级特性

作者: 猿来如痴 | 来源:发表于2018-01-18 19:09 被阅读642次

    本系列主要学习Python的基本使用和语法知识,后续可能会围绕着AI学习展开。
    Python3 (1) Python语言的简介
    Python3 (2) Python语法基础
    Python3 (3) Python函数
    Python3 (4) Python高级特性
    python 高级特性,主要是数据的迭代部分的知识,包括 切片、迭代、列表生成式、生成器、迭代器,整体来看比java等语言更加强大,方便。

    切片

    切片可以截取list的部分数据。查找数据更加方便,相当于java字符串subString()方法。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    L = list(range(20))
    print(L)
    #取前三个数据
    print(L[0:3])
    #取下标1-3条数据
    print(L[1:3])
    #取倒数第一条数据
    print(L[-1:])
    #取倒数1-2条数据
    print(L[-2:])
    #每隔两个取一条数据
    print(L[::2])
    #前6个数据,每隔三个去一条
    print(L[:6:3])
    #复制一个list
    print(L[:])
    

    输出结果:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    [0, 1, 2]
    [1, 2]
    [19]
    [18, 19]
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    [0, 3]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    

    以上就是切片的使用规则,由于tuple,str 可以看成list,也支持切片操作。

    迭代

    迭代指对数据的遍历,一般通过for循环来进行遍历,如list 、tuple。python中for循环不需要有下标,只要是可迭代对象,无论有无下标,都可以迭代。如dict:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    D = {'张三': 16, '李四': 17, '王五': 18}
    #遍历key
    for key in D:
        print(key)
    #遍历 value
    for value in D.values():
        print(value)
    #遍历 key,value
    for k,v in D.items():
        print(k,'=',v)
    #遍历 下标,key,value
    for i,(k,v) in enumerate(D.items()):
        print(i,k,v)
    

    输出结果:

    张三
    李四
    王五
    16
    17
    18
    张三 = 16
    李四 = 17
    王五 = 18
    0 张三 16
    1 李四 17
    2 王五 18
    

    以上是对dict 的遍历,list、tuple 比 dict 更简单, 其中,如果要得到list下标,可以通过关键字 enumerate获取对应的下标,并且for 遍历支持多种返回值。

    列表生成式

    python中可以通过表达式来生成list ,可以方便的生成符合条件的list。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import os
    
    L = [x * x for x in range(1, 11)]
    print(L)
    #增加条件限制
    K = [x*x for x in range(1,11)if x%2 == 0]
    print(K)
    #多层嵌套
    C = [a+b for a in "abc" for b in "ABC"]
    print(C)
    #生成两个变量组成的list
    D = {'张三': 16, '李四': 17, '王五': 18}
    M = [(k,v) for k,v in D.items()]
    print(M)
    #当前目录下的所有文件和目录名
    O = [d for d in os.listdir('.')]
    print(O)
    

    输出结果:

    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    [4, 16, 36, 64, 100]
    ['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']
    [('张三', 16), ('李四', 17), ('王五', 18)]
    ['.idea', 'call_func.py', 'def_func.py', 'HelloWord.py', 'var_args.py']
    

    这就是list 生成式的强大之处,可以通过各种表达式,生成需要的list。

    生成器

    生成器就是按动态的需求生成list,与列表生成式相比,不需要一次性生成完整的数据,可以节约内存。即:列表元素按照某种算法推算出来,边循环一边计算的机制的机制称为 generator,用()代替列表生成器的[]

    g = (x * x for x in range(5))
    print(g)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    

    输出结果:

    Traceback (most recent call last):
    <generator object <genexpr> at 0x000001BF3FD2A200>
      File "F:/python/HelloWord/def_func.py", line 11, in <module>
    0
    1
        print(next(g))
    4
    StopIteration
    9
    16
    

    直接打印g,输出的是<generator object <genexpr> at 0x000001BF3FD2A200>,说明我们定义的是一个generator, 通过连续next(g)可以打印出对应的数据,但是超出范围会报Traceback (most recent call last): Stoplteration错误,由于generator也是可迭代对象

    g = (x * x for x in range(5))
    
    for n in g:
        print(n)
    

    输出结果:

    0
    1
    4
    9
    16
    

    如果上面的for 循环不能瞒住需求,我们可以通过函数来实现, 我们来写一个斐波拉契数列数列,这个数列就是根据前面数据来推断后面的数,在函数中使用关键字yield 可以转化成 generator

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    #用函数实现fib
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            print(b)
            a, b = b, a + b
            n = n + 1
        return 'done'
    
    fib(5)
    print("-----------------")
    #将函数转化成 generator
    def generator_fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    g = generator_fib(5)
    print(g)
    #输出generator:
    while True:
        try:
            x = next(g)
            print('g:', x)
        except StopIteration as e:
            print('Generator return value:', e.value)
            break
    

    输出结果:

    1
    1
    2
    3
    5
    -----------------
    <generator object generator_fib at 0x000001FDFD90A200>
    g: 1
    g: 1
    g: 2
    g: 3
    g: 5
    Generator return value: done
    

    这里我们要清楚yield的使用规则:函数中return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。写一个杨辉三角练练:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    def triangles():
        N = [1]
        while True:
            yield N
            N.append(0)
            N = [N[i] + N[i - 1] for i in range(len(N))]
    n = 0
    for t in triangles():
        print(t)
        n = n + 1
        if n == 10:
            break
    

    输出结果:

    [1]
    [1, 1]
    [1, 2, 1]
    [1, 3, 3, 1]
    [1, 4, 6, 4, 1]
    [1, 5, 10, 10, 5, 1]
    [1, 6, 15, 20, 15, 6, 1]
    [1, 7, 21, 35, 35, 21, 7, 1]
    [1, 8, 28, 56, 70, 56, 28, 8, 1]
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
    

    迭代器

    理解迭代器generator要清楚一个概念,可以进行for 循环的为可迭代对象Iterable,并不是迭代器,迭代器是指以被next()函数调用并不断返回下一个值的对象,表示一个惰性计算的序列。是迭代器一定是可迭代对象,可迭代对象不一定是迭代器。

    • Python的for循环本质上就是通过不断调用next()函数实现的
    • 可迭代对象:list、tuple、dict、set、str、generator、generator function
    • 迭代器:generator、generator function 可以通过iter()函数获得一个Iterator对象
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    from collections import Iterable, Iterator
    
    L = [1,2,3,4,5]
    D = {"张三":15,"李四":16,"王五":17}
    T = (1,2,3,4,5)
    G = (n for n in range(5))
    
    print(isinstance(L,Iterable))
    print(isinstance(D,Iterable))
    print(isinstance(T,Iterable))
    print(isinstance(G,Iterable))
    print("--------------------------------------")
    print(isinstance(L,Iterator))
    print(isinstance(D,Iterator))
    print(isinstance(T,Iterator))
    print(isinstance(G,Iterator))
    print("--------------------------------------")
    print(isinstance(iter(L),Iterator))
    print(isinstance(iter(D),Iterator))
    print(isinstance(iter(T),Iterator))
    

    输出结果:

    True
    True
    True
    True
    --------------------------------------
    False
    False
    False
    True
    --------------------------------------
    True
    True
    True
    

    上面的代码验证了list、dict、tuple、generator是否是迭代器和可迭代对象,通过isinstance判断,可迭代对象可以通过iter()函数生成迭代器。

    参考

    https://www.liaoxuefeng.com

    相关文章

      网友评论

        本文标题:Python3(4) Python 高级特性

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