迭代器,生成器,开放封闭原则,列表推导式
迭代器
内部含有__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)