Fork me on GitHub

匿名函数

匿名是因为不需要以标准的方式来声明,如使用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请求
posted on 2019-11-24 11:01  anyux  阅读(134)  评论(0)    收藏  举报