函数定义

函数是对能完成某种功能的语句块的封装。由函数名、参数列表和多语句构成的语句块组成,定义方式如下:

def func_name(argrs):

语句块

说明:

def语句用于函数定义,def语句的作用是生成一个函数对象,并且将其赋值给函数名;

函数定义时的参数列表称之为形参

语句块中一般会包含一个return语句,返回函数调用的结果;如果没有那么函数在其末尾自动执行 return None

函数调用

ret = func_name(args)

说明:

def语句只是定义一个函数对象,执行函数需要调用

函数调用的方式,func_name(args)

函数调用时写在括号中的参数称之为实参,分为位置参数和关键字参数,它们的书写形式分别为value、name=value。下面的示例中,print函数调用,1、2为位置参数(也可以是已定义的变量),sep = '\n' 为关键字参数

>>> print(1,2,sep='\n')

1

2

>>> a = 1, b= 2

>>> print(a, b, sep='\n')

1

2

函数返回

遇到return语句函数直接返回,后面的语句不再被执行

函数只能返回单值,这个值可以是任意的数据类型

函数参数之形参

形参中可能包含四种参数(排序分先后):位置参数、可变位置参数、keyword-only参数、可变keyword-only参数。

参数就是变量标识符,命名规范相同。

可变位置参数用‘*’加标识符表示,如*args;可变keyword-only参数用‘**’加标识符表示,如**kwargs。可变参数用于收集任意多基于位置或者关键字的参数。

四种参数在形参列表中都是可选的,但是它们的相对位置不变。

位置参数:通过位置进行匹配,把实参的值通过赋值传给对应位置的形参参数名,从左到右进行匹配。位置参数也可以通过 name=value的形式传参,参数按照名称匹配,顺序无关。

>>> def f4(a, b):

... print('a =', a)

... print('b =', b)

...

>>> c, d = 1, 2

>>> f4(c, d)  #对应位置匹配,相当于实参分别为对应位置形参变量赋值,a=c, b=d

a = 1

b = 2

>>> f4(b = d, a = c)

a = 1

b = 2

注意:因为参数是通过赋值传递的,所有实参和形参从某种意义上讲是在共享对象。如果传递的是可变对象,那么函数对形参的原地修改可能会影响到实参。

keyword-only参数: 实参只能是 name = value 的形式,通过 name与形参中的变量进行匹配,实参顺序不影响匹配。

>>> def f5(*, a, b): #‘*’的意义在于,在语法上将a、b定义为keyword-only参数

... return a, b

...

>>> f5(1,2)

Traceback (most recent call last):

File "", line 1, in

TypeError: f1() takes 0 positional arguments but 2 were given

#keyword-only参数不能通过位置进行匹配

>>> f5(b=1, a=2)

(2, 1)

>>> def f5(*args, a, b):

... print('args =', args)

... print('a =', a)

... print('b =', b)

...

>>> c = 3

>>> d = 4

>>> f5(1, 2, a=c, b=d)

args = (1, 2)

a = 3

b = 4

#形参中的*args参数收集任意多个未匹配的位置参数到一个tuple。

>>> f2(a=1, 2, b=4)

File "", line 1

SyntaxError: positional argument follows keyword argument

#实参的位置参数必须位于关键字参数之前

形式上,位置参数和keyword-only参数没有区别,为了定义keyword-only参数必须将其放到*或者*args后。

位置参数和keyword-only参数在定义时,可以定义一个默认参数值。在调用中如果对应参数没有实参传入,则使用默认值。

>>> def f6(p1, p2=0, *, k1=[], k2): #定义中p2 和 k1有默认值,传参的时候可以缺省,但是p1和k2必须有相应的参数传入,否则会报错

... print('p1 =', p1)

... print('p2 =', p2)

... print('k1 =', k1)

... print('k2 =', k2)

...

>>> f6(1, k2=3) #1位置匹配到形参中的p1, k2匹配形参中的k2, p2 和 k1使用定义中规定的默认值

p1 = 1

p2 = 0

k1 = []

k2 = 3

>>> f6(p1 = 1, p2 = 2). #位置参数也可以通过name = value的形式传递,通过name进行匹配,传参顺序无关

Traceback (most recent call last):

File "", line 1, in

TypeError: f6() missing 1 required keyword-only argument: 'k2'

#缺少keyword-only参数:‘k2’

>>> f6(1,p2 = 2, k2 = 3) # 1通过位置匹配传给p1, p2 和 k2分别通过name匹配传递,没有k1对应的实参传入,使用默认值

p1 = 1

p2 = 2

k1 = []

k2 = 3

>>> f6(1,2, k2 = 3, k1 = 4) # 4个形参都有对应实参传入,所以不需要使用默认值

p1 = 1

p2 = 2

k1 = 4

k2 = 3

位置参数中,有默认值的参数的定义必须放在非默认值参数之后,否则会报语法错误。keyword-only参数无此要求。

>>> def f7(a=1, b):

...returna,b

...

File"", line 1SyntaxError: non-default argument follows default argument

函数参数之实参

实参(位置参数和关键字参数)和形参(位置参数、可变位置参数、keyword-only参数、可变keyword-only参数)之间的匹配顺序可以这样理解:

首先实参中的位置参数和形参的位置参数匹配

然后实参中的关键字参数和形参中的位置参数和keyword-only参数通过标识符(name)匹配

实参中多余的位置参数放入形参的可变位置参数,生称一个元组

实参中多余的关键字参数放入形参的可变keyword-only参数, 生成一个字典

没有实参匹配的形参使用默认值

实参中参数的解构

函数调用时,可以在集合类型前使用 * 或者 ** ,把集合元素中的结构解开,提取出所有的参数作为函数的实参

非字典类型使用 * 解构成位置参数

字典类型使用 ** 解构成关键字参数

提取出来的元素数目和类型要和形参需求匹配

默认参数

默认参数是在def语句运行时评估并保存的,而不是在函数调用时。在内部讲,python会将所有默认参数组合生成一个元组对象,作为函数的一个属性(__defaults__)保存。因为属性是附加到函数本身的,所有对该函数的调用都使用了同一个对象,所以对可变默认参数的修改要慎重。

>>> def saver(x = []):

... x.append(1)

... print(x)

...

>>> saver.__defaults__ #对象属性的查看方式,应用该对象的变量名加点加属性名

([],)

>>> saver()

[1]

>>> saver.__defaults__

([1],)

>>> saver()

[1, 1]

如果这不是你所想要的行为可以将默认参数值的表达式移到函数体内:

>>> def saver(x=None):

... x= x or[]  #如果没有参数传入的话,x默认为None,or运算返回后面的空列表

... x.append(1)

...print(x)

...>>>saver()

[1]>>>saver()

[1]

or运算,从左到右计算表达式返回第一个遇到的真值,如果所有值都为False,那么返回最后一个值。如果传入的x参数为0或者空列表或者空集合等,那么就都会替换为空列表[]了,这可能也不符合预期,我们可以使用if语句:

>>> def saver(x=None):

...if x isNone:

... x=[]

... x.append(1)

...print(x)

python3.5以上版本的保留字总数是_python函数之参数(python3.5)相关推荐

  1. python3.x版本的保留字总数是多少_Python3.6.5版本的保留字总数是:()-智慧树大数据分析的python基础章节答案...

    大数据分析的python基础:Python3.6.5版本的保留字总数是:()[?????] A:29 B:33 C:16 D:27 大数据分析的python基础章节测试答案: 33 更多相关问题 20 ...

  2. python3x版本的保留字总数_Python3.6.5版本的保留字总数是:()-智慧树大数据分析的python基础章节答案...

    大数据分析的python基础:Python3.6.5版本的保留字总数是:()[?????] A:29 B:33 C:16 D:27 大数据分析的python基础章节测试答案: 33 更多相关问题 20 ...

  3. python3.6安装版本选择

    python常用版本为2.7稳定,但是 不再更新.但是目前3.4版本以后也相对稳定,建议大家使用python3.4以后版本进行练习. 第一个:下载zip安装包进行安装 第二个:下载.exe文件进行安装 ...

  4. python2和python3分别是python的两个版本_Windows下Python2与Python3两个版本共存的方法详解...

    前言 一向用Python 3,最近研究微信公众号开发,各云平台只支持Python 2.7,想用其他版本需要自己搭建环境.而网上又搜不到Python 3开发微信公众号的资料.暂打算先使用Python 2 ...

  5. python3最新稳定版本-python3稳定版

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 美国时间6月27日晚8点,python 3. 7. 0 经过多轮测试,终 ...

  6. Windows安装python3.6.x版本

    下载python安装程序 1.官网下载python的windows版本 python官方网站:https://www.python.org/ 如下图,选择需要的版本下载即可. 我这里下载Python3 ...

  7. Python中的字符串操作总结(Python3.6.1版本)

    Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...

  8. python3.6.2下载教程_Windows下升级Python3.7.7后(原Python3.6.2版本)如何切换Python版本|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 笔者:风起怨江南 出处:https://www.cnblogs.com/mengjinxiang 笔者原创 ...

  9. python多版本共存 ubuntu_Linux下python3与python3的多版本共存

    python3已经出来有些许时候了,python3相比python2进行了大量的改进,包括语法,新的功能,还有优化.虽然很多库已经同时支持 python2和python3了,但是有些库仍然没有很好的支 ...

最新文章

  1. Java面试宝典系列之面试复习提纲
  2. Delphi中判断控件的详细类型
  3. 【ArcGIS遇上Python】ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换
  4. 【CF1394B】Boboniu Walks on Graph【图论】【集合哈希】
  5. 计算机网络课设不会,计算机网络课设讲述.doc
  6. linux+mmap父子通信_Linux 系统开发5 进程间通信 pipe() fifo() mmap()
  7. 高德sdk定位当前位置_高德地图定位,获取当前位置坐标
  8. linux双机热备软件Rose,Linux Rose HA 双机热备软件原理
  9. 京东T9架构师手把手教你怎么写年薪50万的java简历
  10. Unity 设置固定移动路线
  11. 使用JS实现对页面的繁体简体翻译转换
  12. Sechunter移动应用隐私合规检测详解
  13. 数据同步项目总结1-数据实时同步的要点
  14. 华为200万年薪“天才少年”,来自985华中科技大学
  15. Android10 系统应用wifi连接和静态ip代理设置
  16. iOS Keychain和keychain share
  17. c++模板类声明和定义的问题
  18. 赢得面试 — 天助自助者
  19. Java操作数据库方式五MyBatis使用入门
  20. Java 关键字:extends, implements

热门文章

  1. JavaScript性能优化【下】--性能优化的具体方式
  2. webpack -- 无法将“webpack”项识别为 cmdlet 。。。
  3. C#开发笔记之13-如何用C#分隔字符串并返回字符串数组?
  4. C#算法设计查找篇之01-顺序查找
  5. clickhouse注入的利用
  6. 重新写博+linux查找系列
  7. 用MATLAB玩转机器人--第六章 用MATLAB玩转单关节机器人
  8. 最新教程:Python开发钉钉群自定义机器人
  9. Django框架——HttpResponse对象
  10. 保险条款精解(二) 丢车——如何将损失降到最低点?