什么是赋值表达式(使用“walrus”或“:=”运算符)?为什么要添加这个语法?

2024-01-11

从 Python 3.8 开始,代码可以使用所谓的“walrus”运算符(:=),记录在PEP 572 https://www.python.org/dev/peps/pep-0572/, for 赋值表达式.

这似乎是一个非常重要的新功能,因为它允许在理解和lambdas.

赋值表达式的语法、语义和语法规范到底是什么?

为什么要引入这个新的(而且看起来相当激进的)概念,尽管PEP 379 https://www.python.org/dev/peps/pep-0379/(提出了“添加赋值表达式”的类似想法)被撤回了?


PEP 572 https://www.python.org/dev/peps/pep-0572/包含许多细节,尤其是第一个问题。我将尝试简洁地总结/引用 PEP 中一些最重要的部分:

基本原理

在推导式中允许这种形式的赋值,例如列表推导式和禁止传统赋值的 lambda 函数。这也可以促进交互式调试,而不需要代码重构。

推荐的用例示例

a) 获取条件值

例如(在 Python 3 中):

command = input("> ")
while command != "quit":
    print("You entered:", command)
    command = input("> ")

可以变成:

while (command := input("> ")) != "quit":
    print("You entered:", command)

同样,从the docs https://docs.python.org/3/whatsnew/3.8.html:

在此示例中,赋值表达式有助于避免调用 len() 两次:

if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

b) 简化列表理解

例如:

[(lambda y: [y, x/y])(x+1) for x in range(5)]

可以变成:

[[y := x+1, x/y] for x in range(5)]

语法和语义

在任何可以使用任意 Python 表达式的上下文中,命名表达式可以出现。这是这样的形式name := expr where expr是任何有效的 Python 表达式,name 是一个标识符。

这种命名表达式的值与合并的表达式相同,但附加的副作用是目标被分配该值

与常规赋值语句的差异

除了是表达式而不是语句之外,PEP 中还提到了一些差异:表达式赋值从右到左,逗号周围有不同的优先级,并且不支持:

  • 多个目标

    x = y = z = 0  # Equivalent: (z := (y := (x := 0)))
    
  • 不分配给单个名称的分配:

    # No equivalent
    a[i] = x
    self.rest = []
    
  • 可迭代打包/拆包

    # Equivalent needs extra parentheses
    loc = x, y  # Use (loc := (x, y))
    info = name, phone, *rest  # Use (info := (name, phone, *rest))
    
    # No equivalent
    px, py, pz = position
    name, phone, email, *other_info = contact
    
  • 内联类型注释:

    # Closest equivalent is "p: Optional[int]" as a separate declaration
    p: Optional[int] = None
    
  • 不支持增强分配:

    total += tax  # Equivalent: (total := total + tax)
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是赋值表达式(使用“walrus”或“:=”运算符)?为什么要添加这个语法? 的相关文章

  • python 中的并行处理

    在 python 2 7 中进行并行处理的简单代码是什么 我在网上找到的所有示例都很复杂 并且包含不必要的代码 我该如何做一个简单的强力整数分解程序 在每个核心 4 上分解 1 个整数 我真正的程序可能只需要2个核心 并且需要共享信息 我知
  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • Python 2.7 中的断言对我来说不起作用示例assertIn

    我的 Mac 上安装了 python 2 7 通过在终端中运行 python v 进行验证 当我尝试使用任何新的 2 7 断言方法时 我收到 AtributeError 我看过http docs python org 2 library u
  • Mac OS X 中文件系统的 Unicode 编码在 Python 中不正确?

    在 OS X 和 Python 中处理 Unicode 文件名有点困难 我试图在代码中稍后使用文件名作为正则表达式的输入 但文件名中使用的编码似乎与 sys getfilesystemencoding 告诉我的不同 采取以下代码 usr b
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • Python pip install pyarrow错误,无法执行'cmake'

    我尝试在 EMR 集群的主实例上安装 pyarrow 但总是收到此错误 hadoop ip XXX XXX XXX XXX sudo usr bin pip 3 4 install pyarrow Collecting pyarrow Do
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • 连接mysql和python.3

    我是 django 的新手 使用 django 1 5 和 python 3 3 有没有办法在 python 3 3 上安装 mysqlDB 或 有其他方法可以连接它们吗 PyMySQL https github com petehunt
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • Elasticsearch 通过搜索返回拼音标记

    我用语音分析插件 https www elastic co guide en elasticsearch plugins current analysis phonetic html由于语音转换 从弹性搜索中进行一些字符串匹配 我的问题是
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • 双击打开 ipython 笔记本

    相关文章 通过双击 osx 打开 ipython 笔记本 https stackoverflow com questions 16158893 open an ipython notebook via double click on osx
  • TKinter 中的禁用/启用按钮

    我正在尝试制作一个像开关一样的按钮 所以如果我单击禁用按钮 它将禁用 按钮 有效 如果我再次按下它 它将再次启用它 我尝试了 if else 之类的东西 但没有成功 这是一个例子 from tkinter import fenster Tk
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练

随机推荐

  • SqlDataSource 中的动态 WHERE 子句

    我在一个非常简单的应用程序中使用 SqlDataSource 我允许用户通过文本框为 SDS 的选择命令设置多个搜索参数 每个参数一个文本框 例如 txtFirstName txtLastName 等 我计划使用按钮单击事件处理程序来设置
  • XML 正则表达式 - 负匹配

    我在 XSD 模式中遇到负前瞻问题 当我指定
  • 将 jQuery 转换为无冲突模式

    这是我正在使用的脚本 window load function edifici artistici industriale fotovoltaico veterinaria architettonici hide if window loc
  • R - 数字的条件格式(小数位)

    我正在 R 中构建一个闪亮的应用程序 其输出之一是一个包含摘要数据的表格 此表中出现的值变化很大 从 0 003 到 3 450 023 我希望有一种方法可以格式化要显示的数字 例如 小于 0 的数字始终显示三位小数 0 到 10 之间的数
  • GROUP BY - 不对 NULL 进行分组

    我正在尝试找出一种使用 group by 函数返回结果的方法 GROUP BY 按预期工作 但我的问题是 是否可以通过忽略 NULL 字段来进行分组 这样它就不会将 NULL 分组在一起 因为我仍然需要指定字段为 NULL 的所有行 SEL
  • 如何消除嵌入 Power Bi 的报表视觉效果的灰色边框?

    When i render the power bi visuals I notice that there is a grey border on the right and left side of the image Is there
  • Sass开发工作流程问题

    我一直在尝试将 Sass 采用到我的开发工作流程中 我主要从事前端开发 因此我经常更新样式表 经过无休止的搜索 我还没有找到我认为应该是一个简单问题的答案 我同时使用 Coda 和 Textmate 因此两者的解决方案就足够了 在本地开发时
  • Python:巨大的指数被卡住,但不会引发错误

    我在 Win10 x64 上使用 Python 3 6 print 10 10 10 10 这不应该引发错误吗 当我运行它时 它只是不打印任何内容 但不会引发任何错误 没有溢出错误 没有内存错误 什么都没有 现在已经运行了大约 10 分钟
  • 捕获图像进行处理

    我将 Python 与 PIL 和 SciPy 一起使用 我想从网络摄像头捕获图像 然后使用 numpy 和 Scipy 进一步处理它 有人可以帮我解决代码吗 这是代码 有一个预定义的图像 lena 但我希望使用我自己捕获的图像而不是 le
  • 将异步函数作为函数参数的 Python 类型提示

    我试图确保函数参数是异步函数 所以我正在使用以下代码 async def test args kwargs pass def consumer function Optional Coroutine Any Any Any None fun
  • 在 Glue pythonshell 中使用 pyarrow - ModuleNotFoundError:没有名为“pyarrow.lib”的模块

    创建了一个egg and whlpyarrow 文件并将其放在 s3 上 以便在 pythonshell 作业中调用它 收到这条消息 职位代码 import pyarrow raise 错误 结构相同whl Traceback most r
  • 如何列出 TCL 实例中的所有命名空间?

    如何列出 tclsh 实例中加载的所有名称空间 Chenz 尝试从 TCLer 运行这个过程Wiki http wiki tcl tk 1489 proc listns parentns set result list foreach ns
  • SPARQL连接两个对象的路径是什么?

    大家好 我想知道两个节点之间是否存在关系 以及连接它们的谓词是否存在 假设我的图表如下所示 Uri1 pred a pred b Uri2 Uri3 Uri4 Uri5 pred c pred d Uri6 Uri7 pred a
  • 在 Objective C 中字符串值总是显示 nil

    我已经升级到 Xcode 5 0 当我在调试模式下运行应用程序并尝试打印NSString控制台中的值 它给了我以下错误 有任何想法吗 error warning couldn t get cmd pointer substituting N
  • 如何在 tkinter 画布上绘制圆弧?

    我正在研究自动机理论 我被要求对自动机的图 树 进行编程 它看起来或多或少像 到目前为止我得到了这个 我正在使用tkinter and canvas绘制 from tkinter import Tk Canvas mainloop def
  • 集合视图单元格未出现

    我想显示尽可能多的collectionViewCells with buttons因为我的数组中有字符串 但是当我启动模拟器时 只有背景CollectionView但没有显示单元格 可能是什么错误 这是我的代码CollectionViewC
  • 不同形状的 NumPy 数组集合的组合平均值和标准差

    假设我有带有形状的 Numpy 数组 682 89 138 2668 76 89 491 62 48 我应该如何计算所有三个数组组合的平均值和标准差 如果它们的形状相同 我可以使用np stack 然后获取结果数组的平均值和标准差 是否可以
  • 如何更改列表视图特定项目的颜色?

    我有一个自定义列表适配器 如下所示 public class CustomListViewAdapter2 extends ArrayAdapter
  • 3 表 SELECT 查询的正确语法

    我有 3 张桌子 表格帖子 tbl评论 tblUsers 我正在尝试获取帖子列表以及相关评论 棘手的部分似乎是让帖子和评论显示正确的作者 用户 这是我得到的最接近的结果 但帖子作者是不正确的 我将我的 CFOutput 分组在 pid 上
  • 什么是赋值表达式(使用“walrus”或“:=”运算符)?为什么要添加这个语法?

    从 Python 3 8 开始 代码可以使用所谓的 walrus 运算符 记录在PEP 572 https www python org dev peps pep 0572 for 赋值表达式 这似乎是一个非常重要的新功能 因为它允许在理解