2024.8.11 Python,类与对象

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)

对于现在的我来说,看明白位操作并且能自己设计合理的位操作很难,上大学的时候去完成这部分就不简单,现在我也没必要这么早的去设计算法,那么我需要做的是去看懂每一句话的意思,我至少得懂他的结构,每个操作的含义是什么这个总不过分吧,是谁在加谁,谁在减谁,这个还是可以去解决的。

  1. num1, num2 = num1 & 0xFFFFFFFF, num2 & 0xFFFFFFFF
    作用: 这一行代码的目的是将 num1 和 num2 转换为32位无符号整数。
    解释:
    0xFFFFFFFF 是一个32位的掩码(32个 1),即 4294967295(十进制)。
    num1 & 0xFFFFFFFF 和 num2 & 0xFFFFFFFF 使用按位与操作将 num1 和 num2 的高于32位的部分清零,仅保留32位的内容。这样做可以确保在模拟32位系统时,整数始终是32位的。
  2. while num2:
    作用: 这是一个循环,直到 num2 为 0 才会停止。
    解释: 每次循环中,num1 和 num2 的值会不断更新,直到 num2 为 0。这代表着没有更多的进位,计算已经完成。
  3. carry = ((num1 & num2) << 1) & 0xFFFFFFFF
    作用: 计算进位。
    解释:
    num1 & num2 通过按位与操作找到 num1 和 num2 中同时为 1 的位,这些位是需要进位的位。
    << 1 将这些进位左移一位(因为进位需要加到下一位)。
    & 0xFFFFFFFF 再次确保结果是32位无符号整数。
  4. num1, num2 = num1 ^ num2, carry
    作用: 计算无进位和,并更新 num1 和 num2 的值。
    解释:
    num1 ^ num2 通过按位异或操作计算无进位的部分,这些位在 num1 和 num2 中仅有一个为 1。
    carry 是上一步计算出的进位,赋值给 num2 以在下一次循环中处理。
  5. 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] 表示一个接受两个整数参数并返回整数的函数。

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值