python中的函数调用时除了对位传参。 关键字传参。 默认参数以外还提供了以下传参方式。

一。可变参数

顾名思义可变参数就是参数的个数是可变的,可以是任意1个或者多个,由于参数的数量不确定所以我们要把实际参数定义为列表或者元组。

def sun(arr):add_data = 0for i in arr:add_data += ireturn add_dataa = sun((1, 2, 3, 4, 5))
print(a)
b = sun([1, 2, 3, 4, 5])
print(b)c = sun([1, 2, 3])
print(c)
d = sun((1, 2, 3))
print(d)

我们可以发现当在函数调用时传入元素个数不等的列表活着元组时都能得到正确的结果。这就是可变参数的用法。

不仅如此可变参数还有简写方式。 请看示例

def sun(*arr):add_data = 0for i in arr:add_data += ireturn add_dataa = sun(1, 2, 3, 4, 5)
print(a)c = sun(1, 2, 3)
print(c)

此时我们发现只需要在形式参数的前面加上“*”就可以在函数调用是不必关心传入的是列表还是元组了。还是能正确的得到相应的结果。 这种写法即使不传任何参数代码也不会抛出异常。

def sun(*arr):add_data = 0for i in arr:add_data += ireturn add_dataa = sun()
print(a)0

在来看一个新的情况。 假如说形式参数前面加了“*”,我在函数调用的时候实际参数和一个列表或者元组。假如直接把这个列表或元组直接传进去会出现怎么结果。

def sun(*arr):add_data = 0for i in arr:add_data += ireturn add_dataa = sun((1, 2, 3, 4))
print(a)Traceback (most recent call last):File "/Users/apple/Documents/重要文件/python3/python21.py", line 7, in <module>a = sun((1, 2, 3, 4))File "/Users/apple/Documents/重要文件/python3/python21.py", line 4, in sunadd_data += i
TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'

很显然这样python无法识别这种调用方式来计算结果。那我能不能逐个传呢?

def sun(*arr):add_data = 0for i in arr:add_data += ireturn add_datad = (1, 2, 3, 4)
a = sun(d[0], d[1], d[2], d[3])
print(a)10

事实证明这样是可以的。 但是新的问题随之产生了。假如列表或者元组里的元素有1000个呢。 这样写显然不现实。 所以一种新的写法解决了这一问题。

def sun(*arr):add_data = 0for i in arr:add_data += ireturn add_datad = (1, 2, 3, 4)
a = sun(*d)
print(a)10

我们不仅得到了想要的结果。而且只需要在实参i前也加一个“*”就得意解决问题。 这是一种常见的写法。

二。命名关键字参数

对于前面说到的关键字传参。我们在设置关键字参数时没有做任何限制。 也就是想把这个参数设置为关键字传参。在调用的时候设置成关键字传参即可,例如

def person(age, tall, city, name):person1 = {"name": name,"age": age,"tall": tall,"city": city}print(person1)
#  设置名字为关键字参数
person(23, 178, "成都", name="雯倾浅忆")#  设置城市和名字为关键字参数
person(23, 178, city="成都", name="雯倾浅忆"){'name': '雯倾浅忆', 'age': 23, 'tall': 178, 'city': '成都'}
{'name': '雯倾浅忆', 'age': 23, 'tall': 178, 'city': '成都'}

假如说我们要检查age和tall有没有设置为关键字参数该怎么办呢?需要在函数内部通过kw检查。示例如下。

def person(age, name, **kw):if "tall" in kw and "city" in kw:person1 = {"name": name,"age": age,}print(person1)
#  设置名字为关键字参数
person(23, 178, tall=178, city="成都"){'name': 178, 'age': 23}

那么很显然如果tall和city中的任何一个不是关键字传参的话是不会成功打印对象的。

def person(age, name, **kw):if "tall" in kw and "city" in kw:person1 = {"name": name,"age": age,}print(person1)else:print("参数不全  无法打印对象")
#  设置名字为关键字参数
person(23, 178, city="成都")参数不全  无法打印对象

那么新的问题有产生了上述代码中形式参数**ke到底是个什么东西呢?示例如下

def person(age, name, **kw):if "tall" in kw and "city" in kw:print(kw)else:print("参数不全  无法打印对象")
#  设置名字为关键字参数
person(23, 178, tall=178, city="成都"){'tall': 178, 'city': '成都'}

原来kw代表的是命名关键字组成的字典。知道了这一点就可创建在原始的关于person1的字典了。 示例如下

def person(age, name, **kw):if "tall" in kw and "city" in kw:person1 = {"name": name,"age": age,"tall": kw['tall'],"city": kw['city']}print(person1)else:print("参数不全  无法打印对象")
#  设置名字为关键字参数
person(23, 178, tall=178, city="成都"){'name': 178, 'age': 23, 'tall': 178, 'city': '成都'}

上面的写法有存在一个新的问题。就是我可不可设置多余的关键字参数呢?

def person( name, **kw):if "tall" in kw and "city" in kw:print(kw)else:print("参数不全  无法打印对象")
#  设置名字为关键字参数
person("小王", age=23, tall=178, city="成都"){'age': 23, 'tall': 178, 'city': '成都'}

显然这与我们只需要tall和city为关键字的参数的意愿不符合,也就是说调用者仍可以传入不受限制的关键字参数。此时如果要限制关键字参数的名字,就可以用命名关键字参数,示例如下

def person(age, tall, *, city, name):person1 = {"name": name,"age": age,"tall": tall,"city": city}print(person1)person(23, 178, city="成都", name="雯倾浅忆"){'name': '雯倾浅忆', 'age': 23, 'tall': 178, 'city': '成都'}

和**ke不同的是命名关键字参数需要用”*“而其后的参数将被视为命名关键字参数。如果不设置会抛出异常

def person(age, tall, *, city, name):person1 = {"name": name,"age": age,"tall": tall,"city": city}print(person1)person(23, 178, "成都", name="雯倾浅忆")Traceback (most recent call last):File "/Users/apple/Documents/重要文件/python3/python21.py", line 10, in <module>person(23, 178, "成都", name="雯倾浅忆")
TypeError: person() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

如果形参中存在一个可变参数。则其后的命名关键字参数不需要符号分隔

def person(age, tall, *arr, city, name):person1 = {"name": name,"age": age,"tall": tall,"city": city,}print(person1)print(arr)person(23, 178, [1, 2, 2], city="成都", name="雯倾浅忆"){'name': '雯倾浅忆', 'age': 23, 'tall': 178, 'city': '成都'}
([1, 2, 2],)

在存在可变参数的情况下。其后面跟随的参数必须视为命名关键字参数。否则会抛出异常

def person(age, tall, *arr, city, name):person1 = {"name": name,"age": age,"tall": tall,"city": city,}print(person1)print(arr)person(23, 178, [1, 2, 2], "成都", "雯倾浅忆")Traceback (most recent call last):File "/Users/apple/Documents/重要文件/python3/python21.py", line 11, in <module>person(23, 178, [1, 2, 2], "成都", "雯倾浅忆")
TypeError: person() missing 2 required keyword-only arguments: 'city' and 'name'

命名关键字参数可以设置默认值在调用时可以不必传值

def person(age, tall, *, city="成都", name):person1 = {"name": name,"age": age,"tall": tall,"city": city}print(person1)person(23, 178, name="雯倾浅忆"){'name': '雯倾浅忆', 'age': 23, 'tall': 178, 'city': '成都'}

三。参数组合

在Python中定义函数,可以用必选参数(位置参数)、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数(位置参数)、默认参数、可变参数、命名关键字参数和关键字参数。

零基础入门python3.7 ——基础知识总结(十二) 函数进级相关推荐

  1. 【零基础】Python3学习课后练习题(十二)

    本文是跟着鱼C论坛小甲鱼零基础学习Python3的视频学习的,课后题也是跟随每一课所附属的题目来做的,根据自己的理解和标准答案记录的笔记. 第十四课 测试题: 0.如何定义一个跨越多行的字符串吗(请至 ...

  2. 【尚硅谷】Web前端零基础入门HTML5+CSS3基础教程

    [尚硅谷]Web前端零基础入门HTML5+CSS3基础教程 学习视频来源:哔哩哔哩弹幕网(https://www.bilibili.com/video/BV1XJ411X7Ud?spm_id_from ...

  3. WIFI基础入门--802.11--MAC基础--2

    WIFI基础入门--802.11--MAC基础--2 1.故障排查工具 2.优化无线网络 3.关键点 4.面临挑战 4.1 射频链路质量 5.隐藏节点 6.访问模式与时机 6.1 DCF(分布式协调功 ...

  4. 【深度学习】:《PyTorch入门到项目实战》(十二)卷积神经网络:填充(padding)和步幅(stride)

    [深度学习]:<PyTorch入门到项目实战>(十二)填充(padding)和步幅(stride) ✨本文收录于[深度学习]:<PyTorch入门到项目实战>专栏,此专栏主要记 ...

  5. 【深度学习笔记】零基础入门深度学习必备知识

    文章目录 1.[深度学习必备基础知识] 2.[入门必备数学知识] 3.[Python必备基础] 4.[深度学习框架开发基础入门] 1.[深度学习必备基础知识] 深度学习的发展历程 机器学习 深度学习如 ...

  6. C++零基础入门教程:基础篇(一)

    前言 嘿嘿,我叕来啦─=≡Σ(((つ•̀ω•́)つ!别问我为什么突然变成了零基础入门教程(一),因为前面那三篇都是基础的不能在基础的教程了.(其实是因为顺序乱了,而且那时候没有单独弄一个专栏,后面我会 ...

  7. python编程语言零基础入门,Python编程基础知识点

    python语言基础知识有哪些? python语言基础知识如下:1.Python语言是一种解释型.面向对象的编程语言,是一种开源语言.2.表达式从左到右在同一个基准上书写. 3.对象的含义:对象是某个 ...

  8. 鱼c论坛python课后题-【零基础】Python3学习课后练习题(十九)

    本文是跟着鱼C论坛小甲鱼零基础学习Python3的视频学习的,课后题也是跟随每一课所附属的题目来做的,根据自己的理解和标准答案记录的笔记. 第二十一课 测试题: 0.请使用lambda表达式将下边函数 ...

  9. Python基础入门_5面向对象基础

    Python 基础入门前四篇: Python 基础入门–简介和环境配置 Python基础入门_2基础语法和变量类型 Python基础入门_3条件语句和迭代循环 Python基础入门_4函数 第五篇主要 ...

最新文章

  1. 特斯拉2021全年交付近百万辆,同比暴涨87%,马斯克:了不起!
  2. HOG特征检测学习笔记
  3. Gentoo 安装日记 04 (开启ssh服务,ssh登录虚拟机)
  4. GDCM:区分音量DiscriminateVolume的测试
  5. 安卓ps2模拟器_安卓PSP模拟器评测:合金装备 和平步行者
  6. 《Unit Testing》1.1 -1.2 单元测试的目的
  7. 送分题,ArrayList 的扩容机制了解吗?
  8. 转 - Web新人(偏前端)应该怎样学习(个人观点,勿喷)
  9. 科沃斯扫地机器人电路原理图_科沃斯扫地机器人不工作故障维修(CEN550)
  10. GIS专业书籍、文档、数据、网站、工具等干货
  11. CCF NOI 2022获奖名单
  12. 暗黑类游戏的设计概念
  13. 在visio中不借助公式编辑器在字母上方打波浪线
  14. 基于DAMO-YOLO的RepGFPN多尺度特征融合的YOLOv5、YOLOv7、Faster RCNN、FCOS、CenterNet等目标检测器改进
  15. 第五届世界互联网大会 乌镇新“网事” 世界新期待
  16. ExpandableListView讲解
  17. via自定义搜索引擎代码_Via浏览器自定义主页
  18. Chap.15 总结《CL: An Introduction》 (Vyvyan Evans)
  19. 列表 元祖 字典
  20. tongyongjingmo(yuangang2)

热门文章

  1. 苹果微信点开才会收到信息_视频|为保用户隐私,苹果虚拟邮箱即将上线!网友:能告别垃圾短信?...
  2. 微信如何发送超大的gif
  3. 基于四维地图(四维图新)api进行逆地理编码
  4. DBeaver 下载安装
  5. python大学公众号_推荐几个专业的技术公众号
  6. 基于c#的区块链编程_C#编程之C#区块链零基础入门,学习路线图
  7. python读取rtf文件_【Python】【IO】文件读写
  8. ACL 2022 | 腾讯AI Lab入选20篇论文:写作助手和交互翻译背后的技术创新
  9. 厚膜电阻和合金电阻的区别都有哪些?快来看看吧
  10. python for循环换行_python for循环换行_day08-循环之for循环