匿名函数
匿名是因为不需要以标准的方式来声明,如使用def语句
lambda [arg1,[ar2,...argN]:expression
#定义匿名函数
In [1]: a = lambda x,y: x+y
In [2]: ?a
Signature: a(x, y)
Docstring: <no docstring>
File: ~/<ipython-input-1-07b4826b0230>
Type: function
#直接返回结果
In [3]: a(2,4)
Out[3]: 6
正则表达式
search()方法,搜索123,只要"abc123milk"中存在,就返回结果
match()方法,默认是从开头查找,
In [4]: import re
In [5]: re.search("123","abc123milk")
Out[5]: <_sre.SRE_Match object; span=(3, 6), match='123'>
In [6]: re.search("123","abc1c3milk")
In [7]: re.search("1.3","abc1c3milk")
Out[7]: <_sre.SRE_Match object; span=(3, 6), match='1c3'>
In [8]: re.match("1.3","abc1c3milk")
In [9]: re.match("[0-9]{3}1.3","abc1c3milk")
In [10]: re.match("[a-w]{3}1.3","abc1c3milk")
Out[10]: <_sre.SRE_Match object; span=(0, 6), match='abc1c3'>
match提取内容
提取内容:使用小括号将内容括起来, [a-w]{3}(1.3)
取出内容
groups()取得结果,得到无组
In [11]: re.match("[a-w]{3}(1.3)","abc1c3milk").groups()
Out[11]: ('1c3',)
group(0)取出整个正则匹配到的结果
group(1)取出想要取出第一个小括号中的结果
group(2)取出想要取出第二个小括号中的结果
In [12]: re.match("[a-w]{3}(1.3)","abc1c3milk").group(0)
Out[12]: 'abc1c3'
In [13]: re.match("[a-w]{3}(1.3)","abc1c3milk").group(1)
Out[13]: '1c3'
In [17]: re.match("[a-w]{3}(1.3)([a-z]{4})","abc1c3milk").group(2)
Out[17]: 'milk'
模块的导入导出
from module import name [,name2,nam3,...nameN]
import as
查找模块顺序
In [18]: import sys
In [19]: sys.path
Out[19]:
['',
'/usr/lib64/python36.zip',
'/usr/lib64/python3.6',
'/usr/lib64/python3.6/lib-dynload',
'/usr/local/lib64/python3.6/site-packages',
'/usr/local/lib/python3.6/site-packages',
'/usr/lib64/python3.6/site-packages',
'/usr/lib/python3.6/site-packages',
'/usr/local/lib/python3.6/site-packages/IPython/extensions',
'/root/.ipython']
'',代表先查找当前目录,然后向下查找
导入方法及别名
In [20]: from re import search
In [21]: from re import search as sss
In [22]: sss("abc","123abcmilk")
Out[22]: <_sre.SRE_Match object; span=(3, 6), match='abc'>
装饰器
装饰器本质上是一个Python函数
装饰器的返回值也是一个函数对象
它可以让其他函数在不需要做任何代码变动的前提下增加额外功能
简单装饰器
def debug(func):
def wrapper():
print("[DEBUG]: enter {}()".format(func.__name__))
return func()
return wrapper
def say_hello():
print("hello!")
say_hello = debug(say_hello) # 添加功能并保持原函数名不变
装饰器语法糖
def debug(func):
def wrapper():
print("[DEBUG]: enter {}()".format(func.__name__))
return func()
return wrapper
@debug
def say_hello():
print("hello!")
初级装饰器传参
def debug(func):
def wrapper(*args, **kwargs): # 指定宇宙无敌参数
print("[DEBUG]: enter {}()".format(func.__name__))
print('Prepare and say...',)
return func(*args, **kwargs)
return wrapper # 返回
@debug
def say(something):
print("hello {}!".format(something))
闭包的含义
在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包
闭包可以用来在一个函数与一组"私有"变量之间创建关联关系.在给定函数被多次调用的过程中,这些私有变量能够保持其持久性.
这种叫做嵌套函数
def func1():
print('func1')
def func2():
print('func2')
func2()
func1()
此时对于当前文件,a
为全局变量,b
为局部变量
a=1
def func3():
print('func3')
b=2
func3()
print(b)
一个函数的返回值,也可以是一个函数的引用
def func1():
print('func1')
def func2():
print('func2')
return func2
f1 = func1()
print(f1)
print(type(f1))
f1()
输出结果如下
func1
<function func1.<locals>.func2 at 0x000002B933B84CC0>
<class 'function'>
func2
如果我们有一个函数,让它可以任意的计算一个值的任意次幂等
def wapper(exponent):
def exponent_of(base):
return base ** exponent
return exponent_of
#计算一个数字的平方
square = wapper(2)
#计算2,3,4的平方
print(square(2))
print(square(3))
print(square(4))
下面的执行结果就很像,通过wapper(2)
持久化地获取到一个工具,此工具可以将任意数字的平方返回,这种写法就叫做闭包的写法
执行结果
4
9
16
装饰器
装饰器的使用,在装饰的那一刻,在程序加载py文件那一时刻,已经运行了装饰函数
简单装饰器使用
def decorator(func):
print(func.__name__)
def inner(x,y):
print("参数列表是:",x,y)
return func(x,y)
return inner
@decorator
def func1(a,b):
print("函数1被运行",a,b)
return a+b
result = func1(1,2)
print(result)
输出结果
func1
参数列表是: 1 2
函数1被运行 1 2
3
传递参数的装饰器
在定义函数时,*args
表示接收任意数量的位置参数并将它们打包成元组
在调用函数时,*args
表示将一个可迭代对象(如列表或元组)解包为多个位置参数传递给函数
def decorator(func):
print(func.__name__)
def inner(*args):
print("参数列表是:",args)
return func(*args)
return inner
@decorator
def func1(*args):
# print(args)
print("函数1被运行",args)
return sum(args)
mylist=[1,2,3,4,5]
result = func1(*mylist)
print(result)
执行结果如下,不论args传递的参数数量,都可获取参数和
func1
参数列表是: (1, 2, 3, 4, 5)
函数1被运行 (1, 2, 3, 4, 5)
15
传递字典参数的装饰器
定义时,**kwargs
用于接收不定数量的关键字参数,形成字典
调用时,**kwargs
用于解包字典,将其键值对作为关键字参数传递给函数
提示: 此处仅为在函数中使用多个**kwargs
参数调用,一般要合并多个字典,避免字典key冲突
def decorator(func):
print(func.__name__)
def inner(*args,**kwargs):
print("参数列表是:",args,kwargs.values())
return func(*args,**kwargs)
return inner
@decorator
def func1(*args,**kwargs):
print("函数1被运行",args,kwargs)
return sum(args) + sum(kwargs.values())
mylist=[1,2,3,4,5]
mydict={"add1":6,"add2":7,"add3":8}
mydict2={"add4":9,"add5":10}
# result = func1(*mylist,**mydict,**mydict2)
merged_dict= {**mydict,**mydict2}
result = func1(*mylist,**merged_dict)
print(result)
执行结果如下:
func1
参数列表是: (1, 2, 3, 4, 5) dict_values([6, 7, 8, 9, 10])
函数1被运行 (1, 2, 3, 4, 5) {'add1': 6, 'add2': 7, 'add3': 8, 'add4': 9, 'add5': 10}
55
对装饰器传参
def decorator(type):
def wapper(func):
print(func.__name__)
def inner(*args,**kwargs):
print("参数列表是:",args,kwargs.values())
if type == "post":
print("post请求")
return func(*args,**kwargs)
elif type == "get":
print("get请求")
return "get请求无权限计算,请发送post请求"
return inner
return wapper
@decorator("post")
def func1(*args,**kwargs):
print("函数1被运行",args,kwargs)
return sum(args) + sum(kwargs.values())
mylist=[1,2,3,4,5]
result = func1(*mylist)
print(result)
@decorator("get")
def func2(*args,**kwargs):
print("函数1被运行",args,kwargs)
return sum(args) + sum(kwargs.values())
result = func2(*mylist)
print(result)
执行结果
func1
参数列表是: (1, 2, 3, 4, 5) dict_values([])
post请求
函数1被运行 (1, 2, 3, 4, 5) {}
15
func2
参数列表是: (1, 2, 3, 4, 5) dict_values([])
get请求
get请求无权限计算,请发送post请求