zoukankan      html  css  js  c++  java
  • 【python3的学习之路八】高级特性

    切片

    举出一个list的例子

    L = list(range(100))

    如何取前三个元素?

    L[0:3] # 从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
    L[:3]  #如果第一个索引是0,还可以省略

    其他情况

    L[-10:]  # 后10个元素
    L[:10:2] # 前10个数,每俩个取一个
    L[::5]   # 所有数,每5个取一个
    L[:]     # 不变

    截取一部分的字符串并与其他字符串拼接

    var1 = 'Hello World!'
     
    print ("拼接字符串 : ", var1[:6] + 'Python!')

    迭代

    如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
    在python中,迭代是通过 for…in 来完成的。

    # Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
    for i, value in enumerate(['A', 'B', 'C']):
         print(i, value)
    
    for x, y in [(1, 1), (2, 4), (3, 9)]:
         print(x, y)

    因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。
    默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。

    >>> d = {'a': 1, 'b': 2, 'c': 3}
    >>> for key in d:
    ...     print(key)
    ...
    a
    c
    b

    列表生成式

    举个例子,要生成 list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 可以用list(range(1, 11))

    [x * x for x in range(1, 11)]
    # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    [x * x for x in range(1, 11) if x % 2 == 0]
    # [4, 16, 36, 64, 100]
    [m + n for m in 'ABC' for n in 'XYZ']
    # ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

    迭代器

    迭代器是一个可以记住遍历的位置的对象。
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
    迭代器有两个基本的方法:iter() 和 next()。

    mylist = [1, 2, 3,  4, 5, 6, 7]
    it = iter(mylist)
    print(next(it))

    把一个类作为一个迭代器使用需要在类中实现俩个方法__iter__()与__next__()。

    • iter()方法返回一个特殊的迭代器对象,这个迭代器对象实现了__next__()方法并通过StopIteration异常标识迭代的完成
    • next()方法会返回下一个迭代器对象
    class MyNumbers:
        def __iter__(self):
            self.a = 1
            return self
    
        def __next__(self):
            x = self.a
            self.a += 1
            return x
    
    myclass = MyNumbers()
    myiter = iter(myclass)
    
    print(next(myiter))
    print(next(myiter))

    StopIteration
    StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

    fetch = iter(seq)
    while True:
        try:
            i=fetch.next()
        except StopIteration:
            break
        do_something_to(i)

    生成器

    如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator,yield是生成器实现__next__()方法的关键。

    要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator

    >>> L = [x * x for x in range(10)]
    >>> L
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>

    我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?

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

    yield的功能:

    • 相当于函数封装好__iter__和__next__
    • return只能返回一次值,函数就终止了,而yield内部时一个状态机,维护着挂起和继续的状态

    生成器函数
    常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。

    import sys
     
    def fibonacci(n): # 生成器函数 - 斐波那契
        a, b, counter = 0, 1, 0
        while True:
            if (counter > n): 
                return
            yield a
            a, b = b, a + b
            counter += 1
    f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
     
    while True:
        try:
            print (next(f), end=" ")
        except StopIteration:
            sys.exit()

    3分钟理清可迭代、迭代器、生成器的概念,掌握Python3中迭代器的使用方法

  • 相关阅读:
    tracert命令与tracert (IP地址)-d有什么区别?
    linux下通过进程名查看其占用端口
    Union和Union All的区别
    外连接、内连接
    Linux 删除文件夹和文件的命令(强制删除包括非空文件)
    linux查看当前目录
    Linux chmod命令及权限含义
    MySQL的if,case语句
    case when
    java生成验证码图片
  • 原文地址:https://www.cnblogs.com/CSgarcia/p/9706112.html
Copyright © 2011-2022 走看看