python学习-函数
函数
1 函数的定义及调用
定义:
def 函数名(形参):
函数体
return 返回值#可有可无,不填默认返回none
和C++一样,有主函数:(我之前一直还以为没有来着,,,)
调用
函数名(实参)
2 参数的传递
2.1 一般的传递
- 位置参数
没设置默认参数时,按照位置关系一一对应,和C++一样 - 关键字参数
打破位置限制,直呼其名的进行值得传递,和形参也是一对一得关系。
位置参数和关键字参数可以混合使用,不过位置参数必须要放在关键字参数前面。例如:
def func(x,y,z):
...
func(1,z=2,y=3)#正确
func(z=2,2,x=1)#错误
不能为同一个形参重复传值,例如
func(1,z=2,x=3)#错误,当然,其中也包括了没有给y传值产生的错误。
2.2 默认参数
在定义阶段就给行参赋值
- 默认参数必须放在非默认参数后面
- 调用函数时可以不对改新参传值。
- 默认参数类型必须时不可变类型,包括数字、字符串、元组。不要用可变类型哦,不然可能会出现很多难以预知的错误。
- 让参数变成可选,例如:
def func(x,y,z=None):#这样z想传就传了。
2.3 可变长参数 *args
- 不知道会传过来多少参数 *args
- 改形参必须放在参数列表的最后
def func(x,y,z,*args):
print(x,y,z)
print(args)
func(1,2,3,4,5,6,7,8,9)#多余的参数,打包传给args。
#输出:
1 2 3
(4,5,6,7,8,9)
- 实参打散
func(1,2,3,[4,5,6])
#输出
1 2 3
([4,5,6],)#最后会有都好哦,才不是手滑什么的
加上'*'打散,对象为列表,字符串,元组或集合
func(1,2,3,*[4,5,6])
#输出
1 2 3
(4,5,6)
2.4 可变长参数 **kwargs
对字典特化参数!yikei!!!
def func(x,y,z,**kwargs):
print(x,y,z)
print(kwargs)
func(1,2,3,a=4,b=5,c=6) #多余的参数,以字典形式打包给kwargs
#输出
1 2 3
{'a':4,'b':5,'c':6}
字典打散:
func(1,2,3,**{'a':4,'b':5,'c':6})//这样就会输出一样的内容
可变长参数的组合使用
def func(*args,**kwargs):
print(args)
print(kwargs)
func(1,2,3,a=4,b=5,c=6)
#输出
结果不言而喻(犀利)
2 函数体与变量作用域
终于到局部变量和全局变量了,不过类似引用相关内容还要往后
2.1 局部变量
局部变量,仅在函数体内定义和发挥作用
2.2 全局变量
全局变量,函数外部定义的变量全是全局变量。全局变量可以在函数体内直接被使用。
- 除此之外,可以在函数体内定义全局变量
def func(x,y):
...
global z
...
没了。==。啊对,变量不能再它被定义之前使用
3 返回值
- 单个返回值
- 多个返回值,以元组形式
- 可以有多个return,一旦其中一个执行,代表函数运行结束
- 没有return ,返回为None,输出这个返回值的话就是"None"
4 一些特殊的函数
断言函数 assert
格式assert 表达式
表示式结果为false时触发异常,就是程序直接停止运行那种。
匿名函数
1 基本形式
lambda 变量: 函数体
2 常见用法
arr=[(1,2),(2,2),(3,1),(4,5),(6,2)]
arr.sort()#根据第一个元素升序
arr.sort(key=lambda x:x[i])#根据第i个元素升序
arr.sort(key=lambda x:x[0]+x[1],reverse=True)#根据元组内前两个元素之和降序
n=max(arr,key=lambda x:x[1])#同理