zoukankan      html  css  js  c++  java
  • 迭代器,生成器,开放封闭原则,列表推导式

     迭代器

    内部含有__iter__方法的就是可迭代对象,遵循可迭代协议。

    print(dir('123'))  # '__iter__'
    print('__iter__' in dir([1, 2, 3]))
    print('__iter__' in dir({'name':'alex'}))
    print('__iter__' in dir({'name'}))
    print('__iter__' in dir((1, 2, 3)))
    print('__iter__' in dir(1))  # False
    print('__iter__' in dir(True))  # False

    迭代器?可迭代对象通过.__iter__()可以转换成迭代器,满足迭代器协议。
    内部含有__iter__ 且 __next__方法的就是迭代器。

     方法一:__next__()

    print(l_obj.__next__())
    print(l_obj.__next__())
    print(l_obj.__next__())
    print(l_obj.__next__())

    方法二: for循环

    for i in l_obj:
        print(i)
    print('__next__' in dir(l_obj))

    第二种判断方式:

    from collections import Iterable
    from collections import Iterator
    print(isinstance('123', Iterable))
    print(isinstance('123', Iterator))

    实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。
    for循环提供一个机制:

    1,将可迭代对象转化成迭代器。
    2,利用__next__进行取值。
    3,用try异常处理方法防止报错。

    l = [1, 2, 3, 4, 5]
    l_obj = l.__iter__()
    while True:
        try:
            print(l_obj.__next__())
        except Exception:
            break

    迭代器:
    1,节省内存。
    2,满足惰性机制。
    3,取值过程不可逆(一条路走到黑)。

    生成器

    生成器本质也是迭代器,生成器是自己用Python写的迭代器。
    1,通过生成器函数构建。
    2,通过生成器推导式构建。

    def cloth2():
        for i in range(1,10001):
            yield '衣服%s' % i
    
    g = cloth2()
    for i in range(1,51):
        print(g.__next__())
    
    for i in range(1, 151):
        print(g.__next__())

    1,send 具有next功能。
    2,send 可以给上一个yield传值。
    3, 第一个取值不能使用send.
    4,最后一个yield不会得到send的值。、

    def func1():
        count = yield 222
        print(count)
        yield 777
        yield 888
    g_obj = func1()  # 生成器对象 generator object
    # print(g_obj.__next__())
    print(g_obj.send('wusir'))

           开放封闭原则

    1.对扩展是开放的

        为什么要对扩展开放呢?
        我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
    2.对修改是封闭的
        为什么要对修改封闭呢?
        就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,
    很有可能影响其他已经在使用该函数的用户。
    装饰器完美的遵循了这个开放封闭原则。

      列表推导式

    能用列表推导式完成的,用python代码都可以完成。

    li = ['alex', 'wusir', 'taibai', 'nvshen', 'ritian']
    li = ['python%s期' % i for i in range(1, 12)]
    print(li)
    l2 = [i+'_NB' for i in li]
    print(l2)
    
    
    #1,筛选,100以内所有的奇数。
    l2 = [i for i in range(1, 101) if i % 2 == 1]
    l2 = [i for i in range(1, 101, 2)]
    print(l2)
    #2,10以内所有数的平方。 [1,4,9,16.。。100]
    print([i*i for i in range(1, 11)])
    #3,将100以内所有内被三整除的数留到列表中。
    print([i for i in range(1,101) if i % 3 == 0])
    g = (i*i for i in range(1, 11))
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    l3 = [ name for i in names for name in i if name.count('e') == 2]
    print(l3)

     

    字典也可以推导式

    mcase = {'a': 10, 'b': 34}
    mcase_frequency = {mcase[k]: k for k in mcase}
    print(mcase_frequency)
  • 相关阅读:
    用jQuery实现的简单柱状统计图
    转:Mac下配置eclipse的pydev
    准备做些东西
    UIImageJPEGRepresentation 和 UIImagePNGRepresentation
    UITableView,UITableViewCell,UIPickerView,UISearchBar
    UITableViewCell的显示格式
    js 数据类型检测
    data-xxx 属性的作用是什么
    TCP连接篇
    DNS篇
  • 原文地址:https://www.cnblogs.com/luchenhui/p/9047622.html
Copyright © 2011-2022 走看看