七、函数
函数格式:
def sub(x,y):
return x-y
print sub(3,2) 控制台输出1
关键字参数,位置参数:
def test(x , y , z=10):
print x, y ,z
test(1,2,3) 控制台输出1,2,3
test(1,2) 控制台输出1,2,10
test(x=1,z=3,y=2) 控制台输出1,2,3
定义的时候,* 参数,将位置实参,装配成元组
def test(x, y, z, *args):
print x, y, z, args
print test(1,2,3,4,5) 控制台输出1 2 3 (4, 5)
定义的时候, ** 参数,将关键字实参,装配成字典
def test(x, y, z, **keys):
print x, y, z, keys
print test(1, 2, 3, a=4, b=5) 控制台输出1 2 3 {'a': 4, 'b': 5}
调用的时候,*可以将元组或列表,打散成位置参数
调用的时候,**可以将字典,打散成关键字参数
def test(x, y, z):
print x, y, z
x = [1, 2, 3]
test(*x) 控制台输出1 2 3
y = {"x":"1","y":"2","z":"3"}
test(**y) 控制台输出1 2 3
i = [0 , 1 , 2]
强引用 test( i ) 正常传参, 里面可以修改i
弱引用 test( list(i) ) 里面修改不了i
# 可变对象(list dict) number = [1,2,3] def getNum(number): number.append(4) print(number) # [1, 2, 3, 4] getNum(number) print(number) # [1, 2, 3, 4] # 不可变对象(string tuple int float) def PName(str): str+="aaa" str = 'zhangsan' PName(str) print(str) # zhangsan
变量作用域
i = 10 #全局变量 def visit_i(): print i #控制台输出10 def change_i(): global i #默认不许修改全局变量,除非如此声明 i += 1 print i #控制台输出11
函数不支持重载,同名方法会覆盖前面定义的方法
函数的嵌套
def test(): def test1(): print "hello" return test1 a = test() a() # 相当于调用了test1()
函数的闭包(内层函数可以获得父层函数的参数)
def test0(x): def test1(y): print x + y return test1 c = 10 obj = test0(c) c = 100 obj(20) #控制台输出30
装饰器(相当于拦截器,常用于添加日志、权限判断)
无参数(是否需要写return res 取决于delete 是否return )
def log(myfunction): def wrap(*args,**kwargs): print "添加日志开始1" res = myfunction(*args,**kwargs) print "添加日志结束2" return res return wrap @log def delete(): print "删除操作" delete() # 添加日志开始1 # 删除操作 # 添加日志结束2
def log(i): def wrap1(func): def wrap2(*args,**kwargs): print "日志开始" if i>0: print "拥有权限" func(*args, **kwargs) else: print "权限不够" print "日志结束" return wrap2 return wrap1 @log(1) def delete(): print "删除操作" delete() # 日志开始 # 拥有权限 # 删除操作 # 日志结束
迭代器
import itertools x = range(1,10) com1 = itertools.combinations(x , 3) #排列 for i in com1: print i # (1, 2, 3) # (1, 2, 4) # (1, 2, 5) # (1, 2, 6) # (1, 2, 7) # (1, 2, 8) # (1, 2, 9) # (1, 3, 4) # (1, 3, 5) # ...... # (6, 7, 8) # (6, 7, 9) # (6, 8, 9) # (7, 8, 9) com2 = itertools.permutations(x , 3) #组合 for i in com2: print i y = ['a','b','c'] com3 = itertools.product(x , y) #笛卡尔积 for i in com3: print i