当前位置: 首页 > news >正文

Python学习:函数中定义参数的四种方式

1. F( arg1, arg2, …)

这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等
的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例如:

def a(x,y):
    print(x,y)

调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错。

2. F( arg1, arg2=value2, …)

这种方式就是第一种的改进版,提供了默认值,例如:

def a(x,y=3):
    print(x,y)

调用该函数,a(1,2)同样还是x取1,y取2,但是如果a(1),则不会报错了,这个时候x还是1,y则为默认的3。上面这俩种方式,还可以更换参数位置,比如a(y=4,x=3)用这种形式也是可以的。

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

3. F( *arg1 )

上面两种方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,
它以一个*(一个星号)加上形参名的方式来表示这个函数的实参个数不定,可能为0个也可能为n个。
注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的元组中。

def a(*x):
    print(x)


>>> a(1,2,3)
(1, 2, 3)
>>> a(x=1,y=2,z=3)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: a() got an unexpected keyword argument 'x'

将所有参数以元组(tuple)的形式导入:
实例

def foo(param1, *param2):
    print (param1)
    print (param2)
foo(1,2,3,4,5)

以上代码输出结果为:

1
(2, 3, 4, 5)

此外,单星号的另一个用法是解压参数列表:

实例

def foo(runoob_1, runoob_2):
    print(runoob_1, runoob_2)
l = [1, 2]
foo(*l)

以上代码输出结果为:

1 2

4. F( **arg1 )

形参名前加两个*表示(双星号),参数在函数内部将被存放在以形式名为标识符的 dictionary (字典)中,这时调用函数的方法则需要采用 arg1=value1,arg2=value2 这样的形式。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def a(**x):
    print(x)
   
>>> a(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3} # 存放在字典中
>>> a(1,2,3) # 这种调用则报错
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: a() takes exactly 0 arguments (3 given)

双星号(**)将参数以字典的形式导入:

示例:

def bar(param1, **param2):
    print (param1)
    print (param2)
bar(1,a=2,b=3)

以上代码输出结果为:

1
{'a': 2, 'b': 3}

示例:

def foo(a, b=10, *args, **kwargs):
    print (a)
    print (b)
    print (args)
    print (kwargs)
foo(1, 2, 3, 4, e=5, f=6, g=7)

以上代码输出结果为:

1
2
(3, 4)
{'e': 5, 'f': 6, 'g': 7}

相关文章:

  • 4个非常实用的Java项目,快用起来
  • 基于Sentry打造前端性能监控平台
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • 强化学习(ICML2022)
  • CS5181E 单节锂电池充电管理IC特点及应用
  • 计算机毕业论文基于springboot的社区物业服务管理项目源码
  • Hbase大批量数据迁移之BulkLoad
  • java计算机毕业设计外贸服装订单管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • C#基于asp.net的社区团购网站
  • Spring Boot + Netty + WebSocket 消息推送
  • 【Elasticsearch教程13】Mapping字段类型之nested
  • Java基础之:线程可重入锁,公平锁,非公平锁
  • MockServer 服务框架设计
  • 【web-利用信息泄露】(10.2)收集公布的信息、使用推论
  • java计算机毕业设计文档资料管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • [译]Python中的类属性与实例属性的区别
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • AWS实战 - 利用IAM对S3做访问控制
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • ComponentOne 2017 V2版本正式发布
  • CSS实用技巧干货
  • DOM的那些事
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Elasticsearch 参考指南(升级前重新索引)
  • java8-模拟hadoop
  • JavaScript 基础知识 - 入门篇(一)
  • Javascript 原型链
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Redis 中的布隆过滤器
  • Ruby 2.x 源代码分析:扩展 概述
  • WePY 在小程序性能调优上做出的探究
  • 对象引论
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 嵌入式文件系统
  • 入口文件开始,分析Vue源码实现
  • 思否第一天
  • 推荐一个React的管理后台框架
  • Android开发者必备:推荐一款助力开发的开源APP
  • 进程与线程(三)——进程/线程间通信
  • 通过调用文摘列表API获取文摘
  • #、%和$符号在OGNL表达式中经常出现
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (十) 初识 Docker file
  • (小白学Java)Java简介和基本配置
  • (新)网络工程师考点串讲与真题详解
  • (一) storm的集群安装与配置
  • (转载)从 Java 代码到 Java 堆
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .axf 转化 .bin文件 的方法
  • .htaccess配置重写url引擎
  • .Net - 类的介绍
  • .NET 4.0中使用内存映射文件实现进程通讯