码迷,mamicode.com
首页 > 编程语言 > 详细

python-fullstack-s13-day13-python基础

时间:2018-06-19 13:52:44      阅读:174      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!