python 基本函数与复杂函数(闭包,装饰器)
一、基本函数
1、定义基本函数
def sum(形参): """ 函数说明 """ 函数体 #return 返回值 sum(实参)
2、定义衍生函数
python匿名函数
f=lambda x,n:x ** n # lambda 参数1,参数2:返回值
print(f(2,3))
3、函数参数与传参
(1)设置默认参数
def addoneoradd(a,b=1): """ +1 or + """ return a+b addoneoradd(1) addoneoradd(1,2)
4、内置函数
#反射相关 hasattr(object,name)#判断对象object是否包含名为name的特性,返回True或者False hasattr(list, 'append') getattr(object,name)# setattr(object,name,value) # 根据字符串的形式 , 动态的设置一个成员(在内存中) delattr (object,name)
#基础数据类型相关 数据转换 bool,int,float,complex(2,3),bin(整转二),oct(整转八),hex(整转十六),list(转list兼定义),tuple(转tuple兼定义),dict(转dict兼定义),set(转set兼定义),frozenset(转frozenset兼定义),ord(字母转ASCII),chr(ascii转字母),repr(返回对象的string格式),len(长度),sorted(无序转有序),enumerate(加序列号) 数据运算 abs(求绝对值),divmod(除,余数),round(num,小数点数,#四舍五入),pow(num,次方数,#求幂),sum(求和),max(最大值),min() 其它 all(所有真判定真),any(一有真判定真),zip(keys列表,values列表,#返回字典),filter(函数映射,列表,返回经函数处理后的可迭代对象,特点会减少),map(函数映射,列表,返回经函数处理后的可迭代对象,特点数目不变)
#面向对象相关 type(判定类型),classmethod(转为类方法),staticmethod(转静态方法),property(方法转变量),super(多继承重要方法),issubclass(判定子类),isinstance(obj,实例,判定实例),
#其它
#字符串代码
eval(字符串转可执行代码并执行返回),exec(字符串转可执行代码并执行不返回),compile(字符串source和代码文件filename选一,model编译代码的种类,可以指定为 ‘exec’,’eval’,’single’)
#当source中包含流程语句时,model应指定为‘exec’;当source中只包含一个简单的求值表达式,model应指定为‘eval’;当source中包含了交互式命令语句,model应指定为'single'。
#文件操作
open(文件名,模式,字符编码encoding,#打开一个文件对象,手动关闭),with open(文件名,模式,字符编码encoding,#打开一个文件对象,自动关闭),read(一次性读取,全部加载到内存),readlines(逐行读取,一行行读取到内存),write(写文件内容),tell(返回光标现在位置),seek(移动数,1为当前2为末尾,光标移动指定数目)
二、复杂函数
函数内存在其他函数的调用或定义就是复杂函数
1、闭包
(1)闭包定义:封装了数据和函数的函数,其实就是两个函数的嵌套,并且具备特征:一个内层函数调用了外层函数的"变量"
(2)闭包的目的:为了数据安全,函数内的数据是以局部变量存在
def out(k):
      b = 1
  def in(x):
    print(k + b)
   return in
t = out(2)
3
2、装饰器
python的装饰器本质上是一个Python函数,作用是在其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器就是一个用来返回函数的函数。
#带函数参数装饰器,初级装饰器
def debug(func):
    def wrapper(*args, **kwargs):  # 形参
        print (f'Prepare and do ') #先
        return func(*args, **kwargs)
    return wrapper  # 返回
#所装饰的函数
@debug
def say(something):
    print "hello {}!".format(something) #后
#自带参数装饰器,只需要再原来的装饰器上加一层函数,接收装饰器的参数
#第一层传装饰器参数,第二层传函数,第三层传函数参数,依次返回函数结果,第三层函数,第二层函数
def set_lever(lever_num):
    def wrapper(func):
        def inner(*args, **kwargs):
            if lever_num == 1:
                print("已经获得1的权限")
            elif lever_num == 2:
                print("已经获得2的权限")
            ret = func(*args, **kwargs)
            return ret
        return inner
    return wrapper
#装饰
@set_lever(1)
def text1():
    # print("hi")
    return "hi , 已经拥有1权限了"
#装饰器经过函数的传递之后已经改变了元信息,这是装饰器的缺点
#能保留元信息的装饰器
import functools
def node(func):
    @functools.wraps(func)
    def wrapped(*args, **kwargs):
        print "print from node"
    return wrapped
@node
def func():
        print "print from func"
print func.__name__
func()
#装饰器综合应用,日志信息
def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print "[{level}]: enter function {func}()".format(
                level=level,
                func=func.__name__)
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper
@logging(level='INFO')
def say(something):
    print "say {}!".format(something)
# 如果没有使用@语法,等同于
# say = logging(level='INFO')(say)
@logging(level='DEBUG')
def do(something):
    print "do {}...".format(something)
if __name__ == '__main__':
    say('hello')
    do("my work")
                    
                
                
            
        
浙公网安备 33010602011771号