• python基础——高级特性


    1、切片 

       切片:

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

             >>> L[:3] ['Michael', 'Sarah', 'Tracy']

             >>> L = list(range(100)) >>> L [0, 1, 2, 3, ..., 99]

                   

    前10个数,每两个取一个:

    >>> L[:10:2]
    [0, 2, 4, 6, 8]
    

    所有数,每5个取一个:

    >>> L[::5]
    [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
    

    甚至什么都不写,只写[:]就可以原样复制一个list:

    >>> L[:]
    [0, 1, 2, 3, ..., 99]
    

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

    >>> (0, 1, 2, 3, 4, 5)[:3]
    (0, 1, 2)
    

    字符串'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

    >>> 'ABCDEFG'[:3]
    'ABC'
    >>> 'ABCDEFG'[::2]
    'ACEG'
    
    有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。

    2.迭代:
    for..in ..:
    可迭代的有list、tuple、dict等
    因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。

      list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:

      是否可迭代可以用collections模块的Iterable类型:
      >>> from collections import Iterable
       >>> isinstance('123',Iterable)
       True
    ---------------------------------------------------------------------------------------------------------
    字典迭代的几个方法:
      默认迭代key:
         >>> d = {'a': 1, 'b': 2, 'c': 3}
         >>> for key in d: ... print(key)
    ... a c b
    迭代value:
    >>> for value in d.values():
        ...     print(value)
        ...
        3
        1
        2
    同时迭代key,value方法二:
        >>> for k,v in d.items():
        ...      print(k,v)
        ...
        c 3
        a 1
        b 2
    同时迭代key,value:
        >>> for item in d.items():
        ...     print(item)
        ...
        ('c', 3)
        ('a', 1)
        ('b', 2)

    迭代列表加索引:Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:


        >>> for i,v in enumerate(['A','B','C']):
        ...     print(i,v)
        ...
        0 A
        1 B
        2 C
        >>> for i in enumerate(['A','B','C']):
        ...     print(i)
        ...
        (0, 'A')
        (1, 'B')
        (2, 'C')
    3、列表生成式:
    #一层:
    a = [x for x in range(1,11)]
    print(a)
    #二层
    a = [x*x for x in range(1,11) if x%2==0]
    print(a)
    #字符串
    a = [m+n for m in 'ABC' for n in 'abc']
    print(a)
    #运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:
    import os
    print([d for d in os.listdir('.')])
    #练习题
    L = ['Hello', 'World', 18, 'Apple', None]
    print(isinstance(18,(str)))
    print([s.lower() for s in L if isinstance(s,(str)) ])
    4、生成器:

        generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。

    
    

        要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

                 但不能能获得generator的return返回值,但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIterationvalue中:

        #著名的斐波拉契数列(Fibonacci)
        def Fib(max):
        n, a, b = 0, 0, 1
         while n < max:
         yield b
         a, b = b, a + b
         n = n + 1
        return 'done'
        g = Fib(6)

                 while True:
          try:
          n = next(g)
          print('g:',n)
          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

    
    

        请注意区分普通函数和generator函数,普通函数调用直接返回结果:

    
    
        >>> r = abs(6)
        >>> r
        6
    
    
    

        generator函数的“调用”实际返回一个generator对象:

    
    
        >>> g = fib(6)
        >>> g
        <generator object fib at 0x1022ef948>
    
     
    5、迭代器(Iterator)区别于Iterable

        凡是可作用于for循环的对象都是Iterable类型;

        凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

        集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

        Python的for循环本质上就是通过不断调用next()函数实现的,例如:

        for x in [1, 2, 3, 4, 5]:
            pass
    

        实际上完全等价于:

        # 首先获得Iterator对象:
        it = iter([1, 2, 3, 4, 5])
        # 循环:
        while True:
            try:
                # 获得下一个值:
                x = next(it)
            except StopIteration:
                # 遇到StopIteration就退出循环
                break
    



  • 相关阅读:
    算法——排序方法总结(冒泡,快速,直接,希尔,堆,归并排序)
    C++函数调用之——值传递、指针传递、引用传递
    STM32(13)——SPI
    STM32(12)——CAN
    STM32(11)——DMA
    STM32(10)——窗口看门狗
    STM32(9)——通用定时器作为输入捕捉
    SRM32(8)——ADC和DAC
    WPF从入门到放弃系列第二章 XAML
    WPF从入门到放弃系列第一章 初识WPF
  • 原文地址:https://www.cnblogs.com/wuchenggong/p/8759858.html
Copyright © 2020-2023  润新知