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中函数的参数的更多相关文章

  1. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  2. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  3. python 中函数的参数

    一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...

  4. python中函数的参数解析

    python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...

  5. python中函数的参数

    函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num(): a = 1 ...

  6. Python中函数的参数-arguments

    归纳起来,Python中函数的定义形式和调用形式主要有如下几种形式: # 函数的定义形式 def func(name) # 匹配positional参数或者keyword参数 def func(nam ...

  7. python中函数的参数和返回值

    目录 函数 目标 01. 函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 02. 函数的返回值 进阶 示例 -- 温度和 ...

  8. Python中函数的参数带星号是什么意思?

    参数带星号表示支持可变不定数量的参数,这种方法叫参数收集. 星号又可以带1个或2个,带1个表示按位置来收集参数,带2个星号表示按关键字来收集参数. 1.带一个星号的参数收集模式: 这种模式是在函数定义 ...

  9. python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参

    1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...

随机推荐

  1. c#的全局异常捕获

    以下操作在Program.cs中 1.最简单的方式try...catch.. 一般用在某一段容易出错的代码,如果用在整个软件排查,如下所示 static void Main() { try { App ...

  2. P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)

    P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...

  3. async和await是如何实现异步编程?

    目录 异步编程样例 样例解析 浅谈Promise如何实现异步执行 参考 1.异步编程样例 样例: // 等待执行函数 function sleep(timeout) { return new Prom ...

  4. cls

    class : python中cls代表的是类的本身,相对应的self则是类的一个实例对象. class Person(object): def __init__(self, name, age): ...

  5. docker下简单搭建redis

    前提是我们已经安装了docker 一.拉取官方镜像,标签为3.2 # docker pull redis:3.2 等待下载完成后我,我们可以在本地镜像列表中查到repository 为redis,标签 ...

  6. WinForm中DataGridView复制选中单元格内容解决方案

    WinForm中DataGridView鼠标选中单元格内容复制方案 1.CTR+C快捷键复制 前提:该控件ClipboardCopyMode属性设置值非Disable: 2.鼠标框选,自定义代码实现复 ...

  7. 直播 | Apache Kylin & Apache Hudi Meetup

    千呼万唤始出来,Meetup 直播终于来啦- 本次线上 Meetup 由 Apache Kylin 与 Apache Hudi 社区联合举办,将于 3 月 14 日晚进行直播,邀请到来自丁香园.腾讯. ...

  8. python部署-Flask+uwsgi+Nginx

    一.Flask部分(app.py) flask即Python代码:部分参考代码如下,相信很多人如果看到这篇文章一定有flask的代码能力. from app import create_app fro ...

  9. javascript入门 之 ztree(二 标准json数据)

    1.代码 <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - Standard Data </T ...

  10. json格式的文件操作2

    1.字典转换为字符串(json.dumps) jsongeshi={"name":"yajuan","age":"10" ...