赞
踩

提示:这里可以添加本文要记录的大概内容:
提示:以下是本篇文章正文内容,下面案例可供参考
实现了__iter__方法,并且该方法返回一个迭代器 这样子的对象就是一个可迭代对象
容器类型都是可迭代对象 # range # 打开的文件,socket # 凡是有__iter__并且这个方法返回一个迭代器的对象都称之为可迭代对象
(1)任何实现了__iter__()和__next__()都是迭代器
(2) iter() 返回自身 # next() 返回下一个值
(3) 如果容器中没有更过元素了,则抛出StopIteration
(4) 在for循环中,如果遇到了StopIteration时,就退出循环
(5) 迭代器一定是一个可迭代对象,迭代器是一个懒加载模式,用的时候才生成.
特殊的迭代器, 就是为了写迭代器更加的优雅
mystr = “abcd”
=> [“a”,“b”,“c”,“d”]
代码如下(示例):
mystr = "abcdABCDmd/"
mylist = [item for item in mystr if item.islower()]
print(mylist, type(mylist))
mystr = "abcdABCDmd/"
mylist0 = []
for item in mystr:
if item.islower():
mylist0.append(item)
print(mylist0, type(mylist0))
yield关键字:保留中间算法,下次继续执行
当调用next值时,遇到yield就是暂停运行,并且返回yield后面的值
当再次调用next时,会从刚才暂停的地方继续运行,直到运行下一个yield
def get_content(): print("start yield....") yield 3 print("second yield...") yield 4 print("third yield...") yield 5 print("end.....") # a = get_content() # print(dir(a)) print("*"*20) print(next(a)) print(next(a)) print("*"*20) result = next(a) print(result) print(next(a)) def get_func(): i = 0 while True: i +=1 yield i a = get_func() print(next(a)) print(next(a))
使用生成器实现斐波拉契数列 1,1,2,3,5,8,13,21 ########send def counter(): count = 1 while True: val = yield count print(f'val is {val}') if val is not None: print(f'val is {val}') count = val else: count +=1 # count = counter() print(next(count)) # print(next(count)) count.send(10) #返回一个新的值给yield count print(next(count))
**
count.close() print(next(count)) yield 与field from def f1(): yield range(10) # def f2(): yield from range(10) #for item in range(10): # yield item it1 = f1() it2 = f2() print(it1) print(it2) for i in it1: print(i) print("*"*20) for i in it2: print(i)
代码如下(示例):
# 编写高质量代码 => 减少循环次数
# 打印30以内的数字,所有能被3整除的整数
print([x for x in range(30) if x % 3 == 0])
print([x for x in range(0,30,3)])
print(list(range(0,30,3)))
print([x*x for x in range(30) if x % 3 == 0])
print([x**2 for x in range(0,30,3)])
找到名字中包含2个e的名字放到列表
names = [
['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva', 'Elven']
]
# 找到名字中包含2个e的名字放到列表
print([item for list0 in names for item in list0 if item.lower().count('e') == 2])
mynames = []
for list0 in names:
for item in list0:
if item.lower().count('e') == 2:
mynames.append(item)
过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
# 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
q1 = ['a','ab','abc','abcd','abcde']
print([item.upper() for item in q1 if len(item) >= 3])
print([item.lower() if 'E' not in item else item.upper()
for list0 in names for item in list0
if item.lower().count('e') == 2])
求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表
li = [-1, 2, 1, 9]
print({i**2 for i in li})
# 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表
# [(0,1),(0,3),(0,5), (2,1), (2,3)....]
# 列表推导式 , for , for
print([(x,y) for x in range(6) if x%2==0 for y in range(6) if y%2])
# 第二种更高效
print([(x,y) for x in range(0,6,2) for y in range(1,6,2)])
快速更换key和value,第二种写法更高效
# 快速更换key和value # q3 = {'a': 10, 'b': 34} => q3 = {10:'a', 34:'b'} q={'a':10,'b':34} my_di = {q[key]:key for key in q} print(my_di) # 推荐 => 清晰 my_di = {value:key for key,value in q.items()} print(my_di) # 合并大小写对应的value值,将k统一成小写 # {'a':5, 'b':9, 'c':3} q4 = {'B':3, 'a':1, 'b':6, 'c':3, 'A':4} print({key.lower():q4.get(key.lower(),0)+q4.get(key.upper(),0) for key in q4}) # 如何减少运算次数
1.迭代器与生成器内容很重要,一定要理解之间的关系.尤其是yield关键字:保留中间算法,下次继续执行
2.对于后面的小案例一定要动手去敲一敲,有任何问题可以留言和评论.
3.如果你看到这里了,麻烦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。