函数的参数是参数暴露给外部的接口,向函数传递参数,可以控制函数的流程,函数可以0个、1个或多个参数;在Python中向函数传参,使用的是赋值方式。

一,传递参数

参数是通过赋值来传递的,传递参数的特点是:

  • 参数的传递是通过自动把对象赋值给函数的本地变量名来实现的,
  • 在函数内部的变量名的赋值不会影响调用者,在函数运行时,在函数头部的参数名是一个新的、本地的变量名,这个变量名的作用域是在函数的本地作用域内。
  • 改变函数的可变对象参数的值,会修改原始对象的值。

当通过赋值方式,把可变对象的引用传递给函数时,在函数内部对参数进行修改,在函数外部可以看到修改。

例如,列表是一个可变对象,当把列表 a 传递给 changer函数时,函数向列表末尾添加一个字符a,当函数调用结束时,列表末尾被修改。

>>> def changer(x):
... x.append('a')
...
>>> a=[1,2,3]
>>> changer(a)
>>> a
[1, 2, 3, 'a']

这是由于可变对象是通过指针进行传递的,当把列表的引用传递给参数时,函数直接在原处修改对象。

也可以通过向参数传递拷贝的方式,使得函数无法修改原始的对象。

changer(a[:])
changer(a.copy())

二,参数匹配模型

不管使用何种参数的匹配模型,参数总是通过赋值进行传递的。

在默认情况下,参数是通过其位置进行匹配的,从左向右,而且必须精确地传递和函数头部参数名一样多的参数。还能够通过参数名匹配,默认参数名,以及对于额外参数的容器来进行传参。

1,位置匹配

一般情况下,参数是通过位置从左至右进行匹配,把参数传递给函数头部的参数名称。

例如,定义函数func,包含三个参数,那么必须使用三个参数传值进行调用:

def func(a,b,c):

调用的格式是,按照顺序把值写在括号中,Python按照位置匹配参数,把1赋值给a,把2赋值给b,把3赋值给c:

func(,,)

2,关键字匹配

调用者使用arg_name=value的方式,通过在调用时使用参数的变量名进行匹配。

例如,定义参数func,包含三个参数,那么必须使用三个参数传值进行调用:

def func(x,y,z):

使用关键字调用的格式是:按照 arg=named的方式进行匹配,可以不按照位置:

func(y=, x=, z=)

在调用函数时,Python按照参数名进行匹配,把2传递给参数y,把1传递给参数x,把3传递给参数z。

也可以混合使用位置匹配和关键字匹配,例如,下面的函数调用:

func(,z=,y=)

基于位置的匹配参数,首先按照从左至右的顺序匹配前面的参数,之后,再按照基于变量名进行关键字匹配。

3,默认参数

在定义函数时,可以为函数的参数赋值,这就是参数的默认值。当没有为该参数传值时,参数值使用默认值。

例如,定义一个函数,包含三个参数,x、y和z,其中参数z有默认值1:

def func(x,y,z=1):

当调用这个函数,必须为参数x和y传值,无论是通过位置匹配还是关键字匹配来实现都可以。然而,参数z的传值是可选的。如果不为z传值,那么z使用默认值;如果为z传值,那么z使用传递的值。

func(,)

4,可变长参数列表

可变参数用于收集任意多个基于位置或关键字的参数,在函数定义时,如果参数名前带一个*号,那么该参数收集的是基于位置的传值;如果参数名前带两个*号(**arg),那么该参数收集的是基于关键字(arg=value)的传值。

def func(*args)
def func(**dict)

这两种方式的不同点是,*args方式是把任意多个传值封装成元组(arg1,arg2),而**dict是把任意多个 arg=value 封装成字典{arg:value},字典的key是参数名,字典key对应的值是参数的值。

例如,定义函数foo,包含一个位置匹配参数,1个可变的位置匹配参数,1个可变的关键字匹配参数:

def foo(a,*b,**c):

在调用函数时,首先按照位置匹配,把1传递给参数a,把元组(2,3)传递给参数b,把字典{x:1,y:2}传递给参数c:

foo(,,,x=,y=)

5,只能使用关键字参数

参数必须按照名称传值,在函数定义时,参数必须在调用中按照关键字进行传值:

def func(*,arg=value)

从语法上来讲,keyword-only参数编码为关键字参数,出现在参数列表的*args之后,所有这些参数都必须在调用中使用关键字语法来传值。

def foo(a,*b,c):

在调用foo函数时,参数a可以按照位置和关键字来传值,参数b接收按照其余的按照位置来传值的变量,参数c必须按照关键字来传值:

foo(,,'a',,c='key')

也可以在参数列表中使用一个*字符,来表示一个函数不会接受一个可变的参数列表,而是仍然期待跟在*后面的所有参数都作为关键字匹配。

例如,定义函数foo,只接受3个参数,不接受可变长度的参数列表:

def foo(a,*,b,c):

在调用时,参数a可以按照位置和关键字来传值,参数b和c必须按照关键字来传值:

foo(,b='x',c=)

三,lambda表达式

除了def语句之外,Python还提供了一种生成函数对象的表达式形式,lambda表达式。就像def语句一样,这个表达式创建了一个函数对象,但是它返回了一个函数,而不是把这个函数赋值给一个变量名。

lambda表达式的一般形式是关键字lambda,之后是一个或多个参数(与一个def头部内用括号括起来的参数列表极其类似),紧跟一个冒号,之后是一个表达式:

lambda arg1,arg2,... argN: expression_using_args

lambda表达式的特性是:

  • lambda表达式返回的是函数对象;
  • lambda是一个表达式,而不是一个语句,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性地赋值给一个变量名;
  • lambda的主体是一个单个的表达式,而不是一个代码块,这个表达式的结果作为函数的结果返回。

lambda只有一行表达式,只能用于创建简单的函数,而def 可以包含多条语句,用于处理复杂的任务。

对于简单的处理流程,既可以使用def,也可以用lambda来实现,例如:

def func(x,y,z): return x+y+z

func=lambda x,y,z: x+y+z

由于lambda表达式返回的是一个函数对象,因此,可以用于map()、filter()和reduce()函数中:

list(map((lambda x: x+), range(,)))
list(filter((lambda x: x>), range(,))) from functools import reduce
reduce((lambda x,y: x+y),range(,))

reduce()函数对每对元素都应用函数,并运行到最后结果,上述reduce()函数的作用是把序列中的所有元素相加,等价的写法是:

x=list(range(,)]
res=x[]
for i in x[:] :
res+=i

四,函数的属性

可以向函数添加任意多个用户定义的属性,函数属性的格式是:函数名称.变量名

例如,向函数func中添加state属性:

def func():

func.state='begin'

参考文档:

Python 学习 第八篇:函数2(参数、lamdba和函数属性)的更多相关文章

  1. Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

    文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...

  2. Python学习笔记进阶篇——总览

    Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...

  3. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  4. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍

    目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...

  5. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

  6. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  7. Python学习【第九篇】函数

    函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过 ...

  8. Python学习笔记——基础篇2【第三周】——计数器、有序字典、元组、单(双)向队列、深浅拷贝、函数、装饰器

    目录 1.Python计数器Counter 2.Python有序字典OrderredDict 3.Python默认字典default 4.python可命名元组namedtuple 5.Python双 ...

  9. Python学习5——抽象,涉及抽象和结构、函数的自定义、参数、作用域、递归

    此处将抽象和结构.自定义函数.参数的使用.作用域.递归放在一起学习,看起来很怪是不是? 但实际上这几者之间是有紧密联系的,不然Python基础教程(第三版)的作者为什么会把它们放在一起哪?手动滑稽 好 ...

随机推荐

  1. 洗礼灵魂,修炼python(48)--巩固篇—模块

    模块 其实前面都说过的,不过还是系统的再说一次,相信学到这,大部分都被搞忘了吧,所以再提一下,也为后面的博文做铺垫 1.什么是模块 在程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越 ...

  2. 转:SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...

  3. [HDFS_1] HDFS 的概念和特性

    0. 参考 HDFS你一定要知道,要考的 大数据开发实战:HDFS和MapReduce优缺点分析 SecondaryNamenode的作用详解 1. HDFS 是什么 HDFS :一种分布式文件系统, ...

  4. MySQL使用索引的场景分析、不能使用索引的场景分析

    一.MySQL中能够使用索引的典型场景 1.匹配全值.对索引中的列都有等值匹配的条件.即使是在and中,and前后的列都有索引并进行等值匹配. 2.匹配值的范围查询,对索引的值能够进行范围查找. 3. ...

  5. 关于UIPageViewController那些事

    一.前言 这些天有新生问及UIPageViewController这个视图控制器,自己原来没有用过,所以就看了一下相关的知识,就写了下来,分享一下经验. 主要的关于这个控制器的内容就从例子中去解说了. ...

  6. Beta阶段总结博客(麻瓜制造者)

    Beta冲刺过程中各个成员的贡献百分比: 成员 贡献值 邓弘立 15% 符天愉 14% 江郑 14% 刘双玉 14% 肖小强 13% 李佳铭 11% 汪志彬 11% 伍杰麟 8% 项目的发布说明 本版 ...

  7. 如何在sublime编辑器中,执行命令行脚本

    我有个愿意,在执行命令行时,不打开那个黑乎乎命令行窗口,如果编辑器内置支持就好了. 打开vs code 和 sublime,分别按快捷键 Ctrl + ·(tab键上面那个键),vs code可以提供 ...

  8. Zabbix安装 Grafana安装

    每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code 前提: 先需要安装好 lamp环境. 官方文档: https://www.zabbix.com ...

  9. 路由器不重启,是否ip就永远不变

    今天发现公司的公网ip突然变了,没有人去动过路由器怎么会这样呢?经查原因如下:1.不一定,IP变化是每一次拨号重新获取的.2.路由器重启了,会自动拨号,获得IP3.但如果说因各种原因,掉线,路由器也会 ...

  10. 一个非常好的php实现手机号归属地查询接口类

    前一阵子看到了一个非常好的php手机归属地查询的类,写的很精简,查询也很精确!大致代码是这样的: <?php header("Content-type:text/html;charse ...