标签:for循环 hid next sel 获取 大小 error: raise 函数调用
一:迭代器
暂时不涉及到自定义迭代器,涉及到了再补,暂时知道for循环的原理就可以了.
1有__iter__就是可迭代的,也叫可迭代协议
2双下方法:c语言写好了的内置方法,可以用不止一种的方式调用
class Test: pass test = Test() for i in test: print(i) #TypeError: ‘Test‘ object is not iterable
class Test: def __iter__(self): return self test = Test() for i in test: print(i) #TypeError: iter() returned non-iterator of type ‘Test‘
class MyStudents: """ 自定义一个迭代器对象 """ stu_list = [] def __init__(self, *args): names = args self.position = 0 for name in names: self.stu_list.append(name) #对象本身就是迭代器,返回自身 def __iter__(self): return self def __next__(self): if self.position < len(self.stu_list): item = self.stu_list[self.position] self.position+=1 return item else: raise StopIteration() def __str__(self): return self.stu_list.__str__() def add_student(self,stu_name): self.stu_list.append(stu_name) stus = MyStudents("张三","李四") stus.add_student("王五") stus.add_student("赵六") print(stus) for i in stus: print(i)
二:生成器本质是迭代器
1 def gen_test(): 2 for i in range(20): 3 yield "test%s" % i
生成器函数调用了只会生成一个generator对象,不会执行里面的代码
只有next(g)才会执行到第一个yield结束,并将值返回
正好for循环就可以不断的调用next()
三:表达式
列表推导式:一次性生成全部数据
li=[i**2 for i in range(10)] print(li)
for遍历每个元素,按照开头的规则生成每个元素,for的简写形式
names = [[‘Tom‘, ‘Billy‘, ‘Jefferson‘, ‘Andrew‘, ‘Wesley‘, ‘Steven‘, ‘Joe‘], [‘Alice‘, ‘Jill‘, ‘Ana‘, ‘Wendy‘, ‘Jennifer‘, ‘Sherry‘, ‘Eva‘]] #先for的外面的大列表,然后for里面的小列表 #推导式的缺点是无法打断点,debug ret = [li for name in names for li in name if li.count("e")>=2] print(ret)
生成器表达式:不会全部数据一次性生成到内存中
只把列表生成式外层中括号换成小括号即可
字典推导式:原理还是for循环遍历的是key
合并大小写对应的value值,将k统一成小写 mcase2 = {‘a‘: 10, ‘b‘: 34, ‘A‘: 7, ‘Z‘: 3} ret2 = {k.lower():mcase2.get(k.lower(),0)+mcase2.get(k.upper(),0) for k in mcase2} print(ret2)
集合推导式
集合推倒式,和列表推到式就差一个{},多了去重的功能 squared = {x**2 for x in [1, -1, 2]} print(squared)
标签:for循环 hid next sel 获取 大小 error: raise 函数调用
原文地址:https://www.cnblogs.com/gyxpy/p/11559613.html