前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >你所不知道的Python | 函数参数的演进之路

你所不知道的Python | 函数参数的演进之路

作者头像
simpleapples
发布于 2018-10-18 06:54:36
发布于 2018-10-18 06:54:36
47000
代码可运行
举报
文章被收录于专栏:Python私房菜Python私房菜
运行总次数:0
代码可运行

函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的代码,也能处理复杂的调用。

01

关键字参数

调用时指定参数的名称,且与函数声明时的参数名称一致。

关键字参数是Python函数中最基础也最常见的,我们写一个记账的函数,参数是需要记录的时间和金额。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1def add_record(date, amount):
2    print('date:', date, 'amount:', amount)

这里的amount参数就是一个关键字参数,关键字参数支持两种调用方式:

  • 位置调用
  • 关键字调用

位置调用,就是按参数的位置进行调用,例如传入两个参数,第一个是字符串2018-07-06,第二个是整数10,那么这两个参数会被分别赋予date和amount变量,如果顺序反过来,则这两个参数分别赋予amount和date变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1add_record('2018-07-06', 10)  # 输出date: 2018-07-06 amount: 10
2add_record(10, '2018-07-06')  # 输出date: 10 amount: 2018-07-06

关键字调用,可以忽略参数顺序,直接指定参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1add_record(amount=10, date='2018-07-06')  # 虽然参数顺序反了,但是使用了关键字调用,所以依然输出date: 2018-07-06 amount: 10

02

仅限关键字参数

我们定义一个Person类,并实现它的__init__方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1class Person(object):
2    def __init__(self, name, age,  gender, height, weight):
3        self._name = name
4        self._age = age
5        self._gender = gender
6        self._height = height
7        self._weight = weight

当初始化这个类的时候,我们可以使用关键字调用,也可以使用位置调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1Person('Wendy', 24, 'female', 160, 48)
2Person('John', age=27, gender='male', height=170, weight=52)

对比上面两种方式,我们会发现参数多的时候通过关键字指定参数不仅更加清晰,也更具有可读性。如果我们希望函数只允许关键字调用,该如何做呢?Python 3.0中,引入了一种新的仅限关键字参数,能实现我们的需求。

下面将age以后的参数修改为只允许关键字调用,定义函数时想指定仅限关键字参数,要把它们放到前面有星号的参数后面,在Python中有星号的参数是可变参数的意思,如果不想支持可变参数,可以在参数中放一个星号作为分割。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1class Person(object):
 2        # 参数中的星号作为关键字参数和仅限关键字参数的分割
 3    def __init__(self, name, *, age='22', gender='female', height=160, weight=50):
 4        self._name = name
 5        self._age = age
 6        self._gender = gender
 7        self._height = height
 8        self._weight = weight
 9
10Person('Wendy', 24, 'female', 160, 48)  # 报错,age以后参数不允许位置调用
11Person('John', age=27, gender='male', height=170, weight=52)  # 正常执行

普通参数和仅限关键字参数中间由一个星号隔离开,星号以后的都是仅限关键字参数,只可以通过关键字指定,而不能通过位置指定。

03

参数默认值

在函数声明时,指定参数默认值,调用时不传入参数则使用默认值,相当于可选参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1def add_record(date, amount=0):
2    print('date:', date, 'amount:', amount)
3
4add_record('2018-07-06')  # 输出date: 2018-07-06 amount: 0

上面代码中没有传入amount参数,所以amount直接被置为默认值0。有一点需要注意的是,默认参数需要设置在必选参数后面,并且默认参数既可以通过位置调用,也可以通过关键字调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1add_record('2018-07-06', 10)  # 通过位置指定参数
2add_record('2018-07-06', amount=10)  # 通过位置指定参数
3add_record(amount=10, '2018-07-06')  # 报错,默认参数必须在必选参数后面

参数默认值既支持关键字参数,也支持仅限关键字参数。

04

可变长参数

“可变长”顾名思义是允许在调用时传入多个参数,可变长参数适用于参数数量不确定的场景,可变参数有两种,一种是关键字可变长参数,另一种是非关键字可变长参数。

非关键字可变长参数的写法是在参数名前加一个星号,Python会将这些多出来的参数的值放入一个元组中,由于元组中只有参数值而没有参数名称,所以是非关键字参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1def print_args(*args):
2    print(args)
3
4print_args(1, 2, 3, 4, 5)  # 输出元组(1, 2, 3, 4, 5)
5
6a = [1, 2, 3, 4, 5]
7print_args(a)  # 直接传入时,列表a会被当作一个元素,所以输出([1, 2, 3, 4, 5],)
8print_args(*a)  # 在传参时加星号可以将可迭代参数解包,所以列表a中每一个元素都被当作一个参数传入,输出(1, 2, 3, 4, 5)

关键字可变长参数的写法是在参数名前加两个星号,Python会将这些多出来的参数的值放入一个字典中,由于字典中只有参数值而没有参数名称,所以是关键字参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1def print_kwargs(**kw_args):
2    print(kw_args)
3
4a = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
5print_kwargs(**a)  # 使用关键字可变参数时, {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}

05

函数注解

Python 3中为函数定义增加的另一个新功能是函数注解,所谓函数注解,就是可以在函数参数和返回值上添加任意的元数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1def create_person(name: str, age: int, gender: str = 'female', height: int = 160)  -> bool:
2    return True

用create_person方法举例,可以看到在每个参数后面都跟了一个参数类型,在函数后面则是返回值类型,函数注解可以用在文档编写、类型检查中,在支持函数注解的IDE中,如果传入参数和返回的类型不符合函数注解中的类型,IDE会提示错误。

但是函数注解只是一个元数据,Python解释器执行时候并不会去检查类型,所以下面这种情况也是合法的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1Person(name=123, age='John')  # 并不会报错

06

总结

Python有着非常好入门的特点,但是随着语言本身的演进,很多高级功能也在持续加入,用好这些功能可以使我们的Python代码拥有更高的可读性,适应更加复杂的应用场景。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python私房菜 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
使用Fscrypt轻松获得文件级加密 (tech blog)
不久以前,我就证明了对大多数用户而言,文件级加密具有足够的安全性,并且比全盘加密具有更高的性能。表达这种异质观点的努力比预期的要少得多。相对的,一些读者发送了表示好奇和渴望尝试文件级加密的消息和评论。
木樾233
2020/12/18
3K1
Android加密之全盘加密
Android 的安全性问题一直备受关注,Google 在 Android 系统的安全方面也是一直没有停止过更新,努力做到更加安全的手机移动操作系统。
全栈程序员站长
2022/08/27
2.4K0
Android加密之全盘加密
用LUKS为云盘敏感数据上锁
通过之前的教程,我们了解如何在Linux和Windows云服务器下挂载和扩容云硬盘,解决了业务存储的性能扩展问题。那么,如何妥善地解决块存储的安全问题呢?这篇我们将一起探索在腾讯云上,为云硬盘做基于dm-crypto/LUKS的块设备加密的方法实践。
溪歪歪
2021/01/10
6.9K15
用LUKS为云盘敏感数据上锁
如何在互联网上保持安全,第4部分:与力量作斗争
通过这个,本系列的第四个也是最后一个条目,你应该掌握信息安全基础知识。让我们先盘点一下,然后再继续往下探究。
zstt8054929
2020/12/10
6190
文档管理数据加密问题:文档管理数据加密设置不当,导致数据泄露
是山河呀
2025/02/11
840
磁盘存储和文件系统管理
磁盘存储和文件系统管理 1. 磁盘结构 1.1设备文件 1. 设备类型: 2. 磁盘设备的设备文件命名: 3. 虚拟磁盘: 4. 不同磁盘标识:a-z,aa,ab… 5. 同一设备上的不同分区:1,2, ... 6. 创建设备文件 7. 工具 dd 常用选项 示例 demo 8. hexdump指令 1.2 硬盘类型 1.硬盘接口类型 2. 服务器硬盘大小 3. 机械硬盘和固态硬盘 4. 硬盘存储术语 CHS CHS LBA(logical block addressing) 5. 识别SSD和机械硬盘类型
以某
2023/03/07
1.4K0
磁盘存储和文件系统管理
Bluestore下的OSD开机自启动分析
整个Bluestore现在由官方推出的ceph-volume工具进行管理,用以替代之前的ceph-disk。回顾之前ceph-disk是通过在xfs文件系统中打上相应的attributes,之后通过制定udev rules来实现启动。无论Ceph版本如何变化,基本的OSD自启动思路都是给块设备打标签->定制开机服务去触发执行。总结一下就是 Filestore的思路是: OSD打上xfs(attr) -> 由ceph-disk 触发执行 Bluestore的思路是: OSD打上LVM(tag) -> 由ceph-volume 触发执行 因此只要搞清楚LVM的tag机制,基本上就能很快搞定OSD自启动的相关排错问题。
用户1260683
2018/07/31
2.7K0
Bluestore下的OSD开机自启动分析
Btrfs
btrfs 1.特性 可由多个块设备组合成一个btrfs文件系统,多物理卷支持 支持RAID(0,1,5,6,10),dup(冗余),single(单盘)和热更新 写时复制更新机制(Cow): 复制、更新及替换指针,而非就地更改源文件 支持元数据校验码机制,一旦文件计算后发现受损会自动尝试修复 支持创建子卷(子卷本质是在btrfs文件系统中由btrfs创建的一个文件夹,可以单独被拿出来挂载到别的某一个目录中) 快照,还支持快照的快照(可以实现快照的增量备份) 透明压缩(无需用户参与) 支持
Tianlin_Zz
2022/11/01
7650
市面上多种流行的固态硬盘产品存在硬盘加密机制绕过漏洞
近期,荷兰奈梅亨拉德堡德大学研究人员发现,市面上多种流行的固态硬盘( SSD drive)存在加密机制可绕过漏洞,无需密码即可绕过硬盘加密措施,从而获取到硬盘中的数据内容。
FB客服
2018/12/20
1.6K0
市面上多种流行的固态硬盘产品存在硬盘加密机制绕过漏洞
OCP考点实战演练01-备份恢复篇
本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4
Alfred Zhao
2019/05/24
7240
ASM 翻译系列第三十六弹:ACFS磁盘组的重平衡操作
原作者:Bane Radulovic 译者: 魏兴华 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy.blogspot.sg/2014/02/acfs-disk-group-rebalance.html ACFS disk group rebalance 从Oracle 11.2版本开始,可以在ASM磁盘组之上创建通用的集群文件系统,被称为Oracle ASM Cluster File Systems或Oracle ACFS。要想创建一个ACFS文件
沃趣科技
2018/03/26
1K0
系统集成数据加密问题:系统集成数据加密设置不当,导致数据泄露
是山河呀
2025/02/11
970
文件系统专栏 | 之文件系统架构
文件系统层次分析 由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层 用户层:最上面用户层就是我们日常使用的各种程序,需要的接口主要是文件的创建、删除、打开、关闭、写、读等。 VFS层:我们知道Linux分为用户态和内核态,用户态请求硬件资源需要调用System Call通过内核态去实现。用户的这些文件相关操作都有对应的System Call函数接口,接口调用 VFS对应的函数。 文件系统层:不同的文件系统实现了VFS的这些函数,通过指针注册到VFS里面。所以,用户的操作
刘盼
2022/08/26
2.8K0
文件系统专栏 | 之文件系统架构
kvm qcow2和ceph rbd虚拟机磁盘加密
LUKS 实现了一种独立于平台的标准磁盘格式,用于各种工具。LUKS 用于加密块设备。加密设备的内容是任意的,因此可以加密任何文件系统,包括交换分区。加密卷的开头有一个未加密的标头,它允许存储多达 8 个 (LUKS1) 或 32 个 (LUKS2)加密密钥以及密码类型和密钥大小等加密参数。此标头的存在是 LUKS 和普通 dm-crypt 之间的主要区别,因为标头允许使用多个不同的密码短语,并且能够轻松更改和删除它们。但是,如果标头丢失或损坏,设备将不再可解密。LUKS (Linux Unified Key Setup)为提供了一个标准的磁盘加密格式,使得它不仅兼容性高,能通用于不同的 Linux 发行版本,还支持多用户/口令,并且由于它的加密密钥独立于口令,所以即使口令失密,我们也无需重新加密整个硬盘,只需要及时的改变口令即可重获安全。
没有故事的陈师傅
2022/09/15
9920
kvm qcow2和ceph rbd虚拟机磁盘加密
什么是HDFS透明加密
数据加密是安全级别要求较高企业所必须的,比如说金融行业,医疗行业或者政府。我们知道HDFS中的数据会以block的形式保存在各台数据节点的本地磁盘中,但这些block都是明文的,如果在操作系统下,直接访问block所在的目录,通过Linux的cat命令是可以直接查看里面的内容的,而且是明文。
Fayson
2018/03/29
4.3K0
什么是HDFS透明加密
浅谈Linux磁盘修复e2fsck命令
检查 /dev/mapper/VolGroup00-LogVol02 是否有问题,如发现问题便自动修复:
竹清
2018/12/18
6.3K0
android之VOLD:staging目录作用与ASEC文件 -总结[通俗易懂]
另外注意: 就是说,在/mnt路径下看到的/mnt/asec目录和/mnt/secure目录并不是真正存在在手机内存或者sd卡的分区挂载目录,他们本省只是根文件系统初始化的时候创建的两个目录,它们只是/mnt/sdcard/.android_secure目录的一个影像而已(也就是挂载点), 怎么看出来呢? 很简单,打开手机的mass storage。如下:
全栈程序员站长
2022/09/13
7770
android之VOLD:staging目录作用与ASEC文件 -总结[通俗易懂]
Linux磁盘管理和文件系统[通俗易懂]
  磁盘和文件系统的管理是运维人员的重要工作内容之一,本文对磁盘和文件系统的一些概念做了详细解释,管理命令给出了常用示例,方便自己在工作时随时查阅,也欢迎各位一同学习。
全栈程序员站长
2022/09/01
4.6K0
【Linux】《how linux work》第四章 磁盘和文件系统
In Chapter 3, we discussed some of the top-level disk devices that the kernel makes available. In this chapter, we’ll discuss in detail how to work with disks on a Linux system. You’ll learn how to partition disks, create and maintain the filesystems that go inside disk partitions, and work with swap space.
阿东
2024/03/22
2820
【Linux】《how linux work》第四章 磁盘和文件系统
MSSQL 2014 TDE透明加密的使用
https://learn.microsoft.com/zh-cn/sql/relational-databases/security/encryption/transparent-data-encryption?view=sql-server-ver16
保持热爱奔赴山海
2024/07/27
1980
推荐阅读
相关推荐
使用Fscrypt轻松获得文件级加密 (tech blog)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档