第6章 函数

6.2 参数传递

在理解形参和实参的基础上,理解位置参数、关键字参数、可变参数这三种情形,以及这三种的混合情形。

6.2.1 形式参数和实际参数

形式参数:在定义函数时,函数名后面括号中的参数称为“形式参数”,简称“形参”

  1. # 定义plus函数, a和b是形参
  2. def plus(a, b):
  3. result = a - b
  4. return result

实际参数:在调用一个函数时,函数名后面括号中的参数为“实际参数”,简称“实参”

  1. # 调用plus函数,4和3是实参
  2. result1 = plus(4, 3)
  3. print(result1)

6.2.2 位置参数

调用函数时,实参的数量和位置必须和定义函数时形参的数量和位置是一致的;

  1. '''
  2. 定义函数时,定义了两个参数a和b。调用函数时,传入两个实参3和4,完全满足函数调用时参数要求。
  3. '''
  4. # 定义plus函数
  5. def plus(a, b):
  6. result = a - b
  7. return result
  8. # 调用plus函数,传入2个参数,正常
  9. result1 = plus(4, 3)
  10. print(result1)
  11. output:1
  12. # 调用plus函数时传入1个实参,报错
  13. result1 = plus(4)
  14. print(result1)
  15. output:
  16. TypeError: plus() missing 1 required positional argument: 'b'
  17. # 调用plus函数时传入3个实参,报错
  18. result1 = plus(4, 3, 5)
  19. print(result1)
  20. output:
  21. TypeError: plus() takes 2 positional arguments but 3 were given

6.2.3 关键字参数

关键字参数是指使用形式参数的名字来确定输入的参数值。通过这种方式指定实际参数时,不再需要与形式参数的位置完全一致,只要将参数名写正确即可。

  1. '''
  2. 调用函数时,传入实参(b=3, a=4),可不与函数定义时的参数位置一致。
  3. '''
  4. # 定义plus函数
  5. def plus(a, b):
  6. result = a - b
  7. return result
  8. # 调用plus函数
  9. result1 = plus(b=3, a=4)
  10. print(result1)
  11. output:1

6.2.4 定义函数时为形式参数设置默认值,称之为缺省参数

调用函数时,如果没有传入某个参数将抛出异常,则要求在定义时函数时,直接指定形式参数的默认值,当没有传入参数时, 则直接使用定义函数时设置的默认值。缺省参数必须写在函数形参的末尾

  1. def functionname(...,[parameter1 = defaultvalue1]):
  2. [functionbody]
  3. # 在定义函数时,指定默认的形式参数必须在所有参数的最后,否则将产生语法错误
  1. '''
  2. 定义函数时,形参设置默认值,调用函数时,有缺省参数可不传参,函数使用默认值处理。
  3. '''
  4. # 定义plus函数
  5. def plus(a, b=1):
  6. result = a - b
  7. return result
  8. # 调用plus函数
  9. result1 = plus(a=4)
  10. print(result1)
  11. output:1

另外,使用可变对象作为函数参数的默认值时,多次调用可能会导致异常的情况。

  1. def f(b=[]): # NO!
  2. print(b)
  3. return b
  4. ret = f(1)
  5. ret.append(1)
  6. ret.append(2)
  7. # 当再调用f(1)时,预计打印为 []
  8. f(1)
  9. # 但是却为 [1,2]

解决上面的问题,最好使用None作为可变对象的默认值,再加上必要的检查代码。

  1. def f(a,b=None): # NO!
  2. if b==None:
  3. b = []
  4. print(b)
  5. return b
  6. ret = f(1,2)
  7. ret.append(1)
  8. ret.append(2)
  9. # 当再调用f(1)时,预计打印为 []
  10. f(1)
  11. output:
  12. []
  13. []

定义函数时,为形式参数设置默认值要牢记一点:默认参数必须指向不可变对象

6.2.5 可变参数

函数定义时,可定义可变参数,即传入函数中的实际参数可以是任意个。

1、*parameter

这种形式表示接收任意多个实际参数并将其放到一个元组中。

  1. '''
  2. 定义函数时,定义形参为*args。调用函数时,可传任意个参数,函数将实参添加到一个元组中。
  3. '''
  4. def avg(*args):
  5. print(args)
  6. print(type(args))
  7. total = 0
  8. for i in args:
  9. total += i
  10. return total / len(args)
  11. print('平均分是:', avg(60, 70, 80, 90, 100))
  12. output:
  13. (60, 70, 80, 90, 100)
  14. <class 'tuple'>
  15. 平均分是: 80.0

2、**parameter

这种形式表示接收任意多个类似关键字参数一样显示赋值的实际参数并将其放到一个字典中。

  1. '''
  2. 定义函数时,定义形参为**kwargs。调用函数时,传入关键参数形式,函数将实参添加到一个字典中。
  3. '''
  4. def avg(**kwargs):
  5. print(kwargs)
  6. print(type(kwargs))
  7. total = 0
  8. for i in kwargs.values():
  9. total += i
  10. return total / len(kwargs)
  11. print('平均分是:', avg(a=60, b=70, c=80, d=90, e=100))
  12. output:
  13. {'a': 60, 'b': 70, 'c': 80, 'd': 90, 'e': 100}
  14. <class 'dict'>
  15. 平均分是: 80.0

3、*parameter和**parameter组合

  1. # 万能传参,args在前,kwargs在后。
  2. def function_print(*args,**kwargs): # 传递不定长参数,即参数个数不固定
  3. print(args)
  4. print(kwargs)
  5. function_print()
  6. function_print(1,True,"string",(1,),{"list1"},{"月份":7},Tuesday="星期二")
  7. output:
  8. ()
  9. {}
  10. (1, True, 'string', (1,), {'list1'}, {'月份': 7})
  11. {'Tuesday': '星期二'}

Python3笔记027 - 6.2 参数传递的更多相关文章

  1. python3笔记目录大纲汇总

    篇一.python3基础知识和语句 python3笔记一:python基础知识 python3笔记二:进制转换与原码反码补码 python3笔记三:运算符与表达式 python3笔记四:if语句 py ...

  2. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  3. Python学习笔记7-把函数当参数传递、指定可变参数

    把函数当参数传递 # 函数参数传递 # 面向对象编程就是把对象传来传去 # 面向函数编程就是把函数传来传去 def mytest(num): return num * 2 # # 不光可以传递变量,还 ...

  4. 小甲鱼Python3笔记

    000-愉快的开始 入门容易,学习难,代码量少. 跨平台: Windows, Mac OS, Linux, UNIX. 应用领域: 操作系统 WEB 3D动画 企业应用 云计算等等. 001-我和Py ...

  5. 廖雪峰Python3笔记

    主要复习过一遍 简介 略 安装 略 *** 第一个Python程序 第一行的注释: # _*_ coding: utf-8 _*_ #!/usr/bin/env python3 print() 可以接 ...

  6. Python3笔记——常用技术点汇总

    目录 · 概况 · 安装 · 基础 · 基础语法 · 数据类型 · 变量 · 常量 · 字符编码 · 字符串格式化 · list · tuple · dict · set · if语句 · for语句 ...

  7. python3笔记(二)Python语言基础

    缩进 要求严格的代码缩进是python语法的一大特色,就像C语言家族(C.C++.Java等等)中的花括号一样重要,在大多数场合还非常有必要.在很多代码规范里面也都有要求代码书写按照一定的规则进行换行 ...

  8. python3笔记(一)初识Python

    基础资料 什么是Python? Python官方网站 安装Python python的优点 完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. pyth ...

  9. Python3 笔记

    Ubuntu18.04 Python3环境 默认python3已经安装了, 可能是安装其他应用的时候因为依赖关系安装的. 安装pip3, 先sudo apt update 一下, apt-cache ...

随机推荐

  1. vj提交时常见问题

  2. STL容器操作

    目录 1. 数组 2. Vector 3. List 3.1. std::forward_list 4. Tuple 4.1. 运行期索引 4.2. 元组合并 4.3. 元祖遍历 5. Pair 6. ...

  3. @hdu - 6607@ Easy Math Problem

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 求: \[\sum_{i=1}^{n}\sum_{j=1}^{n ...

  4. 纯 HTML/CSS 高仿 Win10 加载动画

    自己做的超高仿Win10加载动画(应该是全网最像的 HTML 实现了),自己想用就拿去用吧 转圈加载 在线演示 HTML: <div class="loading"> ...

  5. Java 异常处理的十个建议

    前言 Java异常处理的十个建议,希望对大家有帮助~ 本文已上传github: https://github.com/whx123/JavaHome 公众号:捡田螺的小男孩 一.尽量不要使用e.pri ...

  6. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  7. ado.net Web前端:关于JavaScript知识点的简单梳理

    学习js:1.htmml2.cssjs+html+css == html5 js的组成:1).ecamscript ES是js的标准,js 是es 的实现2)文档对象模型(Document Objec ...

  8. 11.DRF-权限

    Django rest framework源码分析(2)----权限 添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 ...

  9. Git配置仓库的用户名邮箱

    Git配置单个仓库的用户名邮箱 $ git config user.name "gitlab's Name" $ git config user.email "gitla ...

  10. Spring 中Controller 获取请求参数的方法笔记

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/ ...