函数定义中的参数也就是形式参数,规定了在调用函数时如何传递实际参数以及这些参数有无默认值。

实参传递方式

def f(a):
print(a)

实参传递方式有两种,位置和关键字。对于上面定义的函数 f,形如 f(1) 这种调用是通过位置的方式传参,形如 f(a=1) 这种调用是通过关键字的方式传参,两种传参方式都可以是因为形参 a 没有对传参方式做限制。

Python 也提供了一些方式用来限制参数的传递方式。

仅限位置参数

def f(a, b, /, d):
pass

对于这种定义,斜杠 / 之前的参数 a 和 b 只能通过位置参数的方式传参,叫做仅限位置参数,斜杠 / 之后的参数 d 既可以通过位置也可以通过关键字的方式传参,所以 f(1, 2, d=3)f(1, 2, 3) 都可以调用函数。

仅限关键字参数

def f(a, b, *, d):
pass

定义中星号 * 后面的参数 d 只能通过关键字的方式传参,叫做仅限关键字参数,星号 * 前面的参数 a 和 b 既可以通过位置也可以通过关键字的方式传参,所以 f(1, 2, d=3)f(1, b=2, d=3) 都可以调用函数。

当然星号 * 和斜杠 / 也可以同时定义,如下

def f(a, /, b, *, c):
pass

a 只能通过位置传参,c 只能通过关键字传参,b 都可以,所以只有 f(1, 2, c=3)f(1, b=2, c=3) 这两种调用方式。

参数的默认值

函数定义中无论规定形参的传递方式是哪种,都可以通过 k=v 的形式设置参数的默认值,如果有参数设置了默认值,那么在调用函数的时候可以省略对该参数的传值。所以上面说的实参传递方式,更准确的描述是:如果仅限关键字参数没有设置默认值,那么只能通过关键字的形式传参,否则可以省略该参数的传递,如果仅限位置参数没有设置默认值,那么只能通过位置的形式传参,否则可以省略该参数的传递。

下面看一个例子作总结

def f(a, b=10, /, c=1, *, d=20, e):
pass

b 是仅限位置参数有默认值,e 是仅限关键字参数没有默认值。函数定义中出现的 k=v 这种形式表示参数 k 有默认值 v,函数调用中出现的 k=v 的形式表示通过关键字的方式给参数 k 传递参数值 v,这是两个不同的概念不要混淆了。

最新文章

  1. [ASP.NET MVC 小牛之路]08 - Area 使用
  2. VMWare 安装 Mac OS X10.10 Yosemite
  3. HubSpot – 网站开发必备的 jQuery 信息提示库
  4. Lock读写锁技术的妙用
  5. Linux下查看文件和文件夹大小
  6. 20145206邹京儒《Java程序设计》第3周学习总结
  7. MXS 编辑器外观
  8. HTML: css 修飾文本和字體
  9. 新蒂下午茶体基本版SentyTEA-Basic
  10. GSM Sniffing入门之软件篇:GSMTAP抓取与SMS(Short Message Service)
  11. EBP与ESP寄存器的使用
  12. C++学习笔记:不用sizeof判断int类型占用几个字节
  13. jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
  14. sdl2.0示例
  15. 利用ajax从txt读取数据
  16. 深入理解.net - 3.类型Type
  17. Putting Boxes Together CodeForces - 1030F (带权中位数)
  18. Python爬虫之网页图片抓取
  19. 贪吃蛇java版
  20. 专访|HPE软件部中国区总经理李时:HPE引领IT战略新形态

热门文章

  1. Linux Framebuffer 实验
  2. TreeUtils工具类一行代码实现列表转树 实战Java8 三级菜单 三级分类 附视频
  3. 解决can't compare offset-naive and offset-aware datetimes报错
  4. 关于解决Failed on cp file to /system - Cross-device link 报错
  5. linux系统安装nginx中的subs-filter模块
  6. JS基础笔记合集(1-3)
  7. 正则提取器和beanshell处理器组合,将提取的所有id拼接成字符串
  8. Jmeter 之随机控制器与随机顺序控制器
  9. week_8
  10. week_1