美文网首页
Python步步飞升之Python高级特征

Python步步飞升之Python高级特征

作者: 双流小二郎 | 来源:发表于2019-02-14 17:45 被阅读0次

    Python步步飞升之Python高级特征

    1. 前言

    Python有句著名的话,叫做"Life is short, you need Python",人生苦短啊,代码越少,效率越高,这也是我喜欢Python的原因。这篇文章学习一下Python语言的高级特征: Slicing(切片),Iterable(迭代),List Comprehensions(列表生成式),Generator(生成器)和Iterator(迭代器)。

    2. Slicing(切片)

    Python切片的功能主要用于方便地获取List/Tuple/String等object中元素。

    2.1 循环生成新list

    比如有个List如下,需要获取前3个元素

    l = ['a','b','c','d','e','f','g']
    

    我们可能会有笨方法,用循环来取

    newL = []
    n = 3
    for i in range(n):
        newL.append(l[i])
    

    2.2 List切片

    用切片就可以这样简单的获取

    >>> l[0:3]
    ['a', 'b', 'c']
    >>> l[:3]
    ['a', 'b', 'c']
    >>> l[3:]
    ['d', 'e', 'f', 'g']
    

    l[0:3]的意思是从索引0开始到索引3,不包括索引3。如果第一个索引是0,则可省略;省略第二个索引,代表取到最后一个索引。

    2.3 Tuple, String切片

    对tuple,string同样效果,因为这俩也可以看做一个list

    >>> t=('a', 'b', 'c')
    >>> t[1:3]
    ('b', 'c')
    >>> s='abcdefg'
    >>> s[1:3]
    'bc'
    

    2.4 负数索引

    索引为负数时,代表倒着取。比如说-1代表最后一个index。

    >>> l[-1]
    'g'
    >>> l[-2:-1]
    ['f']
    >>> l[:-2]
    ['a', 'b', 'c', 'd', 'e']
    

    2.5 slice类

    Python提供了一个slice类

    >>> abcObj = slice(0,3)
    >>> l[abcObj]
    ['a', 'b', 'c']
    

    2.6 简单应用

    截取字符串,python中没有类似substring,substr的函数或方法,切片功能可以胜任。
    获取s中字符e之后的字符串

    >>> s
    'abcdefg'
    >>> s[s.index('e')+1:]
    'fg'
    

    反转字符串

    >>> s[::-1]
    'gfedcba'
    

    3. Iterable(迭代)

    3.1 定义

    能够用for来循环的对象,叫做可迭代对象。
    比如list,tuple,string

    >>> s='123'
    >>> for i in s:
    ...     print(i)
    ...
    1
    2
    3
    

    3.2 迭代dict

    >>> d = {'a': 1, 'b': 2}
    >>> for k in d:
    ...     print(k)
    ...
    a
    b
    >>> for v in d.values():
    ...     print(v)
    ...
    1
    2
    >>> for i in d.items():
    ...     print(i)
    ...
    ('a', 1)
    ('b', 2)
    

    3.3 判断

    可以用collections.Iterable判断是否为可迭代对象

    >>> from collections import Iterable
    >>> isinstance(d, Iterable)
    True
    >>> isinstance(5, Iterable)
    False
    

    4. List Comprehensions(列表生成式)

    4.1 定义

    Python内置用以创建list的表达式

    4.2 例子1

    比如说有个list

    l = ['a','b','c']
    

    我们要两两有序交互生成一个新的list

    newL = ['ab', 'ac', 'ba', 'bc', 'ca', 'cb']
    

    使用以下方式实现

    >>> newL = []
    >>> for x in l:
    ...     for y in l:
    ...         if x!= y:
    ...             newL.append(x+y)
    ...
    >>> newL
    ['ab', 'ac', 'ba', 'bc', 'ca', 'cb']
    

    使用列表生成式简化

    >>> newL = [x+y for x in l for y in l if x != y]
    >>> newL
    ['ab', 'ac', 'ba', 'bc', 'ca', 'cb']
    

    可以说简单一行,人生苦短啊。

    4.3 例子2

    再比如说,有一个到10的自然数数列,想要计算一个平方的数列

    >>> l = list(range(10))
    >>> l
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> [x*x for x in l]
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> [x*x for x in l if x%2 == 0]
    [0, 4, 16, 36, 64]
    

    5. Generator(生成器)

    5.1 定义

    生成器和list类似,但只有在需要返回下一个数据时它才会计算,而不用如list一样有容量限制,节省空间。

    5.2 生成器返回数据

    • 通过next()函数返回元素
    >>> next(g)
    'ab'
    >>> next(g)
    'ac'
    

    当最后一个元素返回后继续调用会返回StopIteration错误

    >>> next(g)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    
    • 生成器是Iterable,可以用for来循环元素,这样可以杜绝StopIteration错误
    >>> for x in g:
    ...     print(x)
    ...
    ba
    bc
    ca
    cb
    

    5.3 两种方法创建一个生成器

    • 把一个列表生成式的[]改成()
      例如
    >>> l = ['a','b','c']
    >>> newL = [x+y for x in l for y in l if x != y]
    >>> newL
    ['ab', 'ac', 'ba', 'bc', 'ca', 'cb']
    >>> g = (x+y for x in l for y in l if x != y)
    >>> g
    <generator object <genexpr> at 0x03134130>
    
    • 5.3 通过用yield替换函数中return实现
      变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
    >>> def odd():
    ...     yield 1
    ...     yield 3
    ...     yield 5
    >>> o = odd()
    >>> next(o)
    1
    >>> next(o)
    3
    >>> next(o)
    5
    

    6. Iterator(迭代器)

    6.1 定义

    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

    6.2 转变Iterable为Iterator

    生成器是迭代器,list是Iterable但不是Iterator。
    可以使用iter()函数将Iterable修改为Iterator。

    >>> from collections import Iterator
    >>> l = [1,2,3]
    >>> next(l)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'list' object is not an iterator
    >>> g = iter(l)
    >>> next(g)
    1
    

    6.3 判断对象是否为Iterator

    >>> isinstance(l, Iterator)
    False
    >>> isinstance(g, Iterator)
    True
    

    7. 结语

    如有疑问,欢迎留言共同探讨。

    相关文章

      网友评论

          本文标题:Python步步飞升之Python高级特征

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