1,参数传递

  函数的参数传递都是引用传递,有些资料说函数的传递分为值传递和引用传递,那是从表象上看的现象,

  其实就只有一种传递方式,那就是引用传递。

  为什么会有值传递和引用传递的表象?

  答:因为在进行参数传值时,如果是基础类型,str或者tuple,修改其值对被传入的对象没有影响,但是

  传入list,dict或者自定义类时,对其进行修改将导致被传入对象的修改。

从表象上看,很容易让人产生两种传递方式的错觉,那是因为a和 l 操作的数据对象不同,a操作的是变量本

  身,而 l 操作的是变量的元素。当a += 10时,此时a的引用地址发生变法,所以对被传入的对象没有影响,

  而 l.append(100)时,并没有对变量 l 本身进行操作,所以 l 的引用地址没有发生变法,对其元素的修改,也

体现在被传入的参数上面(参考Python变量的赋值:https://www.cnblogs.com/lwp-boy/p/13269681.html

 2,默认参数

  默认参数为带默认值的参数,其定义必须在无默认值的参数后面,无默认值的参数必须传递,而带默认值的

  参数可传可不传,当不传时,将使用默认值。

3,函数调用

   函数调用时,参数可以指定名字,也可以不指定名字,指定名字时,函数将把该参数赋值给对应的变量,不

  指定名字,函数将根据参数顺序赋值给没有指定名字的参数。函数调用时,指定名字的参数必须在无指定名

  字之后。

 def func(a, b, c=20):
print a, b, c


 func(10, b=20) # a=10, b=20, c=20
 func(c=30, b=20, a=10) # a=10, b=20, c=30
 func(10, 20, 30) # a=10, b=20, c=30

4,可变参数

  可变参数及为对参数个数和类型没有限制的参数,python函数的可变参数通过 或者 ** 进行定义,例如:

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

  args:为元组,通过无名参数传递的参数都在args里面(a的参数除外),通过元组取数据。

  kwargs:为字典,通过有名参数传递的参数都在kwargs里面(a的参数除外),通过字典取数据。

  函数内部访问直接访问args和kwargs即可。

 func(a=1)           # a=1, args=(), kwargs={}
 func(a=2, b=2) # a=1, args=(), kwargs={'b':10}
 func(2, 3, a=1) # 错误,不能确定a是属于a函数属于kwargs
 func(1, 2, b=2) # a=1, args=(2, ), kwargs={'b':10}

变参传递如下:
 def func(a, *args, **kwargs):
print a, args, kwargs


def func2(a, b, *args, **kwargs):
func(a, b, 20, c=10, *args, **kwargs)


func2(1, 2) # a=1, args=(2, 20) kwargs={'c': 10}

 

5,返回值

  python函数的返回值其实只有一个,当返回多个值时,其实返回的是一个元组,因为元组支持无标签

  格式,比如元组:a = 1, 2, 3 等价与 a = (1, 2, 3),当 return 1, 2, 3 时,其实执行的是 return (1, 2, 3)

6, lambda表达式

  lambda表达式通常用作表示一个简短的方程式(PEP8建议用函数替换lambda表达式)。

  定义方式:lambda 参数列表:方程式

  返回值:方程式的值

  常见用法:

 (1)全局表达式  

 lamb = lambda x, y: x+y

 r = lamb(2, 3) # r=5

 (2)闭包函数

 def func(x):
  return lambda y: x+y

 f = func(5)(3) # f=8

    

  

posted on 2020-08-01 16:54  lwp-boy  阅读(193)  评论(0)    收藏  举报