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学习(三):迭代器、生成器、装饰器、递归、算法、正则的更多相关文章

  1. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  2. Python(迭代器 生成器 装饰器 递归 斐波那契数列)

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...

  3. python中的迭代器&&生成器&&装饰器

    迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...

  4. python中的迭代器 生成器 装饰器

    什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,_ ...

  5. Python学习之--函数/生成器/装饰器

    Function,函数,主要是为了:1提高代码的复用程度,2将程序模块化. 定义函数 在Python中,使用def 用来定义函数,一般函数的定义如下: def name(arg1,arg2,....) ...

  6. Python基础-迭代器&生成器&装饰器

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看 ...

  7. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  8. Python基础4 迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  9. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  10. Python 全栈开发五 迭代器 生成器 装饰器

    一.迭代器 迭代协议:对象必须提供一个next方法,执行该方法后会返回迭代的下一项或者抛出Stopiteration异常,终止迭代.切只能往前,不能倒退. 可迭代对象:遵循迭代写一点对象就是可迭代对象 ...

随机推荐

  1. States字段的使用规范

    背景 为了统一数据库表的状态字段,统一数据库表设计,简化字段在程序开发中的使用方式. 解决方式 States对应位域枚举StatesFlags. /// <summary> /// 数据状 ...

  2. android stdio 快捷键

    俗话说工欲善其事必先利其器,先熟悉快捷键是很有必要的                 IDE   按键                                                 ...

  3. Centos 安装boost库

    1.在http://www.boost.org/下载boost安装包boost_1_65_1.tar.gz 2.在Centos上解压tar -zxvf  boost_1_65_1.tar.gz后,cd ...

  4. web更改AD用户密码

    web更改AD用户密码 #web更改AD密码 #网站配置 绑定域名ad.test.cn 功能,更改AD用户密码 #参考http://bbs.51cto.com/thread-1379675-1.htm ...

  5. powershell 监控, 重启网卡

    #powershell 监控, 重启网卡 一台Windows服务器,由于负荷较大,偶尔会网络中断,就写了个powershell脚本,监控ip是否通,不通就重启网卡 cls $host.UI.RawUI ...

  6. 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

    Python爬虫总结 总的来说,Python爬虫所做的事情分为两个部分,1:将网页的内容全部抓取下来,2:对抓取到的内容和进行解析,得到我们需要的信息. 目前公认比较好用的爬虫框架为Scrapy,而且 ...

  7. SQL Server学习之路(五):“增删改查”之“改”

    0.目录 1.前言 2.通过SSMS修改数据 3.通过SQL语句修改数据 3.1 修改单列数据 3.2 修改多列数据 1.前言 增删改查都是对数据的操作,其中"改"对应的SQL语句 ...

  8. Hibernate框架入门

    导读 本文主要介绍hibernate的入门,主要包括以下内容:hibernate介绍.hibernate环境搭建.hibernate简单测试.测试涉及的api详解. 一.hibernate介绍 JDB ...

  9. Web前端学习——CSS

    一.CSS简介CSS全称cascading style sheeding,层叠样式列表.CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化.二.CSS组成1.选择器(1) ...

  10. Foxmail 7.0破解版,拷贝到新机器后,发送邮件乱码问题

    申请了新机器,挺开心,键盘和鼠标也好用了,但是新机器也随之而来一些不便,以前存储的数据需要重新拷贝.还有一些邮件,有些邮件标记了*号. Foxmail7.0绿色版本还挺好用,直接拷贝到新机器上就能直接 ...