Python的表达式和语句、优先级、对象引用计数

本文详细介绍了Python的基础语法,包括表达式与语句的区别、运算符的优先级以及对象引用计数等内容。通过实例展示了赋值语句的多种用法,并列举了Python中的常用表达式操作符。

Python的表达式和语句、优先级、对象引用计数

  表达式:表达式表达的是某件事,由值、变量和运算符组成的。它是由一个或多个操作数以及0个或0个以上的运算符组成的序列。

  语句:语句表达的是做某件事,它是以分号(;)结尾的单行代码或者是语句块中一系列的单行语句。

  优先级:Python语句或程序中运算执行的先后顺序

  引用计数:用于查看某个对象的引用计数


Python的表达式

1、Python中的常用的表达式操作符:

算数运算:x + y, x - y,x * y, x / y, x // y, x % y

逻辑运算:x or y, x and y, not x

成员关系运算:x in y, x not in y

对象实例测试:x is y, x not is y

比较运算:x < y, x > y, x <= y, x >= y, x == y, x != y

位运算:x | y, x & y, x ^ y, x << y, x >> y

一元运算:-x, +x, ~x:

幂运算:x ** y

索引和分片:x[i], x[i:j], x[i:j:stride]

调用:x(...)

取属性:x.attribute

元组:(...)

序列:[...]

字典:{...}

三元选择表达式:x if y else z

匿名函数:lambda args: expression

生成器函数发送协议:yield x

 

Python语句

1、赋值语句:赋值语句有两个作用,一是建立新的变量,二是将值赋予变量。任意变量在使用时,都必须赋值,否则将触发异常。

python会在首次给变量赋值时创建变量名并建立对象引用。

1)、隐式赋值:import, from, def, class, for, 函数参数

In [8]: import sys

In [9]: sys.getrefcount(num1)

Out[9]: 4

In [10]: def printName():

           print name 

2)、元组和列表分解赋值:当赋值符号(=)的左侧为元组或列表时,Python会按照位置把右边的对象和左边的目标自左而右逐一进行配对;

而个数不同时会触发异常,此时可以切片的方式进行;

In [1]: l1 = ('Sun','Sat','Mon')

In [2]: x,y,z = l1

In [3]: print x

Sun

In [4]: print y

Sat

3)、多重目标赋值

In [5]: num1 = num2 = num3 =666

In [6]: print num1

666

In [7]: print num2

666

4)、增强赋值: +=, -=, *=, /=, //=, %=,

In [10]: a = 3

In [11]: a += 1

In [12]: print a

4

2、其它常见语句说明:

import语句 :模块导入

模块属性导入语句:import * from module:

In [1]: from random importchoice,randint,random

调用语句:

In [2]: i1 = mymod.MyClass('Field')

print语句: 打印对象

条件判断语句:if/elif/else:

In [3]: A = 6;B = 9

In [4]: maxnum = A if A > B else B

序列迭代语句:for/else:

普通循环语句:while/else:

语句内可用参数:

         pass:占位符

         break:跳出最内层的循环

         continue:跳到所处的最近层循环的开始出

函数定义语句:def:

参数返回:return:

In [5]: def f2(x,y): return x + y

In [6]: f2(222,444)

Out[6]: 66

生成器函数语句:yield:

In [7]: f1 = lambda x,y: x + y

In [8]: f1(222,444)

Out[8]: 666

         globalx: 命名空间,全局变量

异常触发语句:raise:

类定义语句:class MyClass:

异常捕获语句:try/except/finally:

删除引用:del:

调试检查语句:assert:

环境管理器:with/as:

 

Python中运算优先级

以下为优先级顺序,从上往下优先级降低,具有相同优先权的运算符从左到右进行计算

序列类型:(...), [...], {...}

索引和切片:s[i], s[i:j]

取属性:s.attribute

对象方法:s(...)

一元运算:+x, -x, ~x

乘幂运算:x ** y

算数乘除、取余、取模运算:*, /, //, %

算数加减运算:+, -

位移运算:<<, >>

按位与:&

按位抑或:^

按位或:|

比较运算:<, <=, >, >=, ==, !=

对象实例测试运算:is, not is

成员关系运算:in, not in

非:not

与:and

或:or

匿名函数:lambda

 

Python中对象引用计数:sys.getrefcount()

Python增加对象的引用计数场景:

         对象创建时;

         将对象添加进容器时;类似list.append()

         当对象被当作参数传递给函数时

         为对象创建另外变量名

Python减少对象的引用计数场景:

         引用此对象的某变量名被显式销毁:del x

         给引用此对象的某变量名重新赋值

         从容器中移除对象时,类似list.pop()

         容器本身被销毁

<think>好的,我现在需要帮助用户理解Python中的赋值表达式,也就是海象运算符。用户已经提供了一些站内引用,我需要结合这些信息之前的知识来组织回答。 首先,用户的问题明确,想知道赋值表达式的用法定义,特别是海象运算符。我需要先明确基本概念,然后给出具体的使用场景示例。 根据引用[1],赋值表达式Python 3.8引入的,使用:=符号,可以解决代码重复问题。引用[2]解释了名称的由来,并提到可以在条件表达式中使用。引用[3]则给出了文件读取列表推导的例子。这些都是很好的素材,需要整合到回答中。 接下来,我需要回顾之前的回答,用户之前询问的是变量的定义,其中提到了动态类型、作用域等。现在需要保持一致性,可能要在新回答中延续之前的风格,比如使用代码块、列表等结构化内容。 然后,我需要确保覆盖用户的问题点:用法、定义、海象运算符。同时,可能还需要比较普通赋值赋值表达式的区别,强调其优势使用场景。 需要注意用户可能的误区,比如在条件语句中如何正确使用,以及滥用可能导致的代码可读性问题。需要给出正确错误的例子,帮助用户理解最佳实践。 另外,用户提供的引用中有一些例子,如文件读取列表推导,我需要确保这些例子被正确引用并解释清楚,同时加入其他常见用例,比如正则表达式匹配、循环条件等。 最后,生成相关问题需要考虑用户可能进一步想知道的内容,比如与普通赋值的区别、适用场景、版本兼容性等,这样可以引导用户深入探索。</think>### Python赋值表达式(海象运算符)深度解析 #### 一、核心定义与基本语法 1. **运算符符号** - 使用 `:=` 符号(称为海象运算符/Walrus Operator) - 名称源自符号旋转90°后形似海象[^2] 2. **核心特征** - 同时完成赋值与表达式运算(普通赋值语句无返回值) - Python 3.8+ 版本特有语法[^1] 3. **语法对比** ```python # 普通赋值(无返回值) a = 10 # 赋值表达式(返回赋值后的值) print(b := 20) # 输出20 ``` #### 二、典型应用场景 1. **条件判断中的变量复用** ```python # 传统写法(重复调用len()) data = [1,2,3] if len(data) > 2: print(f"长度是{len(data)}") # 海象运算符优化 if (n := len(data)) > 2: print(f"长度是{n}") # 消除重复计算[^1] ``` 2. **循环条件中的持续赋值** ```python # 文件读取(传统写法) f = open('data.txt') while True: chunk = f.read(1024) if not chunk: break process(chunk) # 海象运算符优化(引用[3]案例) while (chunk := f.read(1024)): process(chunk) # 代码行数减少33% ``` 3. **推导式中的中间值保存** ```python # 筛选平方大于50的数字 numbers = [3, 7, 5, 9] filtered = [y for x in numbers if (y := x**2) > 50] print(filtered) # 输出[49, 81] ``` #### 三、使用规范与限制 1. **语法限制** - 不能替代常规赋值语句 - 禁止在顶层表达式使用(如模块级别) - 禁止在lambda函数参数中使用 2. **优先级规则** ```python # 需要括号保证优先级 if (match := re.search(pattern, text)) is not None: print(match.group()) ``` 3. **与常规赋值的对比** | 特征 | 赋值表达式 (`:=`) | 常规赋值 (`=`) | |----------------|------------------|--------------| | 返回值 | 返回赋值结果 | 无返回值 | | 作用域 | 当前作用域 | 当前作用域 | | 适用位置 | 表达式内部 | 语句级别 | #### 四、最佳实践指南 1. **适用场景推荐** - 需要重复调用的函数返回值(如`len()`,`re.match()`) - 循环条件需要更新值的场景 - 推导式中需要保存中间计算结果 2. **代码可读性建议** - 复杂表达式应添加括号明确优先级 - 变量命名应有明确含义(避免`a := func()`) - 单行代码不宜嵌套过多海象运算符 3. **错误使用示例** ```python # 错误:试图在lambda参数中使用 lambda: (x := 5) # SyntaxError # 错误:顶层表达式使用 (config := load_config()) # 文件模块级别禁止使用 ``` #### 五、底层实现原理 1. **字节码差异** 通过`dis`模块查看字节码: ```python # 常规赋值 >>> dis.dis('a=5') 1 0 LOAD_CONST 0 (5) 2 STORE_NAME 0 (a) 4 LOAD_CONST 1 (None) 6 RETURN_VALUE # 赋值表达式 >>> dis.dis('(a:=5)') 1 0 LOAD_CONST 0 (5) 2 DUP_TOP 4 STORE_NAME 0 (a) 6 RETURN_VALUE ``` 2. **内存管理机制** 与常规赋值共享相同的引用计数规则,当表达式所在代码块执行完毕后,相关对象可能被回收。 --相关问题-- 1. 海象运算符与普通赋值在作用域上有什么异同? 2. 如何在正则表达式匹配中有效使用赋值表达式? 3. 为什么Python要限制赋值表达式的使用场景? 4. 如何判断项目代码是否适合使用海象运算符? [^1]: 赋值表达式解决代码重复问题 [^2]: 海象运算符命名来源 [^3]: 文件读取场景应用示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值