day12 函数的使用方法:初识迭代器和生成器

生成器和迭代器比装饰器简单多了。。。

这是老师的博客地址:

http://www.cnblogs.com/Eva-J/articles/7213953.html

前情回顾:

 1 #装饰器:
 2     # 在不修改一个函数的调用方式的前提下载一个函数的前后添加功能
 3 #装饰器的生成流程和用法
 4 #自己写装饰器的情况比较少——面试、装饰器的机制
 5 
 6 # def wrapper():pass
 7 #
 8 # @wrapper
 9 # def func():pass
10 
11 #流畅的python
12 #能看懂 —— 别人写的好东西 你能知道
13 
14 #装饰器的扩展
15 #周一下午考试
16 #周二下午:讲考试题、装饰器的扩展
17 
18 #爬取一个网页
19 #如果这个网页没有被爬取过,就真的去访问这个网页,否则,返回之前访问的时候存在文件中的内容
20 from urllib.request import urlopen
21 
22 def wrapper(func):
23     def inner(*args,**kwargs):
24         with open('web','rb') as f:
25             web_content = f.read()
26         if not web_content:
27             web_content = func(*args,**kwargs)
28             with open('web','wb') as f:
29                 f.write(b'aaaaaaaaa'+web_content)
30         return web_content
31     return inner
32 
33 # @wrapper
34 def get_url(url):
35     content = urlopen(url).read()
36     return content
37 
38 web_content = get_url('http://www.cnblogs.com/Eva-J/articles/7213953.html')
39 print(web_content)
40 # web_content = get_url('http://www.cnblogs.com/Eva-J/articles/7213954.html')
41 # print(web_content)
42 # web_content = get_url('http://www.cnblogs.com/Eva-J/articles/7213953.html')
43 # print(web_content)
44 #迭代器和生成器
45 
46 
47 
48 #r 可读    文本操作模式
49 #w 可写    文本操作模式
50 #rb 直接操作二进制
51 #wb 直接操作二进制
52 # 当你拿到的是纯文字,就用文本操作模式
53 # 当你拿到的是字节,就用二进制操作的模式
54 
55 # {'url':'文件名1','url2':''}   os
56 
57 #装饰器:
58     # 在不修改一个函数的调用方式的前提下载一个函数的前后添加功能
59 #装饰器的本质:闭包函数
60 # @wrapper            #get_url = wrapper(get_url)
61 # def get_url(url):
62 #     content = urlopen(url).read()
63 #     return content
64 
65 
66 #login  :了解原理 :三次登录
67 #log    :必须会   :写到文件里     ——————
68 #web_content    :进阶要求
View Code

迭代器

  1 #迭代器
  2 #列表 字典 元祖 字符串 集合
  3 # for item in 'asfj':pass
  4 # for i in 25:
  5 #     print(i)
  6 #'iterable' 可迭代的
  7 # print(dir([]))
  8 # print(dir({}))
  9 # print(dir(5))
 10 #
 11 # print('__iter__' in dir('abc'))
 12 #内部含有__iter__方法的数据类型 就是可迭代的  —— 可迭代协议
 13 
 14 ret = 'abc'.__iter__()
 15 # print(ret)
 16 'iterator'  #迭代器
 17 #__iter__
 18 #迭代器你可以理解为一个容器,我们从这个容器当中一个接着一个的把值取出来的过程就是迭代的过程
 19 #如何从迭代器中取值
 20 # print(ret.__next__())
 21 # print(ret.__next__())
 22 # print(ret.__next__())
 23 # print(ret.__next__())
 24 
 25 #
 26 # l = ['ha','hei','he']
 27 # lst_iter = l.__iter__()
 28 # print(lst_iter.__next__())
 29 # print(lst_iter.__next__())
 30 # print(lst_iter.__next__())
 31 #迭代器的用法
 32 #可迭代的 === 可迭代对象  python一切皆对象
 33 #迭代器
 34 # print(dir(l))
 35 # print('__iter__' in dir(lst_iter))
 36 # print('__next__' in dir(lst_iter))
 37 # print(set(dir(lst_iter)) - set(dir(l)))
 38 # lst_iter.__next__()
 39 
 40 #可迭代的 必须 含有 __iter__方法        #可迭代协议
 41 #迭代器比可迭代的多一个 __next__方法
 42 #迭代器:包含__next__,__iter__方法     #迭代器协议
 43 # 包含__next__方法的可迭代对象就是迭代器
 44 #迭代器是可迭代的 的一部分
 45 #获得迭代器:可迭代的调用 __iter__()
 46 #使用迭代器:迭代器.__next__()
 47 
 48 #如何判断一个变量是不是迭代器或者可迭代的
 49 # print('__iter__' in dir([1,2,3,4]))
 50 # print('__next__' in dir([1,2,3,4]))
 51 
 52 # from collections import Iterable
 53 # from collections import Iterator
 54 # print(isinstance([1,2,3,4],Iterable))
 55 # str_iter = 'abc'.__iter__()
 56 # print(isinstance(str_iter,Iterator))
 57 # print(isinstance('abc',Iterable))
 58 
 59 
 60 #可迭代的  : __iter__
 61 #迭代器    : __iter__ 和__next__
 62 #迭代器和可迭代的关系 :可迭代的包含迭代器
 63 #迭代器和可迭代的判断 :两种方法
 64 
 65 #迭代器的工作原理
 66 l_iter = [1,2,3,4,5].__iter__()
 67 #只是记录当前这个元素和下一个元素
 68 # print('__iter__' in dir(range(10)))
 69 # print('__next__' in dir(range(10)))
 70 # range_iter = range(10).__iter__()
 71 # print(range_iter.__next__())
 72 # print(range_iter.__next__())
 73 #迭代器的特点  —— 迭代器是个好东西
 74 #惰性运算
 75 #从前到后一次去取值,过程不可逆 不可重复
 76 #节省内存
 77 
 78 # for item in [1,2,3]:
 79 #     pass
 80 
 81     #list_iter = [1,2,3].__iter__()
 82     #list_iter.__next__()
 83 
 84 #用while循环模拟for循环的方式  —— for循环是依赖迭代器的,且我们自己也可以仿照着写
 85 # l = [1,2,3,4,5]
 86 # l_iter = l.__iter__()
 87 # while True:
 88 #     try:
 89 #         print(l_iter.__next__())
 90 #     except StopIteration:
 91 #         break
 92 
 93 #for循环是让我们更简单的使用迭代器
 94 #用迭代器取值就不需要关心索引或者key的问题了
 95 
 96 #迭代器是个好东西
 97 #目前我们已知的可迭代的都是python提供给我们的
 98 #range()
 99 #f
100 #enumerate()
101 #在平时写代码的过程中,我们用for循环就够了
102 
103 #我自己想写个可迭代的,——生成器
104 #生成器的本质就是迭代器
105 #因此生成器的所有好处都和迭代器一样
106 #但是 生成器是我们自己写的python代码
107 #生成器的实现由两种方式:
108 #1.生成器函数
109 #2.生成器表达式
110 # def func():
111 #     return ['衣服1','衣服2000000']
112 #
113 # ret = func()
114 # print(ret)
115 
116 #基本数据类型
117 #文件处理
118 #函数
119 #装饰器
120 #迭代器
121 #生成器函数
122 
123 #大作业
124 # http://www.cnblogs.com/Eva-J/articles/7776508.html
View Code

生成器

 1 #我自己想写个可迭代的,——生成器
 2 #生成器的本质就是迭代器
 3 #因此生成器的所有好处都和迭代器一样
 4 #但是 生成器是我们自己写的python代码
 5 #生成器的实现由两种方式:
 6 #1.生成器函数
 7 #2.生成器表达式
 8 # def func():
 9 #     return ['衣服1','衣服2000000']
10 #
11 # ret = func()
12 # print(ret)
13 
14 # def g_func():
15 #     yield 1
16 #
17 # g = g_func()
18 # print(g)
19 # #generator 生成器   --->  迭代器
20 # print(g.__next__())
21 #生成器函数和普通函数之间的区别
22 #生成器函数中含有yield关键字
23 #生成器函数调用的时候不会立即执行,而是返回一个生成器
24 
25 def g_func():
26     print('aaaa')
27     yield 1
28     print('bbbb')
29     yield 2
30     yield 3
31 #
32 # g = g_func()
33 # for i in g:
34 #     print(i)
35 # print(g.__next__())
36 # print(g.__next__())
37 # print(g.__next__())
38 
39 
40 def cloth():
41     for i in range(1000000):
42         yield  '衣服%s'%i
43 
44 g = cloth()
45 for i in range(50):
46     print(g.__next__())
47 
48 for i in range(50):
49     print(g.__next__())
50 
51 #生成器函数还有一些应用
52 #生成器表达式
View Code
原文地址:https://www.cnblogs.com/2012-dream/p/7784792.html