讲讲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值,但是没有限制个数 ...
随机推荐
- scrapy Selector用法及xpath语法
准备工作 html示例: <?xml version="1.0" encoding="UTF-8"?> <html <head> ...
- 你还不知道Vue的生命周期吗?带你从Vue源码了解Vue2.x的生命周期(初始化阶段)
作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...
- 整数回文数判断 Python
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 输入:123 输出:false 输入:-121 输出:false 输入:121 输出:true 输入:1 ...
- HDU1087:Super Jumping! Jumping! Jumping!(DP水题)
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- Servlet 中文乱码问题解析及详细解决方法
使用 servlet 向客户端浏览器回送中文时,经常出现中文乱码的问题,这里给大家完完全全地搞明白: 一.基本常识 中文系统默认是 GBK 编码(GBK是对GB2312的补充,包含它) 需要处理编码问 ...
- js定义类的方法
ECMAScript6已经支持了class,但之前版本都不支持类,但是可以通过一些方法来模拟类. js中的类,既是重点,也是难点,很多时候都感觉模棱两可. 首先强调一下js中很重要的3个知识点:thi ...
- Flask 入门(十二)
Blueprint ,听说过么? 那必须的啊!但它是干嗒的?也不难理解! 如果你的项目是一个公司,Blueprint就是治理你的公司的 没有Blueprint,你的公司除了老板就是员公 有了Bluep ...
- 28.3 api--date 日期 (日期获取、格式化)
/* * Date: 表示特定的瞬间,精确到毫秒,他可以通过方法来设定自己所表示的时间,可以表示任意的时间 * System.currentTimeMillis():返回的是当前系统时间,1970-1 ...
- alg-查找只出现一次的数
//只有2个数出现1次,其余的数都出现2次 class Solution { public: vector<int> singleNumber(const vector<int> ...
- python 性能测试
python中使用的性能测试模块是memory_profiler , 我们使用它里面的profile这个装饰器即可测试出我们的代码的内存使用情况了. 如果没有安装 memory_p ...