函数的传递方式&不定长参数&参数解包

2023-11-13

1.函数简介

  • 函数也是一个对象
  • 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用

结构如下:

语法
def 函数名([形参1,形参2,形参3....]):
    代码块
注意:函数名必须符合标识符的规范(可以包含字母、数字、下划线但是不能以数字开头)

例1:列表作为函数对象实例

#列表是一个可变对象
a=[1,2,3]
b = a
b=[5,6,7]  #这个操作是在给变量重新赋值,会改变变量指向的对象
print('a=',a,id(a))  #a= [1, 2, 3] 2072714764872
print('b=',b,id(b))  #b= [5, 6, 7] ![2072714764936]

a=[1,2,3]
b = a
b[0]=10 # (改对象   该对象里面的值)  
#这个操作通过变量来修改对象里面的值,不会改变变量a,b所指向的对象(列表)
print('a=',a,id(a))  #a= [10, 2, 3] 2623879275080
print('b=',b,id(b))  #b= [10, 2, 3] 2623879275080

图解:
1)通过变量来修改对象里面的值,不会改变变量a,b所指向的对象(列表)
2)给变量重新赋值,会改变变量指向的对象

在这里插入图片描述
例2:函数需要调用才能实现其功能

# fn 为函数对象   fn()为函数调用 
def fn():
    print('这是一个函数')
    print('黑猫')
fn() 

这是一个函数
黑猫

2 函数的参数

2.1 形参和实参

  • 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
  • 实参(实际参数)指定了形参,那么在调用函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参

例3:在定义函数时可以在括号后面定义数量不等的形参,多个形参用逗号隔开

#定义一个函数  可以用求任意2个数的和
#在定义函数时可以在括号后面定义数量不等的形参,多个形参用逗号隔开
def s(a,b):
    #print('a=',a)
    #print('b=',b)
    print(a,'+',b,'=',a+b )
s(1,2)  #3

2.2 函数的传递方式

  • 定义形参时,可以为形参指定默认值。指定了默认值以后,如果用户传递了参数则默认值不会生效。如果用户没有传递,则默认值就会生效。
def fn(a,b,c=10):   #c=10该形参是默认值
    print('a=',a)
    print('b=',b)
    print('c=',c)

fn(1,2,3)  #a=1,b=2  c=3用户传递了参数则默认值不会生效
fn(1,2)   #a=1,b=2,c=10  用户没有传递,则默认值就会生效

2.2.1 位置传参

  • 定义:就是将对应位置的实参赋值给对应位置的形参
fn1(1,2,3) --> def fn1(a,b,c)  1-->a  2--b,  3-->c

2.2.2 关键字传参

  • 定义:可以不按照形参定义的顺序去传递,而根据参数名进行传递
def fn2(a,b,c):
    print('a=',a)
    print('b=',b)
    print('c=',c)
fn2(a=1,b=2,c=3)  #位置传参和关键字传参可以混合使用 a=1,b=2,c=3
fn2(c=31,2)  #会报错   关键字传参要在位置传参的后面
fn2(1,2,c=3)  #a=1,b=2,c=3

总结

  • 函数的传递方式有两种:位置传参和关键字传参,且二者可以混合使用,但是关键字参数必须在位置参数之后

2.3 函数的实参类型

  • 实参可以传递任意类型的对象
  • 函数在调用的时候解析器不会检查实参的类型

几种常见类型如下:

def fn(a,b,c):
    print('a=',a)
    print('b=',b)
    print('c=',c)

def fn3(a):
    print('a=',a)
fn3(123)   #int型  a= 123
fn3([1,2,3])  # 列表 a= [1, 2, 3]
fn3(True)  # bool型  a= True
fn3('python')    #字符型   a= python

# 实参是一个函数对象,而不是一个函数调用,因此不是fn()
fn3(fn)  # a= <function fn at 0x000001B08B76D1E0>
但是注意:int类型和str类型不可相加
def fn4(a,b):
    print(a+b)
fn4(1,'2')  #会报错  int类型和str类型不可相加

例:实参为可变对象列表时的特殊情况

def fn5(a):
    #在函数中对形参重新赋值,不会影响其他变量
    #a是一个列表,修改列表里面的元素,如果形参是一个可变对象,当我们修改对象(改变对象的值)会影响
    #到所指向该对象的值
    a[0]=10
    print('a =',a)
c=[1,2,3]
fn5(c)  # a = [10, 2, 3]
print('c =',c)  #c = [10, 2, 3]
#  若想要将二者关联解除,可以这样做:
# c.copy() 拷贝方式
fn5(c.copy)  # a = [10, 2, 3]  相当于创建了一个c的副本,因此副本修改时,原版c不受影响
print('c =',c)  # c = [1, 2, 3]  
# c[:] 切片方式
fn5(c[:])  # a = [10, 2, 3]
print('c =',c)  # c = [1, 2, 3]

2.4 不定长参数

  • 定义函数时,可以在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
def fn(*b):
    print('b = ',b,type(b))
# *b 会接受所有的位置实参,并且会将这些实参统一保存到一个元祖中
fn(1,2,3,4,5,6,7,8)   # b =  (1, 2, 3, 4, 5, 6, 7, 8) <class 'tuple'>

例:求任意个参数和

def s(*b):
    #定义一个变量  保存结果
    r=0
    for i in b:
        r += i
    print(r)
s(1,2,300)  #303
  • 带*号的形参只能有一个,可以和其他参数配合使用
def s(a,*c,b):
   print('a = ',a)
   print('b = ',b)
   print('c = ',c)
s(1,2,300,b=50)   # a = 1,b = 50,c =  (2, 300)
  • *形参只能接受位置参数,不能接受关键字参数
def fn(*b):
    print('b = ',b)
fn(b=1,d=2,c=3)   #TypeError: fn() got an unexpected keyword argument 'b'
注:引入**参数:**形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
def fn(**args):
    print('args = ',args)
fn(b=1,d=2,c=3)  #args =  {'b': 1, 'd': 2, 'c': 3}
#*name 处理的是位置参数,**name 处理的是关键字参数
def fn1(a,*b,**c):  #  **形参只有一个,并且必须写在所有参数的后面
    print('a =',a)
    print('b =',b)
    print('c =',c)
    print('e =',c['e'])

fn1(1,2,3,4,e = 50, f= 80)  #a = 1,b = (2, 3, 4),c = {'e': 50, 'f': 80},e =50

2.5 参数的解包

  • 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
def fn(a,b,c):
   print('a = ',a)
   print('b = ',b)
   print('c = ',c)

#实参为元组
t=(1,2,3)  
fn(t[0],t[1],t[2])
fn(*t)  # *t会将t中的元素依次传给形参
#结果:
a =  1
b =  2
c =  3
a =  1
b =  2
c =  3

# 实参为字典
d={'a':1,'b':2,'c':3}
fn(**d)
# 结果
a =  1
b =  2
c =  3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数的传递方式&不定长参数&参数解包 的相关文章

随机推荐

  • 数字化时代-26:不要做数字空间的难民

    网络是人们新的生存空间 年轻人出生后就存在的空间 与人类社会原先的现实空间并存的人与人交流的空间 在这个空间中 没有自己位置的人 将成为未来社会的难民 年轻人 特别是毕业后的年轻人 需要思考 个人在数字空间中的落脚点和位置 数字原住民 在数
  • Ubuntu 20.04-NVIDIA显卡驱动-安装和卸载-解决黑屏问题

    这一步很重要 202300704更新 黑屏问题主要由linux内核更新导致 一定要保持当前的内核 也就是安装 NVIDIA 驱动时用的内核 sudo apt mark hold linux image generic linux heade
  • Cuda矩阵运算库cuBLAS介绍

    文章目录 简介 cuBLAS库新特性 cuBLAS代码热身 cublasSetMatrix cudaMalloc cublasSscal 源代码 cuBLAS 辅助函数 上下文管理 复制矩阵 数据类型标示 cuBLAS 运算函数 矩阵相乘
  • 有趣的 Async hooks 模块

    在 Node js 中 Async hooks 是一个非常有意思且强大的模块 虽然性能上存在一些问题 在 APM 中 我们可以借助这个模块做很多事情 本文介绍两个有趣的用法 AsyncLocalStorage 在 Node js 中 上下文
  • PaddlePaddle Hackathon 飞桨黑客马拉松热身赛上线!

    挑战自我 拓展技能 激发创新 挑战极限 再次相遇黑客松 我们期待你的加入 第五期 PaddlePaddle Hackathon 飞桨黑客马拉松热身赛上线 本次活动是面向全球开发者的深度学习领域编程活动 鼓励开发者了解和参与飞桨深度学习开源项
  • 如何制作一个简单的网页

    先创建一个文本文档 将后缀名改为 html 然后右击这个 选择打开方式 用记事本打开 开头与结尾要用来写 后一个要加 头部用head 中间部分用body 背景颜色用bgcolor 填一种颜色 字体颜色用text 填一种颜色 切记用英文 你如
  • ubuntu16.04 安装交叉编译工具aarch64-linux-gnu-gcc/g++

    前言 最近需要把人脸识别代码放到RK3399Pro的嵌入式板子上 所以编写好的c 代码要放到板子上编译 或者在ubuntu系统上使用交叉编译工具 编译好可执行文件在放到板子里运行 为了在能在ubuntu系统上能交叉编译 安装aarch64
  • 复杂场景下智能汽车目标检测心得体会

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 引言 一 复杂背景目标检测的复杂是什么 二 目标检测环境的复杂性包含哪些 三 复杂场景目标检测的目标复杂性包含哪些 四 复杂场景目标检测的算法复杂性包含什么 五 总
  • 微信小程序使用face++实现人脸识别登录注册

    Face 是一个 人工智能开放平台 要使用它我们得先注册并进入控制台创建API Key 这是前提 平台网址 https www faceplusplus com cn 整个项目代码我已经上传到网盘 链接 https pan baidu co
  • 高频面试题:服务器CPU占用过高怎么办?搞定只需简单7步

    一 前言 在Java开发岗位的面试中 时不时会出现一些运维类的题目 其实这也反映了后端面试的一种趋势 现在企业对后端开发的要求越来越全面 不仅要求我们会写代码 还要我们能够进行部署和运维 今天九哥就结合一个真实的项目案例 来给大家讲解一道关
  • C语言中局部变量和全局变量在内存中的存放位置

    C语言中局部变量和全局变量变量的存储类别 static extern auto register 1 局部变量和全局变量 在讨论函数的形参变量时曾经提到 形参变量只在被调用期间才分配内存单元 调用结束立即释放 这一点表明形参变量只有在函数内
  • 信号是如何传输的

    一 信号 信息 人对现实世界事物存在方式或运动状态的某种认识 数据 用于描述事物的某些属性的具体量值 信号 信息传递的媒介 一 信号的分类 1 模拟信号 模拟信号是信号参数 幅度 频率等 大小连续变化的电磁波 可以以不同的频率在媒体上传输
  • springboot + vue 前端时间字符串,后台LocalDateTime 参数接收方法

    前端格式以 2020 05 09 10 55 22 这样的格式传值 后台实体类LocalDateTime 添加注解 即可接收到值 DateTimeFormat pattern yyyy MM dd HH mm ss JsonFormat p
  • day4:最长回文子串

    文章目录 问题描述 思路 实现代码 问题描述 给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 示例 1 输入 babad 输出 bab 注意 aba 也是一个有效答案 示例 2 输入 cbbd 输出
  • [医疗相关任务]

    药物研发 GLAM
  • 【Linux】IO多路复用--poll函数基本处理流程

    poll 函数在服务端流程图 当我们的已连接套接字时间就绪 也就是connfd已连接套接字读事件就绪时候 那么我们就要读取接受缓冲区的数据 但是我们不能保证我们一次读取就能够读完 所以我们需要循环读取 那么就需要在应用层设置一个该connf
  • c:Bubble Sort

    file SortAlgorithm h brief 业务操作方法 VSCODE c11 author geovindu Geovin Du date 2023 09 19 ifndef SORTALGORITHM H define SOR
  • Opencv dft & idft

    Load an image cv Mat inputImage cv imread argv argc 1 0 Go float cv Mat fImage inputImage convertTo fImage CV 32F FFT st
  • HTML的无序列表、有序列表、自定义列表

    HTML的无序列表 1 无序列表是一个项目的列表 此列项目使用粗体圆点 典型的小黑圆圈 进行标记 无序列表始于 ul 无序列表 ul type disc li HTML li li CSS li li li ul ul
  • 函数的传递方式&不定长参数&参数解包

    文章目录 1 函数简介 2 函数的参数 2 1 形参和实参 2 2 函数的传递方式 2 2 1 位置传参 2 2 2 关键字传参 2 3 函数的实参类型 2 4 不定长参数 2 5 参数的解包 1 函数简介 函数也是一个对象 函数用来保存一