这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Positional-Only Arguments)

函数传递参数的方式繁多,有位置参数、默认参数、可变参数、关键字参数、命名关键字参数。举个例子:
def add(x, y, *args, **kwargs):
print(f"x={x}, y={y}")

这里的 x 和 y 就是两个位置参数,我们可以这样调用

>>> add(1, 2)
x=1, y=2

因为是位置参数,严格遵守位置顺序。

不过,你也可以把 x 和 y 当做命名关键字参数进行传递,参数的顺序可改变,例如把 y 放前面,不影响结果

>>> add(y=2, x=1)
x=1, y=2

第二种方式看似更灵活,出错的风险也增加了,特别是多人合作的项目中。

那么如何从语法层面上禁止这样调用,避免出错呢?

这里就可以使用Python3.8中的仅位置参数语法了,在函数定义时,参数之间可指定一个斜杠(/),斜杠前的参数严格遵守仅位置参数的定义,例如:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> def add(x, y, /, *args, **kwargs):
...     print(f"x={x}, y={y}")
...
>>> add(1,2)
x=1, y=2

“/“ 告诉解释器,x 和 y 是两个严格的位置参数,不能当做命名关键字参数进行传递。如果把它当作命名关键字参数进行传递参数时,会怎么样呢?

>>> add(y=2, x=1)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: add() missing 2 required positional arguments: 'x' and 'y'

报错了,系统不允许你使用这种方式调用,仅支持位置参数的方式进行调用,调用时不能指定参数的名字。

其实,这个语法在Python3.7 就有出现过,比如内置函数 float

python3.6可以指定参数名字进行调用

>>> float(x=1)
1.0

python3.7就会报错

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> float(x=1)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: float() takes no keyword arguments
>>> float(1)
1.0

可以看下python3.7 下 float 的帮助文档

>>> help(float)
Help on class float in module builtins:class float(object)|  float(x=0, /)||  Convert a string or number to a floating point number, if possible.||  Methods defined here:||  __abs__(self, /)|      abs(self)

你会发现float定义中,也有个 “/“,说明 x 是位置参数,调用时,不能指定名字。

总结

仅位置参数的语法就是在函数定义时,位置参数用 “/” 进行分隔,调用时不允许使用命名关键字参数进行调用,你明白了吗?

Python3.8 新特性:仅位置参数相关推荐

  1. python 3.8 新特性 video_1分钟了解:Python3.8 新特性:仅位置参数

    这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Positional-Only Arguments) 插播一条:我自己是一名从事了多年开发的Pyth ...

  2. Python3.8 新特性:f-strings调试

    f-strings调试 这是Python3.8新特性的第三篇,第一篇介绍了Python3.8 新特性:赋值表达式,第二篇是Python3.8 新特性:仅位置参数.这篇文章介绍f-strings调试功能 ...

  3. Python3.10新特性初体验

    Python3.10新特性初体验 注:图片来源 目录 结构模式匹配 [PEP 635] union类型允许X | Y [PEP 604] 带圆括号的上下文管理器 一.结构模式匹配(新增PEP 635) ...

  4. python3.8新特性 逻辑表达式_Python3.8新特性

    人生天地间,忽如远行客 昨日Python3.8稳定版发布,官网发布了一篇介绍新特性的文章,在此记录一下. 新增赋值操作符 := 作用:把较大表达式中的某部分值赋给变量,因为看起来像海象的眼睛和牙齿,: ...

  5. python3.8 新特性

    Python 3.8是Python语言的最新版本,它适合用于编写脚本.自动化以及机器学习和Web开发等各种任务.现在Python 3.8已经进入官方的beta阶段,这个版本带来了许多语法改变.内存共享 ...

  6. python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里

    Python3.8正式发布!新特性解析在这里 诗书塞外 Python程序员 10月14日,Python 3.8 正式版发布.这也意味着一个Python开发周期的结束,和另一个开发周期的开始.Pytho ...

  7. Python3.8 新特性:赋值表达式

    Python3.8 正式版本已经发布,喜欢尝鲜的同学可以下载下来体验一下,我并没有打算升级到最新版本,因为性能上并没有显著提升.但还是有必要了解其中的新特性. 赋值表达式的语法是:" nam ...

  8. Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!

    "Python学习开发",一个值得加星标的公众号. 正文共:4946 字 1 图 预计阅读时间:13 分钟 作者:陈祥安 原文有删改:https://docs.python.org ...

  9. Python3.0 新特性

    这篇文章主要介绍了相比于python 2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动 ...

最新文章

  1. mysql ntfs 提权 (errcode: 22)_mysql 提权总结
  2. python京东商品采集_利用Python正则表达式抓取京东网商品信息
  3. 罗小黑用flash做的_董小姐说电影丨这次都听我的,去看《罗小黑战记》
  4. mysql 图片base64_关于图片的Base64编码
  5. Python之OS模块:os.access()检验权限模式(验证文件及目录权限)
  6. python异常处理与上下文管理器
  7. django数据库事务
  8. 吴恩达机器学习(八)偏差与方差
  9. JavaSE学习笔记(七)—— 继承final关键字
  10. php画股票k线图,读股票数据画K线图很不错的Delphi源码
  11. 学习嵌入式单片机需要学习哪些内容?
  12. 关于IllegalArgumentException occurred while calling setter for property
  13. html代码圣诞贺卡图片,自制圣诞贺卡图片大全
  14. Optical Flow:Horn-Schunck算法与Lucas-Kanade(LK)算法
  15. EA出品的java射击类游戏,八款人见人爱的大型射击游戏,虽然相对经典但不过时...
  16. 报错:无法嵌入来自程序集“e:\Microsoft.Office.Interop.Word.dll”的互操作类型,因为它缺少“ImportedFromTypeLibAttribute”特性或“Prim
  17. 解决英飞凌ads软件的中文注释乱码问题
  18. ZEMAX光学系统导入和CAD导出
  19. php实现一个网站计数器
  20. 深度之眼Paper带读笔记NLP.30:BERT

热门文章

  1. 30天了解30种技术系列---(1)现代web应用服务器-Express.js
  2. Perl正则表达式--练习1
  3. Application 类 简介
  4. 错误:Failed to create the Java Virtual Machine
  5. Ubuntu 中安装 Oracle 10g
  6. [转] 三层开发中的层次划分
  7. spark比java快吗_为什么我的Spark DataFrame比RDD慢得多?
  8. 【FI】SAP ODN简介
  9. 以无代码的方式将Form打印内容转成生成PDF文件
  10. 29、Power Query-分支语句的进阶