Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python的函数参数

Python的函数参数

作者头像
py3study
发布于 2020-01-07 13:24:04
发布于 2020-01-07 13:24:04
1.2K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

前言

python中 函数的参数可以分为两大类形参和实参~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y):     # x, y 就是形参
    print(x, y)

func(2, 3)           # 2, 3 就是实参

- 形参

形参(如上面的x, y)仅在定义的函数中有效,函数调用结束后,不能再使用该形参变量。在调用函数时,该函数中的形参才会被分配内存,并赋值;函数调用结束,分配的内存空间也随即释放~

- 实参

即在调用函数时,向该函数的形参传递确定的值(必须是确定的值)。传递的值可以是常量、变量、表达式、函数等形式~

在形参和实参中又可以细化为多种参数,例如形参中有 位置形参,默认形参,可变长参数...;实参中有位置实参,关键字实参等,下面一一介绍~

位置参数

位置参数顾名思义,按照从左到右的顺序依次定义的参数。位置参数有两种:位置形参和位置实参。上面示例中,func函数中的x,y就是位置形参,每一个位置形参都必须被传值。调用func时传递的2,3就是位置实参,位置实参与位置形参一一对应,不能多也不能少~

关键字参数

关键字参数针对实参,即实参在定义时,按照 key=value 形式定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y, z):
    print(x, y, z)

func(1, z = 2, y = 3)

关键字参数可以不用像位置参数一样与形参一一对应,例如这里可以是 z 在前面,y 在后面。

使用注意点: 1)在调用函数时,位置实参 必须在 关键字实参的前面~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y, z):
    print(x, y, z)

# 位置参数和关键字参数混合使用的时候
func(1, z = 2, y = 3)      # 正确

func(x = 1, z = 2, 3)      # 错误

2)一个形参不能重复传值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y, z):
    print(x, y, z)

func(1, x = 2, y = 3, z = 4)     # 错误,形参 x 重复传值

默认参数

默认参数即在函数定义阶段,就已经为形参赋值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def function(x, y=10):   # y 即为默认参数
    pass

# 函数调用阶段,必须为 x 传值(位置形参),可以为 y 传值,也可以不传,不传值就使用默认值 10

function(1)    # x = 1,y = 10
function(1,2)    # x = 1,y = 2

默认参数使用的注意点: 1)定义函数时,默认形参必须放在位置形参后面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(y = 10, x):     # 错误
    pass

def func(x, y = 10):    # 正确
    pass

2)默认参数通常要定义成不可变类型,例如:数字,字符串,元组等;虽然语法上支持定义成可变类型,但一般不建议这么做

3)默认参数只在定义阶段被赋值一次,如下示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x=10
def func(name, age = x):
    pass

x=20
func('hello')

Tip:func函数在定义时,age 只被赋值一次,即 age=10,下面重新指定了 x=20,不会再作用于函数中的 age 参数

可变长参数

在定义函数时,若不确定调用时需要传入多少个参数,这时就可以使用可变长参数,即实参的个数不固定

可变长参数 可以分为两类: 1)按位置定义的可变长度的实参(*) 2)按关键字定义的可变长度的实参(**)

- 按位置定义的可变长度的实参

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y, *args):   # *args 会把传入的 多余的 参数以一个元组的形式存放,元组的变量名就是args
    print(x, y)
    print(args)

func(1, 2, 3, 4, 5, 6)   # x=1, y=2, args=(3,4,5)

# 输出结果:
1 2
(3, 4, 5, 6)

Tip:'args = (3, 4, 5, 6)',所以 '*args = *(3, 4, 5, 6) ',在调用函数时,也可以使用如下方式传值( * 是用来处理位置参数的,表示把后面的元组拆开)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func(1, 2, *(3, 4, 5, 6))          # 等同于 func(1, 2, 3, 4, 5, 6) 
# 输出结果:                       # 结果一致
1 2
(3, 4, 5, 6)

- 按关键字定义的可变长度的实参

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y, **kwargs):         # **kwargs 会把多传入的参数以 dict 形式存放
    print(x, y)
    print(kwargs)

func(1, 2, a = 3, b = 4, c = 5)  # x=1, y=2, kwargs={'a': 3, 'b': 4, 'c': 5}

# 输出结果:
1 2
{'a': 3, 'b': 4, 'c': 5}

Tip:'kwargs = {'a': 3, 'b': 4, 'c': 5}',所以 ' **kwargs = **{'a': 3, 'b': 4, 'c': 5}',在调用函数时,也可以使用如下方式传值(** 表示关键字形式的实参,** 会将字典拆开,以关键字的形式传入)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func(1, 2, **{'a': 3, 'b': 4, 'c': 5} )  # 等同于 func(1, 2, a = 3, b = 4, c = 5)
# 输出结果:                                # 输出结果一致
1 2
{'a': 3, 'b': 4, 'c': 5}

接收任意长度、任意形式参数的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(*args,**kwargs):
    pass

调用方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func(1, 2, 3)            # 参数被 * 接受,转成元组,保存在 args 中
func(1, x=1, y=2)    # 1 与上述一致,x=1, y=2** 接受,转成字典的形式,保存在kwargs中

# 前面已经提过,位置实参和关键字实参混合使用时,要注意关键字实参必须放在位置实参的后面~

命名关键字参数

定义函数时,* 号后面的形参就是 命名关键字参数,在调用时,命名关键字参数 必须要传值,而且必须要以关键字的形式传值,还有命名关键字并不常用~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(*, name, age):         # name 和 age 就是 命名关键字参数
    print(name)
    print(age)

func(name = 'abc', age = 2)  # name 和 age 必须以关键字的形式传值

命名关键字参数的使用示例。前面提过 默认形参必须放在位置形参后面,如下示例的函数定义中,name 和 age 都是命名关键字参数(不是默认形参,也不是位置形参),name 是命名关键字参数的默认值,所以如下示例中的函数定义方式并没有问题~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(*, name='kitty', age):
    print(name)
    print(age)

func(age=2)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android UI 架构演进:从 MVC 到 MVP、MVVM、MVI
MVC 初步解决了 Activity 代码太多的问题,但也有缺点:我们的初衷 Activity / Fragment 是只处理表现逻辑的部分 ,但现实是 Activity 天然不可避免要处理 UI,也要处理用户交互,说明 Activity 本身天然承担了 View 的角色。那么这个架构就会造成 Activity 里糅合了视图和业务的代码,分离程度不够。
用户9995743
2022/09/26
1.6K0
Android UI 架构演进:从 MVC 到 MVP、MVVM、MVI
MVI 架构
近日,600多名谷歌员工签署了一份宣言,反对该公司强制接种新冠疫苗。这对谷歌领导层构成了最新挑战,因为该公司即将迎来让员工重返办公室的关键最后期限。拜登政府已下令,员工人数在百人以上的美国公司,需要在2022年1月4日前确保员工全面接种疫苗或定期检测新冠肺炎。泄露的谷歌内部文件显示,该公司要求其超过15万名员工在12月3日之前将疫苗接种状态上传到其内部系统上,无论他们是否计划复岗。谷歌还表示,所有直接或间接履行政府合同的员工都必须接种疫苗,即使他们在家工作也是如此。
张哥编程
2024/12/19
750
MVI 架构
安卓软件开发:对比 MVVM 和 MVI 架构的模块设计
MVI(Model-View-Intent)和 MVVM(Model-View-ViewModel) 是安卓开发中很常见的两种架构。虽然它们的目标都是为了让代码更清晰、可维护,但在处理数据流、状态管理、以及用户交互的方式上,它们有着不同的思路。我用易懂的方式对比一下它们的区别。
Nimyears
2024/10/11
9380
解决Android开发中的痛点问题用Kotlin Flow
本文旨在通过实际业务场景阐述如何使用Kotlin Flow解决Android开发中的痛点问题,进而研究如何优雅地使用Flow以及纠正部分典型的使用误区。有关Flow的介绍及其操作符用法可以参考:异步流 - Kotlin 语言中文站,本文不做赘述。基于LiveData+ViewModel的MVVM架构在某些场景下(以横竖屏为典型)存在局限性,本文会顺势介绍适合Android开发的基于Flow/Channel的MVI架构。
程序员小何SS
2021/11/25
3.4K0
MVVM 进阶版:MVI 架构了解一下~
Android开发发展到今天已经相当成熟了,各种架构大家也都耳熟能详,如MVC,MVP,MVVM等,其中MVVM更是被官方推荐,成为Android开发中的显学。
做个快乐的码农
2022/01/13
2.1K0
MVVM 进阶版:MVI 架构了解一下~
一文了解MVI架构,学起来吧~
大约在去年11月份,Google将官方网站上推荐的MVVM架构悄悄替换成了MVI架构。参考了官方与许多前辈的分享,便有了此文。不过下面的再前言应当是每个读者心中所需要认定的。
黄林晴
2022/05/10
1.4K0
一文了解MVI架构,学起来吧~
Android应用架构的未来:深入理解MVI模式及其优势
MVI(Model-View-Intent)是一种基于响应式编程理念的架构模式。它能够帮助开发者更好地管理应用的状态和逻辑,并提升代码的可维护性和可测试性。在本文中,我们将深入了解MVI的原理、具体的使用方式以及一些注意事项和优化技巧。
Rouse
2024/03/06
1.2K0
Android应用架构的未来:深入理解MVI模式及其优势
有小伙伴说看不懂 LiveData、Flow、Channel,跟我走
LiveData、Kotlin Flow 和 RxJava 三者都属于 可观察的数据容器类,观察者模式是它们相同的基本设计模式,那么相对于其他两者,Kotlin Flow 的优势是什么呢?
用户9995743
2022/09/26
2.6K0
有小伙伴说看不懂 LiveData、Flow、Channel,跟我走
告别混乱代码!MVVM+数据绑定,让你的Android应用飞起来,MVVM+数据绑定技巧,打造Android应用的数据流水线!
随着移动应用的快速发展,Android操作系统已成为全球最受欢迎的智能手机平台之一。在Android应用开发中,选择合适的软件架构对于项目的可维护性、可扩展性和开发效率至关重要。近年来,MVVM(Model-View-ViewModel)模式因其清晰的职责划分和高度的解耦性而备受关注。本课题将深入探讨MVVM模式在Android开发中的实战应用与数据绑定技巧,旨在提高Android应用的质量和开发效率。
小白的大数据之旅
2024/11/20
1990
告别混乱代码!MVVM+数据绑定,让你的Android应用飞起来,MVVM+数据绑定技巧,打造Android应用的数据流水线!
从 LiveData 迁移到 Kotlin 数据流
LiveData 的历史要追溯到 2017 年。彼时,观察者模式有效简化了开发,但诸如 RxJava 一类的库对新手而言有些太过复杂。为此,架构组件团队打造了 LiveData: 一个专用于 Android 的具备自主生命周期感知能力的可观察的数据存储器类。LiveData 被有意简化设计,这使得开发者很容易上手;而对于较为复杂的交互数据流场景,建议您使用 RxJava,这样两者结合的优势就发挥出来了。
Android 开发者
2022/03/09
1.5K0
从 LiveData 迁移到 Kotlin 数据流
Android实战经验之Kotlin中快速实现MVI架构
MVI(Model-View-Intent)是一种用于构建用户界面的架构模式,强调单向数据流和不可变状态管理。MVI的核心思想是将应用程序的各个部分严格分离,并通过一种明确的方式来处理用户交互和状态变化。这有助于提高应用程序的可维护性和可测试性。
AntDream
2024/08/01
2970
Android实战经验之Kotlin中快速实现MVI架构
实战 | 使用 Kotlin Flow 构建数据流 "管道"
Flow 是一种基于流的编程模型,本文我们将向大家介绍响应式编程以及其在 Android 开发中的实践,您将了解到如何将生命周期、旋转及切换到后台等状态绑定到 Flow 中,并且测试它们是否能按照预期执行。
Android 开发者
2022/03/29
1.5K0
实战 | 使用 Kotlin Flow 构建数据流 "管道"
安卓软件开发:Jetpack Compose Material3 结合 MVI 架构的模块化架构设计和实践
MVI 是 Model-View-Intent 的缩写,MVI 架构主要有三个核心部分:
Nimyears
2024/10/10
7171
Android MVI框架搭建与使用
  有一段时间没有去写过框架了,最近新的框架MVI,其实出来有一段时间了,只不过大部分项目还没有切换过去,对于公司的老项目来说,之前的MVC、MVP也能用,没有替换的必要,而对于新建的项目来说还是可以替换成功MVVM、MVI等框架的。本文完成后的效果图:
晨曦_LLW
2023/02/26
3.6K2
Android MVI框架搭建与使用
获取数据并绑定到 UI | MAD Skills
欢迎回到 MAD Skills 系列 课程之 Paging 3.0!在上一篇 Paging 3.0 简介 的文章中,我们讨论了 Paging 库,了解了如何将它融入到应用架构中,并将其整合进了应用的数据层。我们使用了 PagingSource 来为我们的应用获取并使用数据,以及用 PagingConfig 来创建能够提供 Flow<PagingData> 给 UI 消费的 Pager 对象。在本文中我将介绍如何在您的 UI 中实际使用 Flow<PagingData>。
Android 开发者
2022/03/12
8780
【译】LiveData-Flow在MVVM中的最佳实践
原文链接:https://proandroiddev.com/using-livedata-flow-in-mvvm-part-i-a98fe06077a0
用户1907613
2021/10/19
2.8K0
【译】LiveData-Flow在MVVM中的最佳实践
livedatabus详解,阿里是如何用他来做淘宝架构的?
Google 为了帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成了一个整体,称作 Android Jetpack,它包含的组件如下图所示:
Android技术干货分享
2019/05/15
1.2K0
livedatabus详解,阿里是如何用他来做淘宝架构的?
响应式架构最佳实践——MVI
这个系列我做了协程和Flow开发者的一系列文章的翻译,旨在了解当前协程、Flow、LiveData这样设计的原因,从设计者的角度,发现他们的问题,以及如何解决这些问题,pls enjoy it。
用户1907613
2021/12/23
1.8K0
响应式架构最佳实践——MVI
Kotlin上的反应式流-SharedFlow和StateFlow
在本教程中,你将学习Kotlin中的反应式流,并使用两种类型的流——SharedFlow和StateFlow,构建一个应用程序。
用户1907613
2021/11/19
2.3K0
谁能取代Android的LiveData- StateFlow or SharedFlow?
这个系列我做了协程和Flow开发者的一系列文章的翻译,旨在了解当前协程、Flow、LiveData这样设计的原因,从设计者的角度,发现他们的问题,以及如何解决这些问题,pls enjoy it。
用户1907613
2022/01/05
1.6K0
谁能取代Android的LiveData- StateFlow or SharedFlow?
推荐阅读
相关推荐
Android UI 架构演进:从 MVC 到 MVP、MVVM、MVI
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验