Python学习(三):迭代器、生成器、装饰器、递归、算法、正则
1、迭代器
迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
特点:
访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
不能随机访问集合中的某个值,只能从头到尾依次访问
访问到一半时不能往回退
便于循环比较大的数据集合,节省内存
使用:
#生成迭代器:
name = iter(['d','c','b','a',])
print(name.__next__())
print(name.__next__())
print(name.__next__())
print(name.__next__())
f = open("test.text","r")
for line in f: #已迭代的方式读取文件,节省内存
print(line)
2、生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
作用:
yield可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
相当于生成器函数生成值后自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效。
import time
def Consumer(name):
print("%s 准备吃包子了!" %name)
while True:
baozi = yield
print("包子%s来了,被%s吃了" %(baozi,name))
def Producer():
c = Consumer('A')
c2 = Consumer('B')
c.__next__()
c2.__next__()
print("包子已经开始制作!")
for i in range(2):
time.sleep(1)
print("做了两个包子")
c.send(i)
c2.send(i)
Producer()
上述代码,首先执行的Producer函数,然后c、c2分别执行Consumer函数,由于函数中yield,所以该函数挂起,通过next打印第一个print,遇到yield再次挂起函数。继续执行Producer的代码,之后通过send再次调用Consumer函数(send是发送参数给yield),然后继续执行之前中断位置后面的代码。
3、装饰器
#!/usr/bin/env python
# coding=utf-
def outer(fun):
def wrapper():
print(')
fun()
print(')
return wrapper
@outer
def Func1():
print("Func1")
@outer
def Func2():
print("Func2")
@outer
def Func3():
print("Func3")
Func1()
Func2()
Func3()
上述代码outer就是一个装饰器,其中outer是名字,fun是参数。
当代码读到@outer时会将下面的函数名也就是Func1就等同于装饰器的参数fun,也就是把Func1传给了fun
于是fun()就被换成了Func1
然后执行Func1()就是执行替换后的wrapper函数
#@outer相当于outer(Func1),装饰器作用是扩展代码
4、递归
如果一个函数在内部调用自身本身,这个函数就是递归函数。
#!/usr/bin/env python
# coding=utf-8
def Fibonacci(arg1,arg2,stop):
if arg1 == 0:
print(arg1)
print(arg2)
arg3 = arg1 + arg2
if arg3 < stop:
print(arg3)
return Fibonacci(arg2,arg3,stop)
else:
return
#代码执行
Fibonacci(0,1,1000)
#0是开始的第一个数字,1是开始的第二个数字,1000是结束值。
通过递归打印菲波那切数列
5、算法基础
5.1 二分查找
#!/usr/bin/env python
# coding=utf-8
import sys
def TwoPointsFind(NumberDataBase,FindNumber,SearchNumber = 1):
#取数字列表的中间值
if len(NumberDataBase) > 1:
print("第%s次查找:" %SearchNumber)
MiddleIndex = int(len(NumberDataBase)/2)
MiddleNumber = NumberDataBase[MiddleIndex]
#如果中间值等于要查找的数字
if MiddleNumber == FindNumber:
sys.exit("找到了。" )
#如果中间值大于要查找的数字,说明要查找的数字在数字集合的左半部分
elif MiddleNumber > FindNumber:
#取集合的左半部分,并递归二分查找函数
SearchNumber += 1
return TwoPointsFind(NumberDataBase[:MiddleIndex],FindNumber,SearchNumber)
else:#如果中间值小于要查找的数字,说明要查找的数字在数字集合的右半部分
# 取集合的右半部分,并递归二分查找函数
SearchNumber += 1
return TwoPointsFind(NumberDataBase[MiddleIndex:],FindNumber,SearchNumber)
else:
print("没有找到")
FindNumber = 50
NumberDataBase = list(range(1,60))
TwoPointsFind(NumberDataBase,FindNumber)
二分查找某个数据
二分查找可分段查询数据,查找速度快,节省内存。
5.2 二维数组旋转九十度
#!/usr/bin/env python
# coding=utf-8
RowColNum = 7
data = [[col for col in range(RowColNum)] for row in range(RowColNum)]
for row in data:
print(row)
print("---------------替换后----------------")
for i in range(len(data)-1):
for j in range(i+1,len(data)):
Before = data[i][j]
After = data[j][i]
data[i][j] = After
data[j][i] = Before
for i in data:
print(i)
#代码执行结果
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
---------------替换后----------------
[0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1]
[2, 2, 2, 2, 2, 2, 2]
[3, 3, 3, 3, 3, 3, 3]
[4, 4, 4, 4, 4, 4, 4]
[5, 5, 5, 5, 5, 5, 5]
[6, 6, 6, 6, 6, 6, 6]
#旋转九十度真正做的是列表的value替换,不难发现替换规律是阶梯互反替换,即01与10,02与20,03与30,04与40,05与50,06与60,12与21,13与31,14与41.....一次类推到56与65。代码可更改RowColNum值,已达到最多层次替换。
二维数组代码
5.3 冒泡排序
#!/usr/bin/env python
#coding=utf-8
DataList = [1,2,2,65,3,55,3,5,54,3,54,3,4,534,5435,234]
#DataList一共有N个数据,那么就要经过N-1次排序才能完成从小到大排序
for j in range(1,len(DataList)):
#从第一个数据开始,依次和下一个数据进行比较
for i in range(len(DataList)-j):
#如果本次数据大于下一个数据,将本次数据与下次数据调换位置
if DataList[i] > DataList[i+1]:
SmallTmp = DataList[i+1]
DataList[i+1] = DataList[i]
DataList[i] = SmallTmp
print(DataList)
冒泡排序
6、正则入门
三十分钟正则表达式>>点我
#!/usr/bin/env python
#coding=utf-8
import re
#match:从开头找,如果开头不匹配则返回None
result1 = re.match('\d+','11112421adsafefrqweadfadfsafdqdf')
#search:是遍历,直到找到为止,找到即终止
result2 = re.search('\d+','ds2ad213131safe22frqweadfadfsafdqdf')
#findall:查找所有的匹配值,返回的是一个列表
result3 = re.findall('\d+','11112421adsafefrqw3ea432dfadfsafdqdf')
#匹配1到3,出现1到5次,*零到多个 ?零或者一 +大于等于1
result4 = re.findall('[1-3]{1,5}','11112421adsafefrqw3ea432dfadfsafdqdf')
Before = "11112421adsafefrqw3ea432dfadfsafdqdf"
#sun:替换,将a替换成T,替换6个
After = re.sub("a","T",Before,count=6)
if result1:
print(result1.group())
if result2:
print(result2.group())
if result3:
print(result3)
if result4:
print(result4)
print(Before,After)
#*零到多个 ?零或者一 +大于等于1 ^匹配开头 $匹配结尾 .匹配任意字符
Python学习(三):迭代器、生成器、装饰器、递归、算法、正则的更多相关文章
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- Python(迭代器 生成器 装饰器 递归 斐波那契数列)
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- python中的迭代器&&生成器&&装饰器
迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...
- python中的迭代器 生成器 装饰器
什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,_ ...
- Python学习之--函数/生成器/装饰器
Function,函数,主要是为了:1提高代码的复用程度,2将程序模块化. 定义函数 在Python中,使用def 用来定义函数,一般函数的定义如下: def name(arg1,arg2,....) ...
- Python基础-迭代器&生成器&装饰器
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看 ...
- Day4 - Python基础4 迭代器、装饰器、软件开发规范
Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...
- Python基础4 迭代器、装饰器、软件开发规范
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- 迭代器/生成器/装饰器 /Json & pickle 数据序列化
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- Python 全栈开发五 迭代器 生成器 装饰器
一.迭代器 迭代协议:对象必须提供一个next方法,执行该方法后会返回迭代的下一项或者抛出Stopiteration异常,终止迭代.切只能往前,不能倒退. 可迭代对象:遵循迭代写一点对象就是可迭代对象 ...
随机推荐
- Oracle的窗口和自动任务
Oracle数据库自己会例行做一些定时任务,比如会自动进行统计信息收集等作业任务.如果统计信息收集的时间正好赶上业务的高峰期,那就有可能由此引发一系列性能故障. 那么,我们该如何查看这些数据库自动去做 ...
- Pyhton编程(六)之基本数据类型-集合(补充)
集合(set) 集合其实就是一个无序的,自动去重的数据集合,它主要的作用是用来去重和进行关系测试,集合的定义方法如下: name=set("czp") /name=set({1,2 ...
- 校门外的树-poj
问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...
- 基于Flink秒级计算时CPU监控图表数据中断问题
基于Flink进行秒级计算时,发现监控图表中CPU有数据中断现象,通过一段时间的跟踪定位,该问题目前已得到有效解决,以下是解决思路: 一.问题现象 以SQL02为例,发现本来10秒一 ...
- scrapy初试水 day01
1.安装pip install Scrapy#一定要以管理员身份运行dos窗口conda install scrapy2.创建项目scrapy startproject hello3.在hello/s ...
- 记一下flex弹性布局
flex弹性布局也越来越广泛的在我们代码中出现了,更加方便我们的布局.自己用了查,查了用,有些还是记不住,俗话说好脑子不如烂笔头,原来都是写在本子上的,很不幸的一次次的想翻的时候总是找不到,还是写博客 ...
- Linux压力测试软件Stress安装及使用指南
一.Stress是什么 stress是一个linux下的压力测试工具,专门为那些想要测试自己的系统,完全高负荷和监督这些设备运行的用户. 二.安装 将stress的安装包上传并解压到linux服务 ...
- HTTP/2之服务器推送(Server Push)最佳实践
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 HTTP/1.X出色地满足互联网的普遍访问需求,但随着互联网的不断发展,其性能越来越成为瓶颈.IETF在2015 ...
- OI大佬博客集
郭家宝:byvoid 早年大牛,题解更新到2014年,其博客内容非常丰富,不止题解 hzwer:hzwer 从OI到ACM,一直在更新 陈立杰:WJMZBMR 无需解释,不过貌似只更到2015 顾森 ...
- 【WF2017】Mission Improbable
http://www.lydsy.com/JudgeOnline/problem.php?id=4950 对于俯视图很好解决,把所有不是0的位置拿到剩1就可以了. 对于正视图与侧视图,稍微想一下也能发 ...