python开发学习day12 (函数参数;函数对象)

2020-06-16                             目录:

一、函数的参数

1.1  第一组形参与实参

1.1.1  位置形参

1.1.2  位置实参

1.1.3  关键字实参

1.1.4  默认参数

1.2  第二组形参与实参(可变长参数)

1.2.1   形参中带*与**

1.2.2   实参中带*与**

1.3  形参与实参中混用*与**

二、函数对象

2.1  可以赋值

2.2  可以当做参数传给另一个函数

2.3  可以当做函数的返回值

2.4  可以当做容器类型的元素

一、函数的参数

1.1  第一组形参与实参

1.1.1  位置形参

位置形参:按照从左到右的顺序依次定义形参
# 特点:必须被传值,多一个不行少一个也不行

1.1.2  位置实参

位置实参:按照从左到右的顺序依次定义实参
# 特点:按照位置与形参一一对应
def func(x,y):  
  print(x,y)

func(1,2)  # 将1赋值给x,将2赋值给y,一一对应

1.1.3  关键字实参

关键字实参:按照key=value的形式为指定的形参传值
# 特点:指名道姓为某个形参传值,可以完全打乱顺序
def func(x,y):  
  print(x,y)

func(y=1,x=2)

注意点:可以混用位置实参与关键字实参,但是
    1、不能对同一个形参重复赋值
    2、关键字实参必须放在位置实参后面,否则会报错

1.1.4  默认参数

具有默认值的形参,指的是在定义函数阶段就已经为参数赋值
# 特点:在调用函数阶段可以不用为默认参数传值
def func(x,y=2):
  print(x,y)

func(1)      # 默认y=2
func(1,222)  # 如果y被再次传了值,那么本次调用以当前传的值为准

# 注意点:① 位置形参必须放在默认形参的前面
      ② 默认形参的值是在函数定义阶段就被固定的,如果调用时没有为默认形参传值,那么不会每次调用都重新赋值           
       函数的调用彼此之间应该做到没有关联,所以说默认形参通常应该是不可变类型

1.2  第二组形参与实参(可变长参数)

可变长参数:可变长指的是在调用函数时,传入的实参个数不固定,而实参是为形参赋值的
所以对应着也应该有新的形参格式来负责接收不固定长度的实参

1.2.1   形参中带*与**

① *形参名:*会负责把溢出的位置实参存成元组然后赋值给后面的形参名,形参名通常使用args
def func(x, y, *z):
print(x, y, z)


func(1, 2, 3) # >>>1 2 (3,)
func(1, 2, 3, 4, 5) # >>>1 2 (3, 4, 5) 实参个数可以溢出,但是不能少于位置实参的个数,即*z可以不被赋值
②**形参名:**会负责把溢出的关键字实参存成字典然后赋值给后面的形参名,形参名通常使用kwargs
def func(x, y, **z):
    print(x, y, z)


func(1, 2, a=111, b=222, c=333)  #  >>>1 2 {'a': 111, 'b': 222, 'c': 333}

  注意:*与**在形参中混用,整体的顺序从左到右应该是:位置形参,默认形参,*args,**kwargs

1.2.2   实参中带*与**

① 实参中带*号:
  *号后跟的那个值应该是一个可以被for循环遍历的值,
  *号会把后面的值打散成位置实参,如:
func(*(111,222,333)) 就相当于 func(111,222,333)
func(*"hello") 就相当于 func("h","e","l","l","o")
② 实参中带**:
  **后跟的那个值应该是一个字典
  **会把后面的那个值打散成关键字实参,如:
func(**{"x": 111, "y": 222, }) 就相当于 func(y=222,x=111)

1.3  形参与实参中混用*与**

def func(*args, **kwargs):
    print(args, kwargs)


func(1, 2, a=1, b=2)  # >>>(1, 2) {'a': 1, 'b': 2}
func((1, 2, 3), {'a': 1, 'b': 2})  # >>>((1, 2, 3), {'a': 1, 'b': 2}) {}
func(*(1, 2, 3,), **{'a': 1, 'b': 2}) # >>>(1, 2, 3) {'a': 1, 'b': 2}
  形参中带*与**是汇总操作
  实参中带*与**是打散操作

了解级知识点:
def func(*args, y, **kwargs):
    print(args, y, kwargs)


func(1, 2, y=3, a=1, b=2, c=3)  # >>>(1, 2) 3 {'a': 1, 'b': 2, 'c': 3}   调用时y必须被赋值,否则会报错

二、函数对象

在python里,函数是第一类对象,简称函数对象
函数对象指的就是可以把函数当做变量一样去使用

2.1  可以赋值

def func():
    print('from func')
print(func)
f=func  # 函数名func所指向的的内存地址绑定给了f
f()  # f()也可以进行函数调用

2.2  可以当做参数传给另一个函数

def func(aaa): # aaa=函数foo的内存地址
    print(aaa)
    aaa()      # 只能在func()内调用aaa()

def foo():
    print('from foo')

func(foo)   # 将foo赋值给了变量aaa,那么aaa()也可以当做foo()使用来调用函数

2.3  可以当做函数的返回值

def func(aaa):   # aaa=函数foo的内存地址
    return aaa   # 返回的是函数foo的内存地址

def foo():
    print('from foo')


res=func(foo)    # 将foo赋值给aaa
print(res)
res()            # 相当于foo()

2.4  可以当做容器类型的元素

def foo():
    print('from foo')

l=[foo]
print(l)
l[0]()   # 即 foo()

 

 

posted @ 2020-06-16 22:16  不负韶华l  阅读(125)  评论(0编辑  收藏  举报