Python3学习笔记13-函数的参数
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数, 以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,
使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码
位置参数 也叫必须参数
位置参数必须以正确的顺序传入函数。调用时的数量必须和声明时的一样
def power(x,n):
s = 1
while n >0:
n = n-1
s = s*x
return s
print(power(5,2))

x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n
默认参数
def power1(x,n=2):#必选参数在前,默认参数在后
s =1
while n >0:
n = n-1
s = s*x
return s
print(power1(6)) #只传一个的时候,默认n=2
print(power1(3,3)) #传两个值时,会把默认n=2替换掉
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
比如幼儿园录入学生信息时,姓名和性别是必填,年龄和城市大部分是相同的
def enroll(name,gender,age=6,city='Bejing'):
print('name:',name,'gender:',gender,'age:',age,'city:',city)
enroll('Sarah','F')
enroll('Bob','F',7)#当年龄不是6时传入相应值,因为年龄正好在第三位不需要告诉函数,这是年龄
enroll('kael','M',city='ShangHai')#而城市第四位,需要告诉函数,这是城市,不是年龄、
注意事项:定义默认参数要牢记一点:默认参数必须指向不变对象!
def add_end(L=[]):
L.append('end')
return L
print(add_end())
print(add_end())#打印出来['end', 'end']
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],
每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
def add_end1(L=None):
if L is None:
L = []
L.append('end')
return L
print(add_end1())
print(add_end1())
#可以用None这个不变对象来实现
可变参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n
return sum
print(calc(1,2,3))
print(calc(1,2))
print((calc))
#在参数前面加上*,函数内部,参数接收到的是个tuple。调用函数时,可以传入任意个参数,包括0个参数
nums =[1,2,3]
print(calc(nums[0],nums[1],nums[2]))
print(calc(*nums))#Python允许在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
def person(name,age,**kw):# **表示关键字,参数随便填的
print('name:',name,'age:',age,'other',kw)
函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数:
person('Michael',30)#可以只传必选参数
person('Bob',35,city='BeiJing')
person('Jack',24,Job='Engineer',city='ShangHai')#也可以传任意个关键字参数
关键字参数有什么用?它可以扩展函数的功能
比如注册的时候,必填是姓名和年龄,其他是可选项,关键字函数就可以满足这样的需求
和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去:
extra = {'city':'BeiJjing','Job':'Engineer'}
person('Jack',24,city=extra['city'],job=extra['Job'])
也可以用简化的写法:
person('Jack',24,**extra)
**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict
kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra
命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查。
仍以person()函数为例,我们希望检查是否有city和job参数:
def person1(name,age,**kw):
if 'city' in kw:
pass
if 'job' in kw:
pass
print('name:', name, 'age:', age, 'other', kw)
person1('jack',24,city='Beijing',addr='chaoyang',zipes=123242)
但是调用者仍可以传入不受限制的关键字参数:
如果要限制关键字参数的名字,就可以用命名关键字参数
例如,只接收city和job作为关键字参数。这种方式定义的函数如下:
def person2(name,age,*,city,job):
print(name,age,city,job)
person2('jack',24,city='Beijing',job='Engineer')#给其他关键字会报错
调用的时候必须给关键字,如果不给会认为四个位置参数,而函数中只有两个,会报错
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person4(name,age,city='beijing',*args,job):
print(name,age,city,args,job)
person4('kael',25,'shanghai',1,2,job='Engineer')#1,2就是可变参数,job就是命名关键字参数

参数组合
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def f1(a,b,c=0,*args,**kw):
print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw) f1(1,2)
f1(1,2,c=3)
f1(1,2,3,'a','b')
f1(1,2,3,'a','b',x=99) def f2(a,b,c=0,*args,d,**kw):
print('a=',a,'b=',b,'c=',c,'args=',args,'d=',d,'kw=',kw)
f2(1,2,d=99,ext=None)

最神奇的是通过一个tuple和dict,也可以调用上述函数:
args=(1,2,3,)
kw = {'d':99,'ext':99}
f1(*args, **kw)
f2(*args, **kw)

所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
小结
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。可变参数 *参数名 函数接收的是一个tuple 调用函数传值不需要有参数名,可以传多个或不传关键字参数 **参数名 函数接收的是一个dict 调用函数传值必须要有参数名,可以传多个,但是不能限制哪些参数名命名关键字参数 *,参数名 调用函数传值必须要和函数定义的参数名一致如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了*city,job 比如city就是可变参数,可以传多个,job就是命名关键字参数
Python3学习笔记13-函数的参数的更多相关文章
- python学习笔记之函数的参数
函数的参数有位置参数和关键字参数,位置参数一定要在关键字参数的前面,位置参数的优先级是高于关键字参数的,否则会报错 def my_abs(a,b): print(a) print(b) my_abs( ...
- Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组
1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 fu ...
- python学习笔记(3)--函数、参数、变量、递归
1.函数基本语法和特性 背景摘要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏出了所有的知识量吗,写出了以下代码 whi ...
- 【Go语言学习笔记】函数做参数和闭包
函数做参数 在Go语言中,函数也是一种数据类型,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型.类似于重写(同名覆盖). 回调函数:函数有一个参数是函数类型,这个 ...
- python3学习笔记13(数据结构)
参考http://www.runoob.com/python3/python3-data-structure.html 列表 列表是可修改的. 列表方法让列表可以方便的作为一个堆栈来使用,堆栈作为特定 ...
- python3学习笔记11(函数)
函数 python提供了许多内建函数,例如print(). 自己创建的函数,叫做用户自定义函数. 定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称 ...
- Python学习笔记——以函数为参数的内置函数
1.用法 一个参数 def ds(x): return 2 * x + 1 print(ds(5)) 11 g = lambda x : 2 * x + 1 print(g(5)) 11 两个参数 d ...
- matlab学习笔记13_1 函数返回值
一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...
- Python3+Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)'''from sel ...
随机推荐
- Linux监控--CPU、内存、I/O
CPU top命令能够实时监控系统的运行状态,并且可以按照CPU.内存和执行时间进行排序,同时top命令还可以通过交互式命令进行设定显示,通过top命令可以查看即时活跃的进行. 内存 free命令可以 ...
- luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)
我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...
- luogu2634 聪聪可可 (树形dp)
要求出两点间距离==0(mod3) 的数量,然后除以(n*n) 设f[i][j]为i的子树到i的距离==j(mod3)的数量,然后做树形dp即可 因为要最简,所以要求一下gcd,然后除下去 #incl ...
- Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
Luogu 1080 [NOIP2012]国王游戏 (贪心,高精度) Description 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己 ...
- Quartz入门例子简介 从入门到菜鸟(一)
转: Quartz入门例子简介 从入门到菜鸟(一) 2016年11月19日 22:58:24 爱种鱼的猫 阅读数:4039 刚接触quartz这个词并不是在学习过程中...而是WOW里面的界面插件 ...
- idea 普通 web项目配置启动【我】
首先说这是一个普通的java web项目,没有用到maven. 检出项目: 项目是先用 乌龟svn 在 编辑器外部检出到一个目录下,然后再用 idea的 open 打开这个目录生成的.[因为直接用i ...
- Spring + Shiro 项目 + HttpSessionListener 【调用springService问题】&【Session失效问题】
功能描述: 当用户退出(主动)或者关闭浏览器(session超时)的时候,利用本次登录Ip更新上次登录IP.有人可能要问,你在用户登录的时候记录不就行了.可是我有两个字段,一个为本次登录IP,另外一个 ...
- 五个免费UML建模工具
UML工具很多是商用的,价格不菲:而免费的UML建模工具,功能完善的很少.以下推荐的是五个免费的UML建模工具,相对而言还算功能比较不错. 免费UML建模工具推荐:JUDE – community 如 ...
- frp中的json模块
预备知识 Go中的接口的数据结构可以分为两部分: 其中一部分指向或者存储了原始数据的值 另一部分指向或者存储了原始数据的类型描述符(其中包含类型,以及对应于接口中的方法) 所以大体上我们可以粗略的认为 ...
- synchronized实现原理
线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...