python可变参数调用函数的问题

python可变参数调用函数的问题

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

已使用python实现的一些想法,近期使用python这种出现的要求,它定义了一个函数,第一种是一般的参数,第二个参数是默认,并有可变参数。在第一项研究中python时间,不知道keyword可变参数和keyword可变參数两种,调用的方式或许多种多样。这里主要提出一个比較隐含的问题。并将各种可能出现的情况进行了探讨。

函数声明格式

python尽管不支持函数重载。可是通过对函数參数的众多特性的支持基本弥补了。

函数声明的通式例如以下:

def func(argv1,argv2...[,argv_d = default1,...]\ [,*var_argv][,**var_key_argv])

这是python函数声明的通式,首先是普通參数若干个,也能够没有。接着是带默认值的參数,然后是非keyword可变參数,最后是keyword可变參数。这为python提供的强大函数调用奠定了基础。

函数调用

正是在函数调用的过程中遇到了问题。为了说明,我定义了一个例如以下的函数进行说明:

def f1(a,b=1,*var): print a,'\t',b,'\t',var
def f2(a,b=1,**var): print a,'\t',v,'\t',var

首先普通參数能够使用按位置的方式调用。同一时候能够使用按形參keyword调用。默认值參数也是使用位置方式匹配或者keyword调用。实比例如以下:
这里写图片描写叙述
这里没有使用后面的可变參数。一切都没有问题。问题是,本人遇到的一个需求是,默认參数须要就是使用默认值调用,同一时候还有可变參数。并且是非keyword參数,那么调用时就会出现以下的情况:
这里写图片描写叙述
能够看到,通过非keyword可变參数传入參数之后,python会默认把非keyword可变參数的前面若干个(这里是1个)当做默认參数,这里是由于我没有提供默认參数b的值,正是这个原因,在我的程序中一直没发现。后来自习思考一下,发现Python解释器做出这种决定还是有一定的道理的,由于非keyword可变參数是默认參数之后的若干个參数,而在调用的时候由于没有传入默认參数的值。Python无法推断究竟从哪里開始是可变參数,因此在没有传入默认參数的值时,就依次从非keyword參数(调用者觉得的)中依照顺序抽取去当做默认參数的值。这从側面论证了非keyword可变參数在python内部是和普通參数默认參数一并处理的

尽管上述调用有些极端,可是确实会出现这种需求,那么能够使用keyword可变參数进行替换,上述问题就能够攻克了。由于解释器是能够差别keyword參数和默认參数的,调用例如以下:
这里写图片描写叙述
在使用keyword可变參数时。另一个重要问题就是。keyword參数的键值不能有普通參数或者默认參数的參数名反复,这从側面论证了。python对keyword调用和keyword可变參数在内部都是经过同一个字典保存的,因此不能有反复的键,调用例如以下:
这里写图片描写叙述
上述遇到的问题是在实际操作过程中遇到的,一般从各种教程、书本学习python都仅仅是说明上述的函数声明和调用的方式,可是差点儿没有这种实际操作中可能遇到的点点滴滴。因此学习不论什么东西最好的方式就动手。这个真理永远不会变啦!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117827.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • git pull的时候发生冲突的解决方法之“error: Your local changes to the following files would be overwritten by merge

    git pull的时候发生冲突的解决方法之“error: Your local changes to the following files would be overwritten by merge

  • Zigbee协议栈中文说明

    Zigbee协议栈中文说明1.概述 1.1解析ZigBee堆栈架构ZigBee堆栈是在IEEE802.15.4标准基础上建立的,定义了协议的MAC和PHY层。ZigBee设备应该包括IEEE802.15.4(该标准定义了RF射频以及与相邻设备之间的通信)的PHY和MAC层,以及ZigBee堆栈层:网络层(NWK)、应用层和安全服务提供层。图1-1给出了这些组件的概况。1.1.1ZigBee堆栈层每个Z

  • python读取图片信息_糖炒栗子大的好还是小的好

    python读取图片信息_糖炒栗子大的好还是小的好这是一篇最基础的爬虫实例,大佬就不要看了,比较适合零基础或者有少量基础同学阅读

  • 深入理解 MySQL 事务:隔离级别、ACID 特性及其实现原理

    深入理解 MySQL 事务:隔离级别、ACID 特性及其实现原理什么是事务?事务(`Transaction`),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。事务通常由高级数据库操作语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如`begintransaction`和`endtransaction`语句(或函数调用)来界定。事务由事务开始(`begintransaction`)和事务结束(`endtransaction`)之间执行的全部操作组成。

  • 搭建个人网站需要的三个步骤

    记录一下自己的个人网站的搭建过程。其实网上有很多教程了,有的讲的好,很详细,有的就很笼统了,当然还有抄别人的,我这篇就纯属记录一下自己搭建的过程。搭建一个个人网站要知道以下三个步骤,做个比喻吧:域

    2021年12月26日
  • msdos分区是什么_msdos_partition

    msdos分区是什么_msdos_partition硬盘分区及格式化本例要求熟悉硬盘分区结构,使用fdisk分区工具在磁盘/dev/vdb上按以下要求建立分区:采用默认的msdos分区模式1、第1个分区/dev/vdb1的大小为200MiB2、第2个分区/dev/vdb2的大小为2000MiB3、第3个分区/dev/vdb3的大小为1000MiB,完成分区后4、能够配置开机自动挂载/dev/vdb2分区…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号