讲讲python中函数的参数
python中函数的参数
形参:定义函数时代表函数的形式参数
实参:调用函数时传入的实际参数
列如:
def f(x,y): # x,y形参
print(x, y) f(1, 2) # 1, 2 实参
定义函数时,形参分为普通参数,默认参数,和动态参数
列如:
def f(x, y): # 普通参数
pass def f(x, y=1): # y=1是默认参数
pass def(x,y=1,*args): # *args普通动态参数
pass def(x,y=1,**kwargs): # **kwargs关键字动态参数
pass
调用函数时,根据调用时的写法,可以分为位置参数和关键字参数
def f(x,y):
print('x=',x,'y'=,y) f(1,2) #我们这样调用的时候1,2叫位置参数,会根据传入的实参
#位置去对于形参的位置 输出结果为:
x= 1 y= 2 f(x=1, y=2)
f(y=2, x=1) #我们这样调用的时候,y=2,x=1叫做关键字参数
#可以不用按照位置写
那调用的时候同时写位置参数和关键字参数呢
还是以上面的f函数为例
f(x=1, 2) # 当我们吧关键字参数放前面 执行结果如下: File "F:/python/tt.py", line 9
f(x=1, 2)
SyntaxError: non-keyword arg after keyword arg
得出结论:关键字参数不能放在位置参数前面,这个是语法规定
f(1, x=2) 执行结果:
Traceback (most recent call last):
File "F:/python/tt.py", line 9, in <module>
f(1, x=2)
TypeError: f() got multiple values for keyword argument 'x'
得出结论:如果位置参数和关键字参数需要同时匹配
那么根据这两条,我们还可以总结出定义函数时的规范:
1.默认参数要写在普通参数的后面
2.关键字动态参数**kwargs要写在最后面
我们再来看看动态参数是怎么运行的:
普通动态参数:
def f(x, *args):
print(args)
f(1, 2, '', [1, 2, 3])
f(3, 2, [1, 2, 3])
运行结果:
(2, '', [1, 2, 3])
(2, [1, 2, 3])
普通动态参数会将传入的所有多余的位置参数组合成一个元祖
关键字动态参数:
def f(x, y=1, **kwargs):
print(kwargs)
f(1, 2, z=2, a=3, d=4)
f(3, 2, xx=2, name='xinlan', age=18)
运行结果:
{'a': 3, 'z': 2, 'd': 4}
{'age': 18, 'xx': 2, 'name': 'xinlan'}
关键字动态参数会将传入的多余的关键字参数组合成一个字典
案例:
d = {
'name': 'xinlan',
'age': 18
}
def f(**kwargs):
print(kwargs)
f(**d)
f(name='xinlan', age=18)
运行结果:
{'name': 'xinlan', 'age': 18}
{'name': 'xinlan', 'age': 18}
结论:将一个字典前加上**传入一个函数,相当于将这个字典中的键值对以关键字参数的形式传入函数。
案例:
l = ['python', 'php', 'java'] def f(*args):
print(args) f(*l)
f('python', 'php', 'java')
运行结果:
('python', 'php', 'java')
('python', 'php', 'java')
结论:将一个列表前加上*传入一个函数,相当于将这个列表中的元素按顺序传入函数
默认参数
默认参数的作用就是,如果我们在调用函数的时候不传入相应的参数,那么函数就用默认值
在定义函数的时候我们容易出现一个错误,看下面的例子:
def f(y=[]):
y.append('ok')
print(y) f()
f()
执行结果:
['ok']
['ok', 'ok']
我们调用了两次f函数,发现输出的结果不一样。这是因为列表,字典等这样的数据类型在调用的时候是引用它们的地址。
解释器在执行y=[]的时候,y指向的一个列表的引用地址,这个列表发生变化后,y指向的地址是没有变的
所以我们在定义函数的时候,默认参数不要定义成列表,字典等数据类型。当然我们有解决办法:
def f(y=None): # 这里None是一个占位符
if not y:
y = []
y.append('ok')
print(y) f()
f() 执行结果 ['ok']
['ok']
讲讲python中函数的参数的更多相关文章
- 深入理解python中函数传递参数是值传递还是引用传递
深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...
- Python中函数传递参数有四种形式
Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...
- python 中函数的参数
一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...
- python中函数的参数解析
python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...
- python中函数的参数
函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num(): a = 1 ...
- Python中函数的参数-arguments
归纳起来,Python中函数的定义形式和调用形式主要有如下几种形式: # 函数的定义形式 def func(name) # 匹配positional参数或者keyword参数 def func(nam ...
- python中函数的参数和返回值
目录 函数 目标 01. 函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 02. 函数的返回值 进阶 示例 -- 温度和 ...
- Python中函数的参数带星号是什么意思?
参数带星号表示支持可变不定数量的参数,这种方法叫参数收集. 星号又可以带1个或2个,带1个表示按位置来收集参数,带2个星号表示按关键字来收集参数. 1.带一个星号的参数收集模式: 这种模式是在函数定义 ...
- python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参
1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...
随机推荐
- E - 不爱学习的lyb HDU - 1789(贪心策略)
众所周知lyb根本不学习.但是期末到了,平时不写作业的他现在有很多作业要做. CUC的老师很严格,每个老师都会给他一个DDL(deadline). 如果lyb在DDL后交作业,老师就会扣他的分. 现在 ...
- 《Java基础复习》-控制执行流程
最近任务太多了,肝哭我了,boom 参考书目:Thinking in Java <Java基础复习>-控制执行流程 Java使用了C的所有流程控制语句 涉及关键字:if-else.whil ...
- [转发]对ThreadPoolExecutor初识
知识点提前预知: Java.util.concurrent.ThreadPoolExecutor类是ExecutorSerivce接口的具体实现.ThreadPoolExecutor使用线程池中的一个 ...
- iSCSI集群与存储
...
- php--理解PHP的依赖注入和laravel的服务容器
写在前面 为了了解laravel的服务容器在网上搜了许多文章,其中大多数都有其侧重点,没有很系统的一套东西以供参考,看完之后仍觉似乎少了一根把他们串起来的绳子,近期有幸拜读了陈昊的<Larave ...
- mpvue微信小程序http请求终极解决方案-fly.js
fly.js是什么? 一个支持所有JavaScript运行环境的基于Promise的.支持请求转发.强大的http请求库.可以让您在多个端上尽可能大限度的实现代码复用(官网解释) fly.js有什么特 ...
- 2017蓝桥杯算式900(C++C组)
题目:算式900 小明的作业本上有道思考题: 看下面的算式: (□□□□-□□□□)*□□=900 其中的小方块代表0~9的数字,这10个方块刚好包含了0~9中的所有数字. 注意:0不能作为某 ...
- spark error Caused by: java.io.NotSerializableException: org.apache.hadoop.hdfs.DistributedFileSystem
序列化问题多事rdd遍历过程中使用了没有序列化的对象. 1.将未序列化的变量定义到rdd遍历内部.如定义入数据库连接池. 2.常量定义里包含了未序列化对象 ,提出去吧 如下常量要放到main里,不能放 ...
- 15-场景中用到的资源监视器(perfmon metrics collector)
JMeter 无法提取除 Tomcat 之外的其他服务器的指标,因此PerfMon Metrics Collector可用来获取性能数据. PerfMon Metrics Collector使用的是S ...
- Powershell抓取网页信息
一般经常使用invoke-restmethod和invoke-webrequest这两个命令来获取网页信息,如果对象格式是json或者xml会更容易 1.invoke-restmethod 我们可以用 ...