函数


1、函数有3种形式
1)语句形式: foo()
def foo():
  pass
2)表达式形式: 3*foo()
def foo():
  return 1
print(3*foo()) //3
3)当做另一个参数的函数:foo(foo('hehe'))
def foo(a):
  print(a)
foo(foo('hehe'))// hehe hehe


2、函数是第一类对象,即函数可以被当做数据传递
  1)可以被引用
  def bar():
    print('hehe')
  res=bar
  res()
  2)可以当做参数传递
  def bar(a):
    print(a)
  bar(bar(1))


  3)返回值可以是函数
  def foo():
    print('1')
  def bar():
    print(foo)
    return foo
  a=bar()
  a()


4)可以当做容器类型的元素
def foo():
  pass
def bar():
  pass
li=[bar,foo]
li[0]()
li[1]()

3、函数的参数
1)形参和实参定义
2)形参为变量名,实参为变量值,函数调用就是把值绑定在名字上,函数调用完成,接触绑定
3)参数的分类:
  位置参数:按照从左往右的顺序定义参数
  位置形参:必须要传入值
  位置实参:按照位置给参数传值
  关键字参数:按照key=value的形式定义实参不用按照位置给形参传值
需注意:关键字实参必须在位置实参后边
#正确
def foo(a,b,c):
  pass
foo(1,2,c=3)
#错误
def foo(a,b,c):
  pass
foo(1,c=3,2)
2、同一个形参不能重复传值
#错误
def foo(a,b,c):
  pass
foo(1,2,3,b=4)
默认参数:形参定义时赋好的值,实参可以不必给默认形参传值
需注意:1、只在执行定义的时候赋一次值
2、默认参数定义在位置参数右面
#正确
def foo(a,b,c=1):
  pass
#错误
def foo(a,c=1,b):
  pass
3、默认参数通常定义成不可变类型(不定义成列表字典)
可变长参数:1、针对实参在定义时长度不固定的情况,形参可接受任意长度实参:
      2、而实参有位置实参和关键字实参两种方式,形参也有对应的两种方式接受不固定实参,*args,**kwargs。
实例分解:
def foo(x,y,*args):
  pass
foo(1,2,3,4,5)
==>
def foo(x,y,*args)):
  pass
foo(1,2,*(3,4,5))
==>
def foo(1,2,*(3,4,5))):
  pass
foo(1,2,*(3,4,5))
#执行foo时会将3,4,5传递给 *,会将3,4,5 做成元组(3,4,5)赋值给args
#**kwargs
def foo(x,y,**kwargs)
  pass
foo(1,y=2,a=1,b=2,c=3)
==>
def foo(x,y,**kwargs)
  pass
foo(1,y=2,**{'a':1,'b':2,'c':3})
==>
def foo(1,2,**{'a':1,'b':2,'c':3})
  pass
foo(1,y=2,**{'a':1,'b':2,'c':3})
#调用foo时会将a=1,b=2,c=3 转化为**{'a':1,'b':2,'c':3},{'a':1,'b':2,'c':3}传入kwargs
#命名关键字参数:*后定义的参数,必须被传值(有默认值除外)且必须按照关键字实参的形式传递可以保证,传入的参数中一定包含某些关键字
def foo(x,y,*args,a=1,b,**kwargs):
  print(x,y)
  print(args)
  print(a)
  print(b)
  print(kwargs)
foo(1,2,3,4,5,b=3,c=4,d=5)
==>
1,2
(3, 4, 5)
1
3
{'c': 4, 'd': 5}


原文地址:https://www.cnblogs.com/kunixiwa/p/7194251.html