本章内容
- 迭代器&生成器
- 装饰器
- 递归
- 算法基础
- 正则表达式
- 模块初识
一、迭代器&生成器
迭代器:
迭代器是访问元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大邮电是不要求实现准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在后者被销毁。这个特点使得它特别使用于遍历一些巨大或是无限的集合,比如几个G的文件
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
生成一个迭代器:
1 a = iter([1,2,3,4,5,6])
2 print(a.__next__())
3 print(a.__next__())
4 print(a.__next__())
5 print(a.__next__())
6 print(a.__next__())
7
8
9 结果:
10 1
11 2
12 3
13 4
14 5
生成generator
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会编程生成器
如下:
1 def cash_out(amount):
2 while amount>0:
3 amount -= 1
4 yield amount #print amount
5
6 ATM = cash_out(5)
7
8 print("取到钱%s万"%ATM.__next__())
9 print("花掉花掉!")
10 print("取到钱%s万"%ATM.__next__())
11 print("取到钱%s万"%ATM.__next__())
12 print("花掉花掉")
13 print("取到钱%s万"%ATM.__next__())
14 print("取到钱%s万"%ATM.__next__())
作用:
这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后吗,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
另外,还可以通过yield实现单线程的情况下实现并发运算的效果:
1 import time
2
3 def consumer(name):
4 print("%s 准备吃包子啦!" % name)
5 while True:
6 baozi = yield
7 print("包子[%s]来了,被[%s]吃了!" % (baozi, name))
8
9 def producer(name):
10 c = consumer('A')
11 c2 = consumer('B')
12 c.__next__()
13 c2.__next__()
14 print("老子开始准备做包子啦!")
15 for i in range(10):
16 time.sleep(1)
17 print("做了2个包子!")
18 c.send(i)
19 c2.send(i)
20
21 producer("alex")
二、装饰器
写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发的,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:
- 封闭:已实现的功能代码块
- 开放:对扩展开发
先来看一个例子: 1 import time
2 def timmer(func): 3 def deco(*args,**kwargs): 4 start_time= time.time() 5 time.sleep(2) 6 func(*args,**kwargs) 7 stop_time =time.time() 8 print("the run time %s"%(stop_time-start_time)) 9 return deco 10 11 @timmer 12 def text1(oooo): 13 print("in the text1",oooo) 14 15 @timmer 16 def text2(name,age,job,like): 17 print("in the text2",name,age,job,like) 18 text1('time') 19 text2('Lyon',21,'it','dancing')
输出如下:
in the text1 nimade
the run time 2.020908832550049
in the text2 Lyon 21 it dancing
the run time 2.014737844467163
上述例子中,*args, **kwargs为非固定参数,而@timmer就是重头戏,由输出结果我们可以发现,text1和text2函数都有了timmer函数里面定义的功能,而且是在不改变源代码的条件下添加功能,这就是装饰器的作用。
再看看下面的应用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 # Author:Lyon
4 import time
5 user,passwd = 'Lyon','yangyong'
6 def auth(auth_type):
7 print("auth func:",auth_type)
8 def outer_wrapper(func):
9 def wrapper(*args, **kwargs):
10 print("wrapper func args:", *args, **kwargs)
11 if auth_type == "local":
12 username = input("Username:").strip()
13 password = input("Password:").strip()
14 if user == username and passwd == password:
15 print("