python函数及参数理解

函数参数传递可改变可改变对象(列表等),不可改变不可改变的对象(数字,字符串等)。
类似于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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值