美文网首页
python的高级特性

python的高级特性

作者: 咸鱼有梦想呀 | 来源:发表于2018-09-27 11:37 被阅读0次

    在python中,代码是越少越好,越简单越好。
    因此就有了python常用的高级特性。

    • 切片(Slice)
      切片操作符,用于经常取指定索引范围的操作。
      好处就是减少使用循环

    eg:

    list切片

    L[0:3]表示从索引0开始取,直到索引3为止,但不包括索引3
    如果第一个索引是0还可以省略。

    list切片

    倒数切片。-1是倒数第一个元素的索引。

    切片不但可以取相邻的,还可以每两个取一次,或者每5个取一次。

    list切片

    tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple

    tuple切片

    字符串切片:

    字符串切片

    小练习:
    利用切片操作,实现一个trim()函数,去除字符串首尾的空格

    def trim(s):
        if(s[:1]==' '):
            s = trim(s[1:])
        elif(s[-1:]==' '):
            s = trim(s[0:-1])
        return s
    
    运行结果
    • 迭代(Iteration)
      给定一个list或tuple,可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration).
      在python中,迭代是通过for……in完成的。

    a.迭代list

    迭代list

    下标循环,Python内置的enumerate函数可以把一个list变成索引-元素对

    迭代list:索引-元素对

    b.迭代字符串

    字符串迭代

    c.迭代dict

    迭代dict 同时迭代key和value

    d.判断一个对象是否可迭代
    通过collections模块的Iterable类型判断

    判断类型是否可以迭代

    IDLE界面不需要导入
    在dos界面需要导入

    from collections import Iterable
    

    小练习:
    请使用迭代查找一个list中最小和最大值,并返回一个tuple

    def findMinAndMax(L):
        if L != []:
            max = L[0]
            min = L[0]
            for l in L:
                if max < l:
                    max = l
                if min > l:
                    min = l
            return (min, max)
        else:
            return (None, None)
    
    运行结果
    • 列表生成式
      列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

    例如,生成list[1,2,3,4,5,6,7,8,9,10]

    list(range(1,11))
    

    生成[1x1, 2x2, 3x3, ..., 10x10]

    生成list

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

    生成条件list

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

    全排列

    把一个list中所有的字符串变成小写:

    字符串变小写

    小练习:
    判断list是否都是字符串,并将首字母变成小写,生成list

    练习

    运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

    • 生成器
      通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
      所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

    把一个列表生成式的[]改成(),就创建了一个generator

    生成器和列表生成式的区别

    generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

    使用for循环,不但可以避免抛出StopIteration的错误,而且很方便。generator也是可迭代对象

    for循环迭代生成器

    如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

    例如著名的斐波拉契数列(Fibonacci)除第一个和第二个数外,任意一个数都可由前两个数相加得到:

    1, 1, 2, 3, 5, 8, 13, 21, 34, ...

    def fib(max):
        n,a,b = 0,0,1
        while n < max:
            print(b)
            a,b = b,a + b
            n = n + 1
        return 'done'
    
    代码解释

    这个函数可以输出斐波拉契数列的前N项:

    运行结果

    上述函数离generator还差一步:
    要想把fib()函数变成generator,只需要把print(b)改成yield b就可以了。

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

    如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

    生成器

    函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

    生成器

    小练习:
    杨辉三角定义如下:

              1
             / \
            1   1
           / \ / \
          1   2   1
         / \ / \ / \
        1   3   3   1
       / \ / \ / \ / \
      1   4   6   4   1
     / \ / \ / \ / \ / \
    1   5   10  10  5   1
    
    

    把每一行看做一个list,试写一个generator,不断输出下一行的list

    def yhTri(n):
        l,index = [1],0
        while index < n:
            yield l
            l = [1] + [l[i] + l[i + 1] for i in range(len(l) - 1)] + [1]
            index += 1
    
    运行结果

    现在知道能用for循环的数据类型有以下几种
    一类是集合数据类型:list,tuple,dict,str
    一类是generator包括生成器和带yield的generator function。
    些可以直接作用于for循环的对象统称为可迭代对象:Iterable

    相关文章

      网友评论

          本文标题:python的高级特性

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