Python基础入门 (四)

一、迭代器&生成器

  1、迭代器仅仅是一容器对象,它实现了迭代器协议。它有两个基本方法:

  1)next 方法  返回容器的下一个元素   

  2)_iter_方法  返回迭代器自身。迭代器可以使用内建的iter方法创建

ts = iter([‘asd‘,‘sds‘,‘qweq‘])
#创建iter方法
print(ts.__next__()) #使用_next_方法返回下一个元素
print(ts.__next__())
print(ts.__next__())

#运行结果
asd
sds
qweq#需要注意的是,如果已经全部返回后,多输出一个next的话报错Traceback (most recent call last):print(ts.__next__())StopIteration

  2、生成器

  通过list可以直接创建一个列表,但是收到内存限制,列表容量肯定是有限。而且,创建一个包含几千万元素的列表肯定会占用很大的存储空间。如果要访问前面的几个元素,那么后面绝大多数元素占得空间都浪费了。

  所以,如果列表元素可以按照某种算法推算出来,就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。一边循环一边计算的机制,称为生成器:generator。

  定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器,如果函数中包含yield语法,那这个函数就会变成生成器 

def cash(m):
    while m > 0:
        m -=1
        yield 100
        print(‘取钱‘)
atm = cash(300)
print(type(atm))
print(atm.__next__())
print(atm.__next__())
print(‘待会............‘)
print(atm.__next__())
#运行结果
<class ‘generator‘>
100
取钱
100
待会............
取钱
100

  作用:yield的主要效果就是可以使函数中断,并保存中断状态;中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。

  另一种用途就是可以通过yield实现在单线程的情况下实现并发运算的效果。

import time
def consumer(name):
    print(‘%s,过来吃饭‘ %name)
    while True:
        baozi = yield
        print(‘包子[%s]来了,被[%s]吃了‘ %(baozi,name))
def producer(name):
    c = consumer(‘A‘)
    c2 = consumer(‘B‘)
    c.__next__()
    c2.__next__()
    print(‘开始做饭了‘)
    for i in range(10):
        time.sleep(1)
        print(‘做了2个包子‘)
        c.send(i)
        c2.send(i)
producer(‘tom‘)
#运行结果
A,过来吃饭
B,过来吃饭
开始做饭了
做了2个包子
包子[0]来了,被[A]吃了
包子[0]来了,被[B]吃了
做了2个包子
包子[1]来了,被[A]吃了
包子[1]来了,被[B]吃了
做了2个包子
包子[2]来了,被[A]吃了
包子[2]来了,被[B]吃了
做了2个包子
包子[3]来了,被[A]吃了
包子[3]来了,被[B]吃了
做了2个包子
包子[4]来了,被[A]吃了
包子[4]来了,被[B]吃了
做了2个包子
包子[5]来了,被[A]吃了
包子[5]来了,被[B]吃了
做了2个包子
包子[6]来了,被[A]吃了
包子[6]来了,被[B]吃了
做了2个包子
包子[7]来了,被[A]吃了
包子[7]来了,被[B]吃了
做了2个包子
包子[8]来了,被[A]吃了
包子[8]来了,被[B]吃了
做了2个包子
包子[9]来了,被[A]吃了
包子[9]来了,被[B]吃了

二、装饰器

1、嵌套函数

def t1(a):
    def t2(b):
        return a+b
    return t2
f = t1(‘aaaa_‘)
res = f(‘bbbbbb‘)
print(res)
#运行结果
aaaa_bbbbbb

  运行流程:

  1)由于程序是由上到下的执行顺序,所以首先执行“f = t1(‘aaaa_‘);

  2)把a的值传给函数t1,a=‘aaaa_‘,但是该函数里面又包含另一个函数,所以先跳出;

  3)执行res = f(‘bbbbb‘),把‘bbbbb‘赋值给函数t2,b = ‘bbbbb‘;

  4)执行t2,返回a+b,print输出结果。

  进阶

def action(x):
    return(x)

def action_pro(n):
    def warpper(x):
        return(n(x) * x)
    return(warpper)

action = action_pro(action) #第一个action为自定义的伪装变量,第二个action为上边定义的action函数
res = action(3) #此函数实际为warpper(3),返回值为9
print(res)
#运行结果9
    def action_pro(n):
        def warpper(x):
            return(n(x) * x)
        return(warpper)  

    @action_pro #用action_pro函数把action包装成warpper
    def action(x):
        return(x)  

    action(3) #此函数实际为warpper(3),返回值为9  
def login(func):
    def inner(arg):
        print(‘Success!‘)
        func(arg)
    return inner
@login
def tv(name):
    print(‘welcome [%s] to page!‘%name)

#tv = login(tv)
tv(‘tom‘)

三、递归

  递归算法是一种直接或者间接的调用自身算法的过程。

  特点:

    1、递归就是在过程或函数里调用自身;

    2、在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口;

    3、在递归条用的过程当系统为每一层的返回点、局部变量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不使用递归算法设计程序。

  要求:

    1、每次调用在规模上都有所缩小;

    2、相邻两次重复之间有紧密的联系,前一次为后一次做准备(通常前一次的输出作为后一次的输入);

    3、每次递归调用都是有条件的,无条件的递归将会成为死循环。

  示例:

def calc(n):
    print(n)
    if n/2 > 1:
        res = calc(n/2)
        print(‘res‘,res)
    print(‘N‘,n)
    return n
calc(10)

  进阶:快速判断一个数字是否在一个列表中

def search(data_soure,find_n):
    mid = int(len(data_soure)/2)
    print(len(data_soure))
    if len(data_soure) >=1:
        if data_soure[mid] > find_n:
            print(‘in left‘)
        #    print(data_soure[:mid])
            search(data_soure[:mid],find_n)
        elif data_soure[mid] < find_n:
            print(‘in right‘)
        #    print(data_soure[mid:])
            search(data_soure[mid:],find_n)
        else:
            print(‘Found in!‘)
    else:
        print(‘No!‘)
if __name__ == ‘__main__‘:
    data = list(range(1,10000000))
    search(data,1)

四、算法基础

备注:下次细说

要求:生成一个4*4的2维数组并将其顺时针旋转90度

data = [[col for col in range(4)] for row in range(4)]
for r_index,row in enumerate(data):
    for c_index in range(r_index,len(row)):
        tmp = data[c_index][r_index]
        data[c_index][r_index] = row[c_index]
        data[r_index][c_index] = tmp
    print(‘*****************‘)
    for r in data:print(r)

五、正则表达式

  Python通过re模块提供对正则表达式的支持。使用re的步骤一般是先将表达式的字符串形式编译为pattern实例,然后使用pattern实例处理文本并获得匹配结果,最后使用match实例获得信息,进行其他的操作。

import re

# 将正则表达式编译成Pattern对象
pattern = re.compile(r‘hello‘)

# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match(‘hello world!‘)

if match:
    # 使用Match获得分组信息
    print(match.group())
#运行结果
hello

re.match函数

pattern 匹配的正则表达式

string 要匹配的字符串。

flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

检索和替换

Python 的re模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, max=0)

返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现,字符将被没有改变地返回。

可选参数 count 是模式匹配后替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。

 
时间: 2024-12-25 19:08:40

Python基础入门 (四)的相关文章

Python 基础语法(四)

Python 基础语法(四) --------------------------------------------接 Python 基础语法(三)-------------------------------------------- 十.Python标准库 Python标准库是随Pthon附带安装的,包含了大量极其有用的模块. 1. sys模块 sys模块包含系统对应的功能 sys.argv ---包含命令行参数,第一个参数是py的文件名 sys.platform ---返回平台类型 sy

转 Python爬虫入门四之Urllib库的高级用法

静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览器,调试浏览器F12,我用的是Chrome,打开网络监听,示意如下,比如知乎,点登录之后,我们会发现登陆之后界面都变化了,出现一个新的界面,实质上这个页面包含了许许多多的内容,这些内容也不是一次性就加载完成的,实质上是执行了好多次请求,一般

C#基础入门 四

C#基础入门 四 方法参数 值参数:不附加任何修饰符: 输出参数:以out修饰符声明,可以返回一个或多个给调用者: 如果想要一个方法返回多个值,可以用输出参数来处理,输出参数由out关键字标识,如static void Car(out int x,out int y,int z){},与引用参数区别在于:调用方法前无需对输出参数进行初始化,输出型参数用于传递方法返回的数值. 计算矩形面积的方法:(图8) static void rectangle(int length,int width, ou

Python基础知识(四)

Python基础知识(四) 一丶列表 定义格式: 是一个容器,由 [ ]表示,元素与元素之间用逗号隔开. 如:name=["张三","李四"] 作用: 存储任意类型的数据 (32位机器能存5亿多,64为机器存储更多) 特点: 可变 (增,删,改,查) 默认从左到右 ,从0开始 . 有序(索引,切片,步长) 操作: 增 , 删 , 改 ,查 ,索引,切片,步长 ?? #列表的两种定义方式 name=["香蕉","西瓜",&quo

Python基础入门 (一)

一.关于版本的选择 Should i use Python 2 or Python 3 for my development activity?转载自Python官网 Short version: Python 2.x is legacy, Python 3.x is the present and future of the language Python 3.0 was released in 2008. The final 2.x version 2.7 release came out

Python基础入门教程,Python学习路线图

给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大家能真正打开python的大门,进入这个领域.现在互联网巨头,都已经转投到人工智能领域,而人工智能最好的编程语言就是python,未来前景显而易见.黑马程序员是国内最早开设人工智能的机构. 一.首先先推荐一个教程 8天深入理解python教程:http://pan.baidu.com/s/1kVNm

Python怎么样入门?Python基础入门教程

给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大家能真正打开python的大门,进入这个领域.现在互联网巨头,都已经转投到人工智能领域,而人工智能最好的编程语言就是python,未来前景显而易见.黑马程序员是国内最早开设人工智能的机构. 一.首先先推荐一个教程 8天深入理解python教程:http://pan.baidu.com/s/1kVNm

Python基础入门一文通 | Python2 与Python3及VSCode下载和安装、PyCharm激活与安装、Python在线IDE、Python视频教程 &#625877;

原文: http://blog.gqylpy.com/gqy/481 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

python 基础入门

Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单. 2.易于阅读:Python代码定义的更清晰. 3.易于维护:Python的成功在于它的源代码是相当容易维护的. 4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好. 5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断. 6.可移植:基于其开放源代码的特性,Py