一、形参和实参

1、形参:在函数定义()中出现的参数形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁

def fn(a, b, c):
print(a)
print(b)
print(c)
print(x)
print(y)
print(z) x = 100
y = 1000
z = 10000 # x, y ,z 是外界实际存在的值

2、实参:在函数调用()中出现的参数(外界实际存在的值)

调用函数时,实参可以有常量,变量,表达式或三种组合。

在函数的外部不能直接使用函数的形参,原因:函数调用完毕后,形参被销毁了

fn(10, 20, 30)
fn(x, y, z)
fn(x + 10, y * 2, z / 5)

二、实参的分类

1、位置实参:不用明确形参名的传参方式,一定按照位置给形参传值

def fn1(a, b, c):
print(a, b, c) fn1(10, 20, 30) # 必须按照顺序

2、关键字实参:必须明确形参名与值为形参传值,可以不用按照位置

def fn1(a, b, c):
print(a, b, c) fn1(a=10, b=20, c=30)
fn1(c=30, b=20, a=10) # 可以不用按照顺序

3、位置实参和关键字实参两者混用:

关键字实参必须出现在位置实参后

多个位置实参还是按照位置传参

关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序

def fn2(a, b, c, d, e, f):
print(a, b, c, d, e, f) fn2(10, 20, 30, e=100, f=500, d=200) # 结果为 10 20 30 200 100 500 fn1(10, c=20, a=30) # 10按位置传参给a,a=30给a传参,c可以拿到20,但b没人传参
# TypeError:fn1() got multiple values for argument 'a' a被多次传值

三、位置形参的范畴

1、位置形参:可以由‘位置实参’与‘关键字实参’来传值

def fn(a, b, c):
print(a, b, c) fn(10, 20, 30) # 结果为10 20 30
fn(a=10, b=20, c=30) # 结果为10 20 30

2、默认形参:可以由‘位置实参’与‘关键字实参’来传值,还可以不用传值(采用自身默认值)

def fn(a=10, b=20,):
print(a, b,) fn(20, 30) # 位置实参
fn(a=200, b=300) # 关键字实参
fn(100) # 没传值
fn(b=100) # 位置形参与默认形参同时存在,默认形参必须在后
def fn(a, b, d=1000, c=5000):
print(a, b, c, d)
fn(100, 200, d=1000) # 位置形参必须传值,默认形参分情况传值 # 结果为 100 200 5000 1000

3、可变长位置形参:只能由’位置实参’来传值(*****)

可变长形参会以元组形式接收,位置形参与默认形参没有接收完的,所有传入的位置实参,用索引来取第几个

def fn(a, b=500, *args):
print(a, b)
print(args)
fn(1, 20, 100, 200)
# 结果为
1 20
(100, 200) fn(100)
# 结果为
100 500
()

4、可变长形参的整体赋值:

def fn(*args):
print(args)
fn(1, 2, 3, 4, 5) # 结果为 (1, 2, 3, 4, 5) a = 'ab'
b = [1, 2]
c = (1, 2)
d = {1, 2}
fn(a) # 结果为 ('ab', )
fn(b) # 结果为 ([1, 2], )
fn(c) # 结果为 ((1, 2), )
fn(d) # 结果为 ({1, 2}, )

# 问就拿a,b,c,d进行传值,如何得到
# ('a', 'b')
# (1, 2) # 解答:通过 打散传值(本质传递的是地址)
fn(*a) # 结果为 ('a', 'b')
fn(*b) # 结果为 (1, 2)
fn(*c) # 结果为 (1, 2)
fn(*d) # 结果为 (1, 2) # 打散传值
def fn(*args):
print(args)
ls = [1, 2, 3, 4, 5]
fn(ls) # 结果为 ([1, 2, 3, 4, 5],)
fn(*ls) # 结果为 (1,2,3,4,5) # 将ls打散为1,2,3,4,5再进行传值

四、关键字形参的范畴

1、关键字形参:必须由 '关键字实参'来传值, 出现在*后的都是关键字形参(*****)

前提:出现在 * 之后的形参 。*为分割线,可以有变量名 *args, 也可以只用来做分隔

def fn(a, b=10, *, c, d=20, e):
pass a 位置形参
b 默认形参
c,e 无值关键字形参
d 有值关键值形参
注意:a和b有先后顺序,c,d,e无先后顺序
c,d,e都是出现在*之后,都是关键字形参,
由于必须由 关键字实参 来传值,没有顺序的强行要求
def tt(a, b=10, *, c, d=10, e):
print(a, b, c, d, e) def fn(*, a, b=10, c):
print(a, b, c)
fn(b=300, c=100, a=200) # 结果为 200 300 100 # 没有顺序的强行要求

2、可变长关键字形参:用来接收没有被‘关键字形参’接收完的关键字形参,也只能由关键字实参来传值

用字典来存放数据{}

def fn(*, a, b=20, c, **kwargs):
print(a, b)
print(kwargs)
fn(d=40, e=50, a=10, c=30)
# 结果为
10 20
{'d': 40, 'e': 50}

3、可变长关键字形参的整体赋值:

dic = {'name': 'Owen', 'age': 18}
def fn1(**kwargs):
print(kwargs)
fn1(**dic) # 结果为 {'name': 'Owen', 'age': 18} dd = {'k1': [1, 2, 3, 4, 5], 'k2': {"name":"Bob"}}
fn1(**dd) # 结果为 {'k1': [1, 2, 3, 4, 5], 'k2': {'name': 'Bob'}} def fn2(*args):
print(args)
ll = [1, [1, 2], {"name":"Bob"}]
fn2(*ll) # 结果为 (1, [1, 2], {"name":"Bob"})

五、参数总结

1、位置形参与默认形参: 能用 位置实参 关键字实参 传值

2、可变长位置形参:只能 位置实参 传值

3、所以关键字形参:只能 关键字实参 传值

def fn(a, b=10, *args, d, f=20, **kwargs):
print(a)
print(b)
print(args)
print(d)
print(f)
print(kwargs) 有位置实参传值: args和kwargs如果都能接收到值:
b必须传值且只能用位置实参传值,f可以不用传值
fn(1,2,3,4,d=5,g=6,k=7)
print()
# 结果为
12
(3, 4)
520
{'g': 6, 'k': 7} 全部用关键字实参传值
fn(x=100, y=200, d=300, b=400, a=500)
# 结果为
500400
()
30020
{'x': 100, 'y': 200}

day10 十 函数、形参和实参的更多相关文章

  1. 【学习笔记】--- 老男孩学Python,day10, 初识函数 形参、实参

    函数:对功能的封装语法: def 函数名(形参): 函数体 函数名(实参) 函数名:命名规则和变量一样 函数的返回值: return, 函数执行完毕. 不会执行后面逻辑 1. 如果函数中不写retur ...

  2. c++之函数形参和实参

    c++之函数形参和实参讲解 1.非地址型参数 在c++中实现模块化编程时,我们形成会遇到对自定义的函数模块传入参数的操作,即形参.这里主要讲解一个非地址型的形参. 不多说,先看代码: #include ...

  3. python之函数形参、实参、可变长参数整体使用和分类

    形参与实参 '''def fn(形参们): pass fn(实参们)'''# 形参:定义函数,在括号内声明的变量名,用来结束外界传来的值# 实参:调用函数,在括号内传入的实际值,值可以为常量.变量.表 ...

  4. python函数—形参、实参、位置参数、关键字参数

    1.通过def function_name([parameter]): 定义,函数一遇到return即结束运行.如果函数没有定义返回值,则返回None,如果定义了一个返回值,则返回该对象,如果一个re ...

  5. js函数形参和实参的区别

    在<Javascript权威指南>中这样定义: 参数有形参(parameter)和实参(argument)的区别,形参相当于函数中定义的变量,实参是在运行时的函数调用时传入的参数. 说明白 ...

  6. C++函数形参与实参交换

    c++中函数的实参传递到形参的值是单向的,改变形参并不会影响实参. #include <iostream> using namespace std; void swap(int a, in ...

  7. JavaScript中函数的形参和实参的实现原理剖析

    我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数: <script type="text/javascript"> function one(a,b,c) ...

  8. javascript . 03 函数定义、函数参数(形参、实参)、函数的返回值、冒泡函数、函数的加载、局部变量与全局变量、隐式全局变量、JS预解析、是否是质数、斐波那契数列

    1.1 知识点 函数:就是可以重复执行的代码块 2.  组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用 函数不调用,自己不会执行 同名函数会覆盖 ...

  9. Pyhton函数篇(一)之函数中的形参与实参

    1:什么是函数 函数其实就是带名字的代码块,用于完成一些具体的工作.如果我们在写一段程序的时候,需要多次用到同样的一个功能,如果每次都要重复写相同的代码,不仅会增加我们的代码量,更会让我们写出的代码让 ...

随机推荐

  1. SqlServer 对分组的内容进行拼接-group_concat

    SqlServer  对分组的内容进行拼接: 方案1:xml 子集,性能较差 方案2:借助 sqlCLR 接入.实现group_concat.性能完美,但是 阿里云的不支持!!!! CREATE TA ...

  2. UnDistracted for Mac(集中注意力辅助工具)破解版安装

    1.软件简介    UnDistracted 是 macOS 系统上一款可以帮助我们集中注意力的辅助工具,让我们在 mac 电脑上工作更加集中注意力,提高工作效率,隐藏所有文件或是文件夹窗口.隐藏所有 ...

  3. C#通过DSOFile读取与修改文件的属性

    搜了一圈用C#读取与修改文件属性的文章,结果几乎找不到- -: 偶然间看到一个DSOFile工具,然后找到了对该工具进行详细讲解的一篇文章:<DSOfile,一个修改windows系统文件摘要的 ...

  4. 各个屏幕的logo尺寸要求

    DENSITY SIZE LOCATION RATIO SCREEN MARGIN XXXHDPI 192×192 drawable-xxxhdpi 4 640 DPI 12 to 16 pixels ...

  5. 处理用千牛导出淘宝数据,供Logstash到Elasticsearch使用。(NodeJS)

    var rf=require("fs"); // 加载编码转换模块 //npm install iconv-lite var iconv = require('iconv-lite ...

  6. Java多线程并发最佳实践

    使用本地变量 尽量使用本地变量,而不是创建一个类或实例的变量. 使用不可变类 String.Integer等.不可变类可以降低代码中需要的同步数量. 最小化锁的作用域范围:S=1/(1-a+a/n) ...

  7. JAVA 线程池架构浅析

    经历了Java内存模型.JUC基础之AQS.CAS.Lock.并发工具类.并发容器.阻塞队列.atomic类后,我们开始JUC的最后一部分:线程池.在这个部分你将了解到下面几个部分: 线程池的基础架构 ...

  8. GDB用法简要整理

    [时间:2017-05] [状态:Open] [关键词:gdb,调试,debug,用户手册] 使用gdb是需要在编译是指定-g命令,在可执行文件中添加符号信息. 1. 启动和退出 可以使用gdb gd ...

  9. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-9底层驱动之USART

    视频简介:该视频介绍iCore3应用开发平台中RTC的基本配置方法以及在应用开发平台中RS-232, RS-485,RS-232的硬件实现方法. 源视频包下载地址:链接:http://pan.baid ...

  10. winform 操作注册表提示没有权限解决办法

    1.打开VS2005.VS2008.VS2010.VS2012.VS2013.VS2015工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式 ...