一、函数是python中使用最高的对象。
函数定义的简单规则 :
1、用def定义,接着是函数名和参数和冒号,格式:
2、函数内部代码块需要缩进
3、使用return返回函数值,默认返回值是None
格式:
def 函数名(参数) :
代码块
return #可有可无,也可以在代码块任意位置使用
二、函数中return的使用:
return可以在函数的任何地方使用,直接跳出当前函数,忽略其它代码块。
# return也可以不带参数,返回的是None
# 也可以没有return,返回的也是None
# return也可以返回字典,列表,函数(装饰器就是返回的函数代码块)。
1、可以跳出if,while,for等语句
def use_return(): i = 0 while True: i += 1 for j in range(i): print(j, end='') if j == 5: return j print() use_return() # 运行结果:i等于5时会直接结束函数 """ 0 01 012 0123 01234 012345 """
上面的函数改变一下调用方式:
print(use_return()) # 最后一行0123455,最后一个5就是返回函数的值,也就是j的值。尝试把最后一个5换行。
2、调用函数:
使用函数名和括号调用函数。不带括号调用的是函数体,相当于起个别名。
# 使用上面的例子 # 调用1 if use_return() == 5: print(5) # 调用2 for i in range(0,use_return()): print(i) #不能使用,因为use_return()返回的是数字,但不是int型,必须先赋值给变量,然后调用变量 v = use_return() for i in range(0,v): print(i) # 调用3 s = use_return() print(s) # 调用函数体 func = use_return print(func) # 打印的是use_return函数所在的内存地址 func() # 运行use_return函数
三、函数变量与外部变量的关系:
1、可更改(mutable)与不可更改(immutable)对象
strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
2、不可变类型:
# 变量赋值 a=5 后再赋值 a=10,不是a的值变了,变量相当于指针,只是指针指向变了,5本身没有改变,指向的10是一个新地址,而不是把5变成10.
# 不可变类型传入函数内,函数修改后,不会影响外部变量值。
3、可变类型:
# 变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 ,虽然la指向的内存地址没变,但是内部的值变了,所以是可变的。
# 可变类型传入函数内的是la的本身,所以,在函数内修改la[2],也改变了函数外的la[2]
def modify_la2(la_value): la_value[2] = 99999 la = [0, 1, 2, 3, 4, 5] modify_la2(la) print('la = %s' % la) # 运行结果 la = [0, 1, 99999, 3, 4, 5]
4、函数变量寻找由最内层向外层找
def modify_la2(): la[2] = 99999 la = [0, 1, 2, 3, 4, 5] modify_la2() print('la = %s' % la) #modify_la2找不到la,则找函数外面的la,la必须写在调用的modify_la2()前面
五、函数的参数传递形式:
1、必需参数:调用函数时,按变量的顺序写对应的值
2、关键字参数:调用函数时,使用变量名赋值,变量=值
3、默认参数:定义函数时参数带值,def user(name, age=20): ,age=20就是默认参数
4、不定长参数:
# (*args)不定长参数,只能接收必须参数,把参数转换成list存储
#(**kwargs)不定长参数,只能接收关键字参数,并把参数转换成词典存储
5、参数存在的顺序:
必需参数,默认参数,*args, **kwargs
def modify_la2(name, age=20, *args, **kwargs):
#age默认参数不起作用,必须被赋值。
def modify_la2(name, age=20, *args, **kwargs): print('name=', name) print('age=', age) print('args=', args) print('kwargs=', kwargs) modify_la2('dage', 'men',175, skill='pain', father='Adw') # 运行结果 name= dage age= men args= (175,) kwargs= {'father': 'Adw', 'skill': 'pain'}
六、匿名函数lambda
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
格式:
lambda [arg1 [,arg2,.....argn]]:expression
#梯形面积公式: resault = lambda x1, x2, h: (x1 + x2)*h/2 print(resault(1, 2, 4))