变量和底层逻辑(2021-9-15)

本文详细介绍了Python中变量的定义与赋值,包括同时定义多个变量、变量重新赋值及其内存管理原理。还探讨了数学运算符、比较运算符、逻辑运算符的用法及运算规则,并通过实例展示了各种运算符的运用。此外,还提到了赋值运算符的使用和运算符的优先级。

变量和底层逻辑(2021-9-15)

同时定义多个变量

python定义变量的底层逻辑

1、变量

1)同时定义多个变量
1、同时定义多个变量赋相同的值:变量名1 = 变量名2 = 变量名3 =… = 数据
x = y = z = 0
print(x, y, z)
2、同时定义多个变量赋不同的值:变量名1, 变量名2, 变量名3, … = 数据1, 数据2, 数据3, …
name, age, gender = '小明', 18, '男'
print(name, age, gender)
2)变量重新赋值

重新给变量赋值之后,使用变量使用时变量中最新的值

score = 100
print(score)
score = 95
print(score)

请添加图片描述

3)Pytion定义变量和重新给变量赋值的原理

1、Python在定义变量的时候会申请内)存保存数据,内存申请多大看被保存数据需要多大,重新给变量赋值的时候,会申请新的内存,新的内存的大小由新的数据大小决定,然后变量会和新的内存关联,原来的内存会自动销毁。
2、id(变量) - 获取变量对应的内存地址。

num = 100
print(id(num))

2、运算符

数学运算符:+、-、*、/、%、//、**

1)+、-、*、/和数学中的+、-、x、÷的功能一样

注意:除法运算的运算结果是浮点数

2)%(取余)取模

x % y — 求x除以y的余数

print(15 % 2)

应用1:判断两个数是否存在整除关系 - 判断两个数的余数是否为0
应用2:取整数的低位数
一个整数对10取余,能够获取这个数的个位数

一个整数对100取余,能够获取这个数的后两位数

num = 1234
print(num % 10)
3)// - 整除(商向小取整)
print(5 // 2)    # 2  2.5  3
print(-5 // 2)    # -3  -2.5  -2

应用场景:去掉低位数

print(num // 10)     # 123

练习:获取任意一个正整数的百位数

print(num // 100 % 10)
4)** - 幂运算

x ** y -求x的y次方

print(8 ** 3)    # 512
print(9 ** 0.5)    # 3
print(8 ** (1/3))    # 2

请添加图片描述

5)比较运算符:>、<、==(等于)、!=(不等于)、>=、<=

所有的比较运算符的运算结果都是布尔值

print(10 > 20)
print(10 < 20)
print(10 == 20)
 print(10 = 20)    # 错误
print(10 != 20)
print(10 >= 20)

python的比较运算符支持连写表示范围

x = 1
print(0 <= x <= 2)

请添加图片描述

6)逻辑运算符:and(逻辑与)、or(逻辑或)、not(逻辑非)
1、and

1)应用场景:用于需要多个条件同时满足的时候,相当于生活中的并且

2)运算规则:条件1 and 条件2 - 两个都是True结果才是True,只要一个是False,结果就是False

True and True    --    True
True and False    --    False
False and True    --    False
False and False    --    False

练习:写出判断一个是否能同时被3和7整除的条件

num = 22
print('是否能同时被3和7整除:', num % 3 == 0 and num % 7 == 0)

练习:判断指定数是否能被3整除的偶数

num = 12
print('是否能被3整除的偶数:', num % 3 == 0 and num % 2 == 0)

请添加图片描述

2、or

1)应用场景:用于需要多个条件只要有一个条件满足的时候,相当于生活中的或者
2)运算规则:条件! or 条件2 - 两个条件中只要有一个条件是True,结果就是True,两个都是False的时候才是False

练习1:判断指定数是否能被5或7整除

num = 11
print('是否能被5或7整除:', num % 5 == 0 or num % 7 == 0)

练习2:判断指定的年是否是闰年

year = 2000
print('是否是闰年:', year % 4 == 0 and year % 100 != 0 or year % 400 == 0)

请添加图片描述

3、not

1)应用场景:对某一个条件进行否定(如果正向写条件很多很复杂,反向却很简单的时候,条件就反向写再加not)
2)运算规则:not条件
not True – False
not False – True
num = 100
print()

练习:写出判断一个数不能同时被3和7整除的条件
1、能被3整除但不能被7整除:num % 3 == 0 and num % 7 != 0
2、能被7整除但不能被3整除:num % 7 == 0 and num % 3 != 0
1、不能被3整除和不能被7整除:num % 3 != 0 and num % 7 != 0

num = 21

print((num % 3 == 0 and num % 7 != 0) or (num % 7 == 0 and num % 3 != 0) or (num % 3 != 0 and num % 7 != 0))

条件反向写:
能同时被3和7整除的条件:num % 21 == 0
不能同时被3和7整除的条件:not num % 21 == 0

print(not num % 21 == 0)

请添加图片描述

7)逻辑运算符扩展
1、短路操作

and的短路:如果条件1是False,那么条件2对应的代码不会执行
or的短路:如果条件1是True,那么条件2对应的代码不会执行

2、逻辑运算符的通用运算规则

print(True and 100) # 100
print(False and 100) # False
print(True or 100) # True
print(False or 100) # 100
print(7 and 8) # 8
print(not 7) # 7
print(not 0) # 0
(重)重要结论:python任何类型的数据都可以转换成布尔(都有布尔值),其中0值和空值是False,其他都是True

print(bool(0), bool(0.0), bool(''), bool(None))
print(bool(8), bool(-2), bool(0.1), bool(-0.3), bool('abc'), bool(''))

请添加图片描述

8)赋值运算符:=、+=、-+、*=、/=、%=、//=、**=
1、赋值运算符的作用不是计算出一个结果,而是将数据保存到变量中
2、所有赋值运算符的左边必须是变量
3、=

a = 10
b = 100

4、+=、-=、/=、%=、//=、**=

变量 += 数据 - 将变量中保存的数据和+=后面的数据进行加法运算,将运算结果重新赋值给前面的变量
注意:复合的赋值运算符前面的变量必须是已经赋值过的变量

a += 10
print(a)    # 20
a -= 5
print(a)    # 15
a %= 4
print(a)     # 3

强调:所有的赋值运算是没有结果的
print(a += 10) # 报错
请添加图片描述

9)运算符优先级:数学运算符 > 比较运算符 > 逻辑运算符 > 赋值运算符
1、有括号先算括号里面的 - ()
result = 100 + 2 * 3 ** 2 > 20 *10 - 3
print(result)
2、如果布尔数据参与了数学运算,那么False就是0,True就是1
result = 100 + (10 >2)
print(result)

请添加图片描述

<think>我们正在讨论C++变量乘法的底层逻辑。用户要求了解底层逻辑,因此我们需要深入到汇编或机器码层面,解释乘法操作在计算机中是如何执行的。 注意:C++中乘法运算符是`*`,但底层实现取决于操作数的类型(整数、浮点数)具体硬件。 步骤: 1. 整数乘法浮点数乘法在底层是不同的。 2. 整数乘法通常使用处理器中的整数乘法指令,例如`IMUL`(有符号)`MUL`(无符号)。 3. 浮点数乘法使用浮点指令,例如`MULSS`(单精度)、`MULSD`(双精度)等。 4. 乘法操作可能涉及寄存器、内存访问等。 我们可以分两部分:整数浮点数。 由于用户没有指定变量类型,我们分别讨论。 注意:C++中的乘法表达式会被编译器编译为对应的机器指令。 我们先讨论整数乘法,再讨论浮点数乘法。 整数乘法示例: 假设有两个整型变量:`int a = 5; int b = 3;`,那么`a * b`的底层逻辑。 浮点数乘法示例: `float a = 5.0f; float b = 3.0f;`,那么`a * b`的底层逻辑。 另外,我们还可以简要提及编译器优化(如常量折叠)溢出处理。 最后,生成相关问题。 注意:使用中文,行内公式用$...$,独立公式用$$...$$。 回答结构: 1. 整数乘法的底层逻辑 2. 浮点数乘法的底层逻辑 3. 编译器优化(可选) 4. 相关问题 </think>### C++变量乘法的底层逻辑 在C++中,变量乘法(如 `a * b`)的底层实现涉及多个层级,其逻辑架构如下: --- #### 1. **编译阶段** 编译器(如GCC/Clang)将乘法表达式转换为**目标平台特定的汇编指令**: - **整数乘法**:生成`IMUL`(有符号)或`MUL`(无符号)指令 例如 `int c = a * b;` 编译为: ```assembly mov eax, [a] ; 加载变量a到寄存器 imul eax, [b] ; 执行乘法,结果存入eax mov [c], eax ; 存回内存 ``` - **浮点数乘法**:生成`MULSS`(单精度)或`MULSD`(双精度)指令 例如 `float c = a * b;` 编译为: ```assembly movss xmm0, [a] mulss xmm0, [b] ; 使用SSE指令集的浮点乘法 movss [c], xmm0 ``` 数学原理: - 整数乘法:二进制补码运算 $ (a \times b) \mod 2^w $($w$为位宽)[^1] - 浮点乘法:IEEE 754标准 $ (-1)^{s} \times m \times 2^{e} $($s$为符号位,$m$为尾数,$e$为指数)[^2] --- #### 2. **硬件执行阶段** CPU通过**运算器(ALU)** 执行乘法: - **整数乘法电路** 使用布斯算法(Booth&#39;s Algorithm)或华莱士树(Wallace Tree)优化二进制乘法,将 $n$ 位乘法分解为 $\log_2 n$ 级加法[^3]。 - **浮点乘法电路(FPU)** 分离符号位、指数相加、尾数相乘(硬件查表或迭代乘法器),再规范化结果: $$ \begin{cases} s = s_a \oplus s_b \\ e = e_a + e_b - \text{bias} \\ m = m_a \times m_b \end{cases} $$ --- #### 3. **性能优化机制** - **编译优化** - 常量折叠(如 `2*3` 直接替换为 `6`) - 向量化(SIMD):并行计算多个乘法(如SSE/AVX指令) - **硬件优化** - 现代CPU通过超标量流水线并行执行多个乘法 - 专用乘法电路(如Intel的FMA单元融合乘加指令) --- #### 4. **异常处理** - **整数溢出**:结果超出类型范围时发生**未定义行为(UB)**,无硬件中断 - **浮点异常**:触发`FE_INVALID`(如 $0 \times \infty$),可通过`fetestexcept`捕获[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值