标签:send obj war reduce open 对象 print subclass table
1、迭代器 我们可以使用for循环来遍历可迭代对象,那么到底如何看某一对象是可迭代对象呢
我们目前熟悉的可迭代对象有str、list、tuple、dict、set。
我们可以通过dir函数来查看某一对象或某一类中定义好的所有方法
1 for el in s: 2 print(s) 3 4 s1 = 123 5 # for el in s1: 6 # print(s1) 7 8 print(dir(s)) 9 print(dir(s1))
用dir来查看:
dir(s)返回的结果如下:
[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘,
‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘,
‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘,
‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘,
‘__rmod__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘,
‘capitalize‘, ‘casefold‘, ‘center‘, ‘count‘, ‘encode‘, ‘endswith‘, ‘expandtabs‘, ‘find‘,
‘format‘, ‘format_map‘, ‘index‘, ‘isalnum‘, ‘isalpha‘, ‘isdecimal‘, ‘isdigit‘,
‘isidentifier‘, ‘islower‘, ‘isnumeric‘, ‘isprintable‘, ‘isspace‘, ‘istitle‘, ‘isupper‘,
‘join‘, ‘ljust‘, ‘lower‘, ‘lstrip‘, ‘maketrans‘, ‘partition‘, ‘replace‘, ‘rfind‘, ‘rindex‘,
‘rjust‘, ‘rpartition‘, ‘rsplit‘, ‘rstrip‘, ‘split‘, ‘splitlines‘, ‘startswith‘, ‘strip‘,
‘swapcase‘, ‘title‘, ‘translate‘, ‘upper‘, ‘zfill‘]
dir(s1)返回的结果如下:
[‘__abs__‘, ‘__add__‘, ‘__and__‘, ‘__bool__‘, ‘__ceil__‘, ‘__class__‘, ‘__delattr__‘,
‘__dir__‘, ‘__divmod__‘, ‘__doc__‘, ‘__eq__‘, ‘__float__‘, ‘__floor__‘, ‘__floordiv__‘,
‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘,
‘__index__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__int__‘, ‘__invert__‘, ‘__le__‘,
‘__lshift__‘, ‘__lt__‘, ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__neg__‘, ‘__new__‘, ‘__or__‘,
‘__pos__‘, ‘__pow__‘, ‘__radd__‘, ‘__rand__‘, ‘__rdivmod__‘, ‘__reduce__‘, ‘__reduce_ex__‘,
‘__repr__‘, ‘__rfloordiv__‘, ‘__rlshift__‘, ‘__rmod__‘, ‘__rmul__‘, ‘__ror__‘, ‘__round__‘,
‘__rpow__‘, ‘__rrshift__‘, ‘__rshift__‘, ‘__rsub__‘, ‘__rtruediv__‘, ‘__rxor__‘, ‘__setattr__‘,
‘__sizeof__‘, ‘__str__‘, ‘__sub__‘, ‘__subclasshook__‘, ‘__truediv__‘, ‘__trunc__‘, ‘__xor__‘,
‘bit_length‘, ‘conjugate‘, ‘denominator‘, ‘from_bytes‘, ‘imag‘, ‘numerator‘, ‘real‘, ‘to_bytes‘]
通过对比带有__双下划线的方法可以得到可迭代对象中存在__iter__,而不可迭代对象中则没有该方法。
甚至在open文件的时候也会有__iter__这个方法。
综上我们可以确定,如果对象中有__iter__函数,那么我们认为这个对象遵守了可迭代协议,就可以进行迭代。
这里的__iter__帮助我们获取到对象的迭代器,我们使用__next__()来获取到一个迭代器中的元素。
for的工作原理解析,例如:
1 s = "我爱北京天安" 2 c = s.__iter__() # 获取迭代器 3 print(c.__next__()) # 使用迭代器进行迭代. 获取一个元素 我 4 print(c.__next__()) # 爱 5 print(c.__next__()) # 北 6 print(c.__next__()) # 京 7 print(c.__next__()) # 天 8 print(c.__next__()) # 安 9 print(c.__next__()) # ? 10 print(c.__next__()) # StopIteration 完成迭代后会报错
2、生成器
生成器的实质就是迭代器,在python中有三种方式来获取生成器:
1、通过生成器函数
2、通过各种推导式来实现生成器
3、通过数据的转换也可以获取生成器
我们尝试用生成器函数来完成生成器的创建和使用。
1 def func(): 2 print("111") 3 yield 222 4 ret = func() 5 print(ret) 6 ret1 = ret.__next__() 7 print(ret1)
print打印返回的结果是<generator object func at 0x0309C420>,是一个生成器对象。
我们可以直接执行__next__()来执行生成器,打印结果是111和222.
但需要注意的是,使用__next__方法,当程序运行完最后一个yield后,那么如果后面继续调用__next__()会报错
send()方法和__next__()一样,都可以让生成器执行到下一个yield
send()和__next()两者的区别:
1、send和next()都是让生成器向下走一次;
2、send可以给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send()。
python-fullstack-s13-day13-python基础
标签:send obj war reduce open 对象 print subclass table
原文地址:https://www.cnblogs.com/bug-ming/p/9197947.html