Python学习之路-装饰器&生成器&正则表达式

装饰器


通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能。

不改变函数的源代码、调用方式、返回值等,给函数增加新功能。

经典案例:登录装饰器,

def login_decorator(func):

    def inner():
        if USER_TEMP["status"] == False:
            print("\033[31;1m用户未登录,请先登录\033[0m")
            login_atm()
        func()
    return inner
 
 @login_decorator
 def withdrawals():
     print("取款函数。。。。")

说白了,给函数增加新功能,就是把这个函数当作参数传到另一个函数里面。

生成器


通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

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

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。

如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

如果生成器中没有更过元素时,调用next(g)会抛出StopIteration的错误

所以,我们创建了一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误:

>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
...
0
1
4
9
16
25
36
49
64
81

正则表达式


re模块。常用正则表达式符号:

‘.‘     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行

‘^‘     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)

‘$‘     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以

‘*‘     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为[‘abb‘‘ab‘‘a‘]

‘+‘     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果[‘ab‘‘abb‘]

‘?‘     匹配前一个字符1次或0

‘{m}‘   匹配前一个字符m次

‘{n,m}‘ 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果‘abb‘‘ab‘‘abb‘]

‘|‘     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果‘ABC‘

‘(...)‘ 分组匹配,re.search("(abc){2}a(123|456)c""abcabca456c").group() 结果 abcabca456c

‘\A‘    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的

‘\Z‘    匹配字符结尾,同$

‘\d‘    匹配数字0-9

‘\D‘    匹配非数字

‘\w‘    匹配[A-Za-z0-9]

‘\W‘    匹配非[A-Za-z0-9]

‘s‘     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 ‘\t‘

常用语法函数:

re.match 从头开始匹配

re.search 匹配包含

re.findall 把所有匹配到的字符放到以列表中的元素返回

re.splitall 以匹配到的字符当做列表分隔符

re.sub      匹配字符并替换

Python学习之路-装饰器&生成器&正则表达式

时间: 2024-10-24 12:08:26

Python学习之路-装饰器&生成器&正则表达式的相关文章

python学习笔记(五):装饰器、生成器、内置函数、json

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰

python学习笔记:装饰器2

python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 直接举例: import datetime def func_name(func):#定义一个装饰函数,接受一个函数对象作为参数(也就是被装饰的函数) def wrap():#包装函数 print("Function name:%s"%(func.__name__)) func() #执行目标函数 return wrap #返回包装函数 @func_name #等于 func_time = func_n

Python自学之路——装饰器的秘密

先不管装饰器到底是个什么东东,让我们来聊一聊函数的几个点吧.我们知道,在python里,一切皆是对象,那么函数呢,当然也是对象,而且人家还是一级对象呐.既然是对象,那它就可以被赋值给变量,反之,通过变量也能调用函数.好,需特别注意的点来了,函数调用一定是函数名 + (),如果没有这个括号,函数是不会被调用的,它只能是表示内存里的一个地址,看下面 1 def happy(): 2 print('be happy') 3 print (happy) #并没有调用happy函数,只是打印了happy的

Python学习笔记012——装饰器

1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函数,函数装饰类,类装饰函数,类装饰类(两者不是一一对应关系,其实我也不知道他们之间是什么样的对应关系) 一般而言,主要应用的是函数装饰函数 1.3 装饰器本质 本质上,decorator就是一个返回函数的高阶函数. 在面向对象(OOP)的设计模式中,decorator被称为装饰模式.OOP

python学习笔记之装饰器(语法糖)

什么是装饰器 装饰器的知识点铺垫(函数即变量,高阶函数,嵌套函数) 不带参数的装饰器示例 带参数的装饰器示例 作业 一.什么是装饰器 本质上,装饰器就是返回一个函数的高阶函数.装饰器就是一个函数 装饰器的原则: 不修改被装饰对象的源代码 不修改被装饰对象的调用方式 二.装饰器涉及的知识点 函数即变量 高阶函数 嵌套函数 函数即变量: 在python中,一个变量首先被定义,分配内存空间,然后再使用. 以x=1,这个简单的赋值语句为例子.首先在内存中分配一个空间,x指向该内存空间,该内存空间内存入"

从零开始的Python学习Episode 11——装饰器

装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 1 import time 2 3 def show_time(f): 4 def inner(): 5 start = time.time() 6 f() 7 end = time.time() 8 print('time: %s'%(end-start)) 9 return inner 10 11 @show_time 12 def fun1(): 13 p

Python学习之路--迭代器,生成器

迭代器 # 双下方法# print([1].__add__([2]))# print([1]+[2]) # 迭代器# l = [1,2,3]# 索引# 循环 for# for i in l:# i## for k in dic:# pass # list# dic# str# set# tuple# f = open()# range()# enumerate# print(dir([])) #告诉我列表拥有的所有方法# ret = set(dir([]))&set(dir({}))&se

python学习笔记之——装饰器及对象

1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工作的.        在一些程序中,我们可以动态地去调用函数,如果我们知道模块的名称(字符串)的时候,我们可以很方便的使用动态调用. __import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals()

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de