定义一个函数
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 --
'''