python 函数,了解一下

定义一个函数

def say():
    print('hello')

say() #  hello   执行这个函数

s = say()
print(s)  #  把函数的执行结果给 s      hello

print(say) #  <function say at 0x101bcae18>    打印函数内存地址

s = say
s()  #把函数的内存地址给s       hello



print(hex(id(a))) #0x103dfbb20  变量的地址转换为16进制

这就需要了解一下变量定义了
变量:
只是一个代号,代表某个东西,
可能是任何数据,str、list、dict、tuple、甚至是内存地址

计算机是不会骗人的
只会按照约定好的规则去执行
print 就是打印,接收到就去打印
s() 就是个方法,接收到就去执行

执行的过程就是=》拿着这个方法的内存地址=》到内存中找到该方法=》然后执行

函数的参数

def test(*agrs,**kwargs):
    print(agrs)
    print(kwargs)

test('1',name='xiaoming')

默认参数:为非必输 默认连接数据库端口
可变参数:使用*args 可以传多个值,放到tuple中
关键字参数:**keywargs 可传kv 形式的参数 转换为dict


抛砖引玉
参数传递的时候还跟位置有关,一般情况按约定好的传
传递参数的时候还可以指定变量的名字

作用域

就近原则
变量同名,从里面外面找

可以定义全局变量,慎用

返回值

可以返回任意的东西,函数内存地址也可以

装饰器

#高阶函数
def one():
    print('this is boy')


def two(f):
    print('stady...')
    return f


one  = two(one)
one()

'''
函数中可以调用其他函数
'''

# 嵌套函数
def a1():
    print('a1...')
    def a2():
        print('a2...')
    a2()  # 调用a2

a1()

def timer(f):  #传入一个函数的内存地址
    def handler(*args,**kwargs):  # 带参数
        start_time = time.time()
        f(*args,**kwargs)   #执行传入的函数
        # return f()  能够返回值
        stop_time = time.time()
        print('handler... %s' %(stop_time - start_time))
    return handler  #返回 handler 内存地址

x = timer(one)
'''
相当于在one方法上面
加@timer
@timer() 可以带参数  该参数 传递到timer 
就是在handler 外面加一层 判断输入的参数
在外层 接收参数 

'''
x() #执行handler

@timer
def decorator2():
    print('decorator2...')
decorator2()

'''
有点像java中的反射机制吧
本人拙见
操作的就是handler的地址
把该地址传给其他的方法,然后使用该地址调用handler方法

形式上,就外观看起来像注解,实现的机制下回分解
'''

装饰器

#装饰器
#  @元类

class tracer:
    def __init__(self,func):
        self.calls = 0
        self.func = func
        print('tracer init')
    def __call__(self, *args, **kwargs):
        self.calls += 1  #2
        print('call start')
        print('call %s to %s' %(self.calls,self.func.__name__))
        print(*args , '-- args')
        self.func(*args)  #3  5
        print('call end --')
    def __repr__(self):
        pass
        # to string

@tracer
def spam(a,b,c):
    print(a,b,c)   #4

if __name__ == '__main__':
    spam(1,2,3)  #1  6
    spam('a','s','d')


'''
spam函数是通过tracer装饰器执行的
调用spam时触发的时类中的__call__方法
然后委托原始的包裹的函数
*args 就是传入的参数
可以用来统计函数的执行时间
'''

'''
tracer init
call start
call 1 to spam
1 2 3 -- args
1 2 3
call end --
call start
call 2 to spam
a s d -- args
a s d
call end --

'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值