python第六篇----函数
1.定义方式
def aa(arg):
do...
2.调用
aa(我是参数)
3.返回值
return result
但是如果一个函数没有定义返回值,但是你使用了一个变量取接受,会的到None
4.pass
很多内置函数的最后一行有一个pass这行代码的意思就是说不做任何操作,用来防止语法错误,比如if a>0:pass
5.注释
三引号后enter就会有类似java中方法注释,会有方法的参数,返回值,作用的说明
6.参数类型
python中的参数类型是无法固定的,所以可以建议使用什么类型的参数,在参数后加:参数类型来做一个软约束
def calculate(a: int, b: int): """ 求两个数字和 @return: 返回和 @param a: @param b: """ return a+b
但是这里的a,b还是没有强制使用int如果使用了两个字符串或者其他类型的也不会报错
就是会有个黄线警告 Expected type 'int', got 'str' instead
7.全局变量和局部变量
python中很有意思,定义的全局变量如果在函数内又定义了一个一样名字的,两者是没有关系的。如果想要在函数内部使用全局变量,需要用global关键字 global arg0把他变的局部可用才能进行修改,当然,agr0依然是一个全局变量
在python中,只有函数可以区分作用域,也就是说不在函数里面定义的都是局部变量
name="aa" def calculate(a: int, b: int): """ 求两个数字和 @return: 返回和 @param a: @param b: """ name="bb" print("全局变量:{},局部变量:{}".format(globals(),locals())) return a+b calculate("1","2")
-------------------------------------------------------------
全局变量:{。。有一些内置的删了。。'name': 'aa', 'calculate': <function calculate at 0x02FE5148>},局部变量:{'a': '1', 'b': '2', 'name': 'bb'}
可以看到,函数内部定义的同名的也还是局部变量,而全局变量里面的name是不被影响的
8.python中可以返回多个值
def calculate(a: int, b: int): return a+b,a-b,a*b,a/b result=calculate(1,2) print("计算结果如下,和:{},差:{},积:{},商:{}".format(result[0],result[1],result[2],result[3]))
print(type(result))
-------------------------------------------------------------------
计算结果如下,和:3,差:-1,积:2,商:0.5
<class 'tuple'>
这样返回的值其本质是一个元组
9.python中参数还可以设置默认值,也叫缺省参数
缺省参数必须放在最后面,并且如果有不定项参数*arg这种的,也要放在最后面
def calculate(a: int, b: int,c="abc"):
调用的时候,传入了就用传入的,没传入就abc
10.多参数 *参数名
这里多出来的参数会以元组的形式保存给c,和多个返回值差不多
def calculate(a: int, b: int,*c):
print(c) return a+b,a-b,a*b,a/b result=calculate(1,2,"adc","apc") print("计算结果如下,和:{},差:{},积:{},商:{}".format(result[0],result[1],result[2],result[3])) ----------------------------------------------------- ('adc', 'apc') 计算结果如下,和:3,差:-1,积:2,商:0.5
10.关键字参数**kwargs
这个参数的意思是函数调用的时候可以用x=3,y=4来进行一个关键字参数的输入,且在函数内部用kwargs进行接收,保存为一个字典的形式{“x”:3,"y":4}
11.可变类型参数和不可变类型参数
不可变数据类型有数字,元组,字符串,布尔类型属于不可变类型,如果参数是这些类型,那么在函数中的操作不会影响到这些数据本身的变化,需要用赋值语句来修改他们的值。
print("数字:") def change_num(nums): nums=12 print(nums) a=1 change_num(a) print(a) print("元组:") b=(1,2,3) def change_tuple(nums): nums=nums+(2,3) print(nums) change_tuple(b) print(b) print("列表:") c=[1,2,3] def change_list(nums): nums.append(4) print(nums) change_list(c) print(c) ---------------------------------------------- 数字: 12 1 元组: (1, 2, 3, 2, 3) (1, 2, 3) 列表: [1, 2, 3, 4] [1, 2, 3, 4]
其实python中的参数调用,传入的是参数对应的内存地址,对于不可变类型参数来说,如果在函数内部进行了修改,会重新划分一块新的值得内存地址给函数内的变量,就和调用时候的参数没有关系了,里面的操作都是对新的地址的操作了
可变类型参数传入后,进行修改,内存地址不变,调用前和函数里都是对一个内存地址的操作,所以即使不进行赋值操作,依然可以进行修改