1.关于类与对象的说法
class Solution:
def sum(self, num1: int, num2: int) -> int:
return num1 + num2
可能多年以后会觉得这个东西非常的弱智,但是现在我还是非常虔诚的去认知每一项的具体内容与含义
class是对于类的定义,我的认知和理解就是说,相当于编程的时候去创建一个文件夹,就是单纯的创建文件,还不够,类他就可以更加封装的去整理函数,又或者理解为蓝图,关键点在于使用的时候需要实例化,也就是把蓝图在特定的位置和特定的区域去实例,所以需要类与对象。比如这样
# 1. 创建类的实例
sol = Solution()
# 2. 调用 sum 方法,传递参数并获取结果
result = sol.sum(5, 3)
# 3. 输出结果
print(result) # 输出: 8
或者这样
class Solution:
def __init__(self, name):
self.name = name # 通过 self 访问实例属性
def sum(self, num1: int, num2: int) -> int:
print(f"Calculating sum in {self.name}'s method.")
return num1 + num2
sol = Solution("Example") # 创建实例并传递名字
result = sol.sum(5, 3) # 调用 sum 方法
print(result) # 输出: 8
当你调用 sol.sum(5, 3) 时,Python实际上在后台执行了类似于 Solution.sum(sol, 5, 3) 这样的操作。
sol 自动作为 self 传递给 sum 方法,所以 self 在方法内部引用的是 sol 实例。
重看:
其实我还是没有特别懂这里的原理,之后再回来看吧
2.关于python中数字的表示
0x表示这个数字为十六进制,0o表示后面的数字为八进制,0b表示后面的数字为二进制
decimal_number = 31
print(bin(decimal_number)) # 输出: '0b11111'
print(oct(decimal_number)) # 输出: '0o37'
print(hex(decimal_number)) # 输出: '0x1f'
3.加法的另外一种实现,按位操作
class Solution:
def sum(self, num1: int, num2: int) -> int:
# Python int 是无限长整型,左移不会自动溢出,因此需要特殊处理
num1, num2 = num1 & 0xFFFFFFFF, num2 & 0xFFFFFFFF
while num2:
carry = ((num1 & num2) << 1) & 0xFFFFFFFF
num1, num2 = num1 ^ num2, carry
return num1 if num1 < 0x80000000 else ~(num1 ^ 0xFFFFFFFF)
对于现在的我来说,看明白位操作并且能自己设计合理的位操作很难,上大学的时候去完成这部分就不简单,现在我也没必要这么早的去设计算法,那么我需要做的是去看懂每一句话的意思,我至少得懂他的结构,每个操作的含义是什么这个总不过分吧,是谁在加谁,谁在减谁,这个还是可以去解决的。
- num1, num2 = num1 & 0xFFFFFFFF, num2 & 0xFFFFFFFF
作用: 这一行代码的目的是将 num1 和 num2 转换为32位无符号整数。
解释:
0xFFFFFFFF 是一个32位的掩码(32个 1),即 4294967295(十进制)。
num1 & 0xFFFFFFFF 和 num2 & 0xFFFFFFFF 使用按位与操作将 num1 和 num2 的高于32位的部分清零,仅保留32位的内容。这样做可以确保在模拟32位系统时,整数始终是32位的。 - while num2:
作用: 这是一个循环,直到 num2 为 0 才会停止。
解释: 每次循环中,num1 和 num2 的值会不断更新,直到 num2 为 0。这代表着没有更多的进位,计算已经完成。 - carry = ((num1 & num2) << 1) & 0xFFFFFFFF
作用: 计算进位。
解释:
num1 & num2 通过按位与操作找到 num1 和 num2 中同时为 1 的位,这些位是需要进位的位。
<< 1 将这些进位左移一位(因为进位需要加到下一位)。
& 0xFFFFFFFF 再次确保结果是32位无符号整数。 - num1, num2 = num1 ^ num2, carry
作用: 计算无进位和,并更新 num1 和 num2 的值。
解释:
num1 ^ num2 通过按位异或操作计算无进位的部分,这些位在 num1 和 num2 中仅有一个为 1。
carry 是上一步计算出的进位,赋值给 num2 以在下一次循环中处理。 - return num1 if num1 < 0x80000000 else ~(num1 ^ 0xFFFFFFFF)
作用: 返回最终的计算结果,并处理负数的情况。
解释:
num1 < 0x80000000:
如果 num1 小于 0x80000000,这意味着 num1 在 32 位有符号整数范围内是非负数(正数或零),因为最高位是 0。
在这种情况下,直接返回 num1,因为它已经是一个正确的正数。
else ~(num1 ^ 0xFFFFFFFF):
如果 num1 >= 0x80000000,这意味着 num1 在 32 位有符号整数范围内应该表示为负数(因为最高位是 1)。
在这种情况下,需要将 num1 转换为对应的负数值。这是通过以下步骤完成的:
num1 ^ 0xFFFFFFFF: 对 num1 进行按位取反(即 XOR 操作),将 num1 的所有位都反转。
取反操作,相当于 -(num1 + 1),因为在二进制补码中,~x 等价于 -x - 1。
通过这种操作,最终得到的就是 num1 在 32 位有符号整数范围内的负数值。
基本看懂了,其实就是按照正常的二进制加法的逻辑在计算
4.关于python函数的返回类型的选择
基本类型:
int: 表示返回一个整数。
float: 表示返回一个浮点数。
str: 表示返回一个字符串。
bool: 表示返回一个布尔值 (True 或 False)。
容器类型:
list: 表示返回一个列表。例如,list[int] 表示返回一个包含整数的列表,list[str] 表示返回一个包含字符串的列表。
tuple: 表示返回一个元组。例如,tuple[int, str] 表示返回一个包含整数和字符串的元组。
dict: 表示返回一个字典。例如,dict[str, int] 表示返回一个键为字符串、值为整数的字典。
set: 表示返回一个集合。例如,set[float] 表示返回一个包含浮点数的集合。
其他类型:
None: 表示函数不返回任何值。
Optional: 表示返回的值可能是某种类型,也可能是 None。例如,Optional[int] 表示函数可能返回一个整数,也可能返回 None。
Union: 表示返回值可能有多种类型。例如,Union[int, str] 表示函数可能返回一个整数或字符串。
Callable: 表示返回一个可调用对象(如函数)。例如,Callable[[int, int], int] 表示一个接受两个整数参数并返回整数的函数。