Python 强化训练:第三篇

作者: 谢小路 | 来源:发表于2016-11-01 11:34 被阅读177次

    强化训练:第三篇

    问题来源

    1. pythoner面试经常会问到迭代器和生成器的区别

    内容

    1. 可迭代对象
    2. 迭代器:正向迭代, 反向迭代
    3. 生成器:

    1.

    可迭代对象/ 迭代器

    for 语句对对象调用了 iter()方法, 使用next()方法

    内置函数:iter()可以获取迭代器对象,使用迭代器的next()方法可以访问下一个元素

    for element in [1, 2, 3]:
        print(element)
    
    for element in "abcdef":
        print(element)
    
    for key in {"one": 1, "two": 2}:
        print(key)
    
    

    dir(str)

    dir(dict)

    dir(list)

    都存在 类似于__iter__的接口, 称之为可迭代对象.可迭代对象返回迭代器对象。

    实现可迭代对象, 可迭代对象实现迭代器对象
    
    迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
    
    from collections import  Iterable, Iterator
    
    
    class RangeInt(Iterator):
    
        def __init__(self, start, end, step):
            self.start = start
            self.end = end
            self.step = step
    
        def __next__(self):
            if self.start > self.end:
                raise StopIteration
            t = self.start
            self.start += self.step
            return t
            
    class RangeInt_Iterable(Iterable):
    
        def __init__(self, start, end, step):
            self.start = start
            self.end = end
            self.step = step
    
        def __iter__(self):
            return RangeInt(self.start, self.end, self.step)
            
    for i in RangeInt_Iterable(0, 10, 1):
        print(i)
    
    

    2.

    生成器可迭代对象

    关键字:yield

    返回区间内的素数
    
    class NumBer(object):
    
        def __init__(self,  start, end):
            self.start = start
            self.end = end
    
        def isshu(self, k):
            if k < 2:
                return False
    
            for i in range(2, k):
                if k % i == 0:
                    return False
    
            return True
    
        def __iter__(self):
            for j in range(self.start, self.end):
                if self.isshu(j):
                    yield j
    
    number = NumBer(0, 100)
    for i in number:
        print(i)
    
    

    生成器表达式:

    `a = (i for i in range(5))`
    `type(a)# class 'generator'`
    

    列表解析式:

    `b = [i for i in range(5)]`
    `type(b)# class list`
    

    字典解析式:

    `c= {k:randint(10,20) for k in "xyzabc"}`
    `type(c)# class dict`
    

    集合解析式:

    `e = {j for j in range(5)}`
    `type(e)# class set`
    

    3.

    L = list(range(5))

    如何反向迭代:
    
    方法1:
    for i in L.reverse():
        print (i) # L被反向
        
    方法2:
    for i in L[::-1]:
        print(i) # 创建 一个新的list
        
    方法3:
    for i in reversed(L):
        print(i)
        
    

    反向迭代:内置函数reversed()实现

    __reversed__接口

    class FloatRange:
        def __init__(self, start, end, step=0.1):
            self.start = start
            self.end = end
            self.step = step
    
        def __iter__(self):
            t = self.start
            while t <= self.end:
                yield t
                t += self.step
    
        def __reversed__(self):
            t = self.end
            while t >= self.start:
                yield t
                t -= self.step
    
    for x in reversed(FloatRange(1.0, 4.0, 0.5)):
        print x
    
    
    

    4.

    总结

    迭代(iteration)就是对可迭代对象(iterables,实现了__iter__()方法)和迭代器(iterators,实现了__next__()方法)的一个操作过程。可迭代对象是任何可返回一个迭代器的对象,迭代器是应用在迭代对象中迭代的对象,换一种方式说的话就是:iterable对象的__iter__()方法可以返回iterator对象,iterator通过调用next()方法获取其中的每一个值.

    生成器是迭代器的一种, 存在关键字yield。

    相关文章

      网友评论

        本文标题:Python 强化训练:第三篇

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