函数参数传递可改变可改变对象(列表等),不可改变不可改变的对象(数字,字符串等)。
类似于C语言:不可变对象通过值传递不能改变原对象,可变对象通过指针传递可改变原对象。
返回值可以是任何类型包括函数。
参数类型说明:
1.基于位置参数从左往右匹配,eg:func(value)--调用者 def func(name)--函数
2.关键字参数通过name=value参数名匹配,eg:func(name=value)---调用者 def func(name=value)--函数(调用未传递作为默认值)
3.默认参数为没有传入值的参数定义参数值---(name=value)函数定义中
4.可变参数收集任意多基于位置或者关键字的参数,以*开头:
def func(*name) def func(**name)--(前者收集元组,后者收集字典)的位置参数
def func(*args,name),def func(*,name=value)-参数在调用中必须按照关键字传递
5.可变参数解包传递任意多基于位置或者关键字的参数,以*开头:
func(*A)func(**dict)---调用者(前者name,后者name/value)
6.keyword-only参数必须按照名称传递name=value
参数使用说明:
1.keyword-only参数必须在*args或者*后边,不能在**dict后边
2.函数定义参数位置顺序:
任何位置参数,任何默认参数(name=value),*name或者*(如果有),name或者name=value keyword-only,**name
3.函数调用参数位置顺序:
任何位置参数(value),关键字参数(name=value)和*A形式的组合,**dict
函数也是一种对象,dir(func)查看自己的内置属性及实现自定义属性
函数内部变量函数退出不可再访问,函数属性类似与全局变量,可以在任何地方访问
def func(a:1,b:2,c:11)->int:#函数参数及其返回值类型注解
x=11
print(a,b,c)
print(func.__name__,func.copy)
return 0
def func1():
print(func.__annotations__)#func函数的注解信息
print(func.__name__,func.copy)
return
print(dir(func))#函数也是对象,有内置属性
func.copy="NO"#给func函数添加额外自定义属性
func(1,2,3);func1()
D:\py\venv\Scripts\python.exe D:/py/func.py
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
1 2 3
func NO
{'a': 1, 'b': 2, 'c': 11, 'return': <class 'int'>}
func NO
Process finished with exit code 0
实例1:
def func(a,b=200,c=300):#b=200,c=300是默认参数,a调用必须有值。**位置参数必须在默认前边**
print(a,b,c)
return None
func(1,2,3)#位置传递,对应从左往右匹配a=1,b=2,c=3
func(b=2,c=3,a=1)#按照关键字参数name=value方式传递,从左往右规则忽略
func(1,c=3,b=2)#基于位置参数和关键字参数混合使用,先按照从左往右匹配规则再按关键字匹配,不可以func(3,b=2,a=1)
func(1)#传递1给a,b和c使用默认参数.或者func(a=1)
func(1,2)#a和b传递值,c使用默认值.或者func(1,b=2)或者func(b=2,a=1)。不可以func(a=1,2),**位置参数必须在关键字参数前边**
func(1,c=3)#a和c传递值,b使用默认值
D:\py\venv\Scripts\python.exe D:/py/func.py
1 2 3
1 2 3
1 2 3
1 200 300
1 2 300
1 200 3
实例2:
def func(*args):#收集任意参数对象【数字,字符串,列表,元组,字典】到元组中Tuple
print(args)#得到元组,遍历元组
for x in args:print(x,end=" ")#元组遍历
return None
func(1,[2,3],(4,5),"six",{1:2,3:4})
D:\py\venv\Scripts\python.exe D:/py/func.py
(1, [2, 3], (4, 5), 'six', {1: 2, 3: 4})
1 [2, 3] (4, 5) six {1: 2, 3: 4}
Process finished with exit code 0
实例3:
def func(**args):#收集关键字参数到字典中Dict,只对关键字参数有效
print(args)
return None
func(a=1,b=2)
D:\py\venv\Scripts\python.exe D:/py/func.py
{'a': 1, 'b': 2}
Process finished with exit code 0
实例4:
def func(a,*tuple,**dict):#收集参数到位置参数,元组,字典
print(a,tuple,dict)
func(1,2,3,d=3,d1=4)
D:\py\venv\Scripts\python.exe D:/py/func.py
1 (2, 3) {'d': 3, 'd1': 4}
Process finished with exit code 0
实例5:
def func(a,b,c,d,e):
print(a,b,c,d,e)
return None
Tuple=(1,2)+(3,4,5)
func(*Tuple)#解析参数的集合--元组,与函数定义用法相反
Dict={"a":1,"b":2,"c":3,"d":4,"e":5}
func( **Dict)#解析参数的集合--字典,与函数定义用法相反
a=1
Tuple=(2,)
Dict={"c":3,"d":4,"e":5}
func(1,*Tuple,**Dict)#混合使用(位置参数-*(元组),**(字典)),但解析出来要遵守函数定义的位置顺序a b c d e
D:\py\venv\Scripts\python.exe D:/py/func.py
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
Process finished with exit code 0
实例6:
def func(a,*b,c):#a按照关键字或者位置传递,b收集任意额外的位置参数,c必须按照关键字参数传递 keyword-only参数
print(a,b,c)
return
func(1,2,3,c=4)#c必须关键字传递,不可以func(1,2,3,4)-【TypeError: func() missing 1 required keyword-only argument: 'c'】
def func(a,*,b,c):#a按照关键字或者位置传递,*表示不接受参数列表,b、c必须按照关键字参数传递 keyword-only参数
print(a,b,c)
return
func(1,c=3,b=2)
D:\py\venv\Scripts\python.exe D:/py/func.py
1 (2, 3) 4
1 2 3
Process finished with exit code 0
实例7:
def func(a,*b,c=5,**d):#c必须是keyword-only参数:name =value,c=5是默认参数值
print(a,b,c,d)
x=(2,3,4)
y={"m":1,"n":2}
func(1,*x,**y)#c使用默认参数值
func(1,*x,c=3,**y)#正常顺序解析
func(1,c=3,*x,**y)#c传递时可在*b前边,因为设定为关键字传递按照名称去匹配了
func(1,*x,**dict(m=1,n=2,c=3))#c在字典中被解析出来为c=3再去传递
D:\py\venv\Scripts\python.exe D:/py/func.py
1 (2, 3, 4) 5 {'m': 1, 'n': 2}
1 (2, 3, 4) 3 {'m': 1, 'n': 2}
1 (2, 3, 4) 3 {'m': 1, 'n': 2}
1 (2, 3, 4) 3 {'m': 1, 'n': 2}
Process finished with exit code 0
实例8:
#递归求和---->值累加算法
#return 默认返回None 不加0报错: unsupported operand type(s) for +: 'int' and 'NoneType'
def sum(x):
if len(x)==1: #或者if len(x)==0:return 0---->列表为空再加0结束 【这不return必须有值不能默认为None类型不对】
return x[0]
else:
return x[0]+sum(x[1:])
b=sum([1,2])
print(b)
#c语言
#int func(int i){
# if(i==0) return 0;
# else return i+func(i-1);
#}
#int main(){int sum =func(5);print("%d\n",sum);return 0;}
D:\py\venv\Scripts\python.exe D:/py/func.py
3
Process finished with exit code 0