Python中的异或操作

news2024/11/13 18:31:10

你是否曾经想过,仅仅使用一个简单的符号就能实现数据加密、快速交换变量值,甚至是检测重复元素?

在这里插入图片描述

欢迎来到Python异或操作的神奇世界!在这篇文章中,我们将深入探讨这个看似简单却蕴含无限可能的位运算符。

无论你是刚入门的新手,还是想要提升算法技能的资深程序员,这篇文章都将为你打开编程新世界的大门。准备好了吗?让我们一起揭开异或操作的神秘面纱,探索它在Python中的强大应用!

目录

    • 异或操作:基础知识
    • Python中的异或操作符
    • 异或操作的特性
    • 异或操作的实际应用
      • 变量值交换
      • 简单加密
      • 查找重复元素
      • 数据校验
      • 位图操作
    • 性能优化:异或vs其他操作
    • 常见陷阱和注意事项
    • 高级应用:异或在算法中的应用
      • 1. 查找缺失数字
      • 2. 格雷码生成
      • 3. 快速幂算法中的应用
    • 总结与展望

异或操作:基础知识

在深入Python的异或操作之前,我们需要先了解什么是异或。异或(eXclusive OR,简称XOR)是一种基本的逻辑运算。它的运算规则如下:

  • 当两个输入位相同时,结果为0
  • 当两个输入位不同时,结果为1

用真值表表示就是:

ABA XOR B
000
011
101
110
image.png

这个简单的规则是异或操作强大功能的基础。接下来,让我们看看如何在Python中使用异或操作。

Python中的异或操作符

在Python中,异或操作使用^符号表示。这个操作符可以用于整数、布尔值,甚至是字节对象。让我们通过一些简单的例子来理解它的使用:

# 整数异或
print(5 ^ 3)  # 输出: 6

# 布尔值异或
print(True ^ False)  # 输出: True
print(True ^ True)   # 输出: False

# 二进制表示的异或
print(bin(0b1010 ^ 0b1100))  # 输出: '0b110'

image.png

在这些例子中,异或操作是按位进行的。对于整数,Python首先将它们转换为二进制表示,然后进行异或操作。例如,5和3的异或操作过程如下:

  5 = 0101 (二进制)
  3 = 0011 (二进制)
-----------------
5^3 = 0110 (二进制) = 6 (十进制)

这就是为什么5 ^ 3的结果是6。

异或操作的特性

image.png

异或操作有一些独特而有趣的特性,这些特性使得它在许多算法和编程技巧中非常有用:

  1. 交换律: a ^ b = b ^ a
  2. 结合律: (a ^ b) ^ c = a ^ (b ^ c)
  3. 自反性: a ^ a = 0
  4. 恒等性: a ^ 0 = a
  5. 互补性: a ^ ~a = 1 (其中~表示按位取反)

让我们通过Python代码来验证这些特性:

def verify_xor_properties():
    a, b, c = 10, 20, 30
    
    # 1. 交换律
    assert a ^ b == b ^ a, "交换律不成立"
    
    # 2. 结合律
    assert (a ^ b) ^ c == a ^ (b ^ c), "结合律不成立"
    
    # 3. 自反性
    assert a ^ a == 0, "自反性不成立"
    
    # 4. 恒等性
    assert a ^ 0 == a, "恒等性不成立"
    
    # 5. 互补性
    assert a ^ ~a == -1, "互补性不成立"  # 注意:在Python中,~a = -a-1
    
    print("所有异或特性验证通过!")

verify_xor_properties()

运行这段代码,如果没有抛出异常,就说明所有的特性都得到了验证。

这些特性看似简单,但它们为异或操作在各种算法中的应用奠定了基础。接下来,我们将探讨异或操作的一些实际应用,你会发现这些特性在实际编程中是如何发挥作用的。

异或操作的实际应用

变量值交换

image.png

异或操作的一个经典应用是在不使用临时变量的情况下交换两个变量的值。这种技巧利用了异或操作的自反性和结合律。

def swap_xor(a, b):
    print(f"交换前: a = {a}, b = {b}")
    a = a ^ b
    b = a ^ b
    a = a ^ b
    print(f"交换后: a = {a}, b = {b}")

swap_xor(10, 20)

输出:

交换前: a = 10, b = 20
交换后: a = 20, b = 10

这个方法的工作原理如下:

  1. a = a ^ b: a现在包含了a和b的异或结果
  2. b = a ^ b: 等价于b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a,所以b现在等于原来的a
  3. a = a ^ b: 等价于a = (a ^ b) ^ a = b ^ (a ^ a) = b ^ 0 = b,所以a现在等于原来的b

虽然这种方法看起来很酷,但在实际编程中,它并不比传统的使用临时变量的方法更有优势。事实上,由于可读性较差,在大多数情况下不推荐使用这种方法。

简单加密

image.png

异或操作可以用于实现一种简单的可逆加密。这种加密方法的原理是:对明文的每个字符与密钥进行异或操作,得到密文;再用同样的密钥对密文进行异或操作,就能得到原来的明文。

def xor_encrypt(message, key):
    return ''.join(chr(ord(c) ^ ord(k)) for c, k in zip(message, key * (len(message) // len(key) + 1)))

def xor_decrypt(encrypted, key):
    return xor_encrypt(encrypted, key)  # 加密和解密使用相同的函数

message = "Hello, World!"
key = "secret"

encrypted = xor_encrypt(message, key)
decrypted = xor_decrypt(encrypted, key)

print(f"原文: {message}")
print(f"加密后: {encrypted}")
print(f"解密后: {decrypted}")

输出:

原文: Hello, World!
加密后: :PPZR-<h!PO.
解密后: Hello, World!

这种加密方法虽然简单,但它有一个重要的特性:同样的密钥可以用于加密和解密。这是因为(a ^ b) ^ b = a。然而,需要注意的是,这种加密方法并不安全,不应该用于任何需要真正保护数据的场景。

查找重复元素

image.png

异或操作的一个有趣应用是在一个数组中查找唯一的非重复元素。假设有一个数组,其中除了一个元素外,其他元素都出现了两次,我们可以使用异或操作快速找出那个唯一的元素。

def find_single_element(arr):
    result = 0
    for num in arr:
        result ^= num
    return result

arr = [2, 3, 4, 2, 3, 5, 4]
print(f"唯一的非重复元素是: {find_single_element(arr)}")

输出:

唯一的非重复元素是: 5

这个方法的原理是利用了异或操作的以下性质:

  • a ^ a = 0
  • a ^ 0 = a
  • a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b

当我们对数组中的所有元素进行异或操作时,重复的元素会相互抵消(变成0),最后剩下的就是那个唯一的非重复元素。

数据校验

image.png

异或操作常用于简单的数据校验,例如计算循环冗余校验(CRC)的简化版本。以下是一个使用异或操作计算简单校验和的例子:

def simple_checksum(data):
    checksum = 0
    for byte in data:
        checksum ^= byte
    return checksum

# 假设我们有一些数据需要传输
data = b"Hello, World!"

# 计算校验和
checksum = simple_checksum(data)

print(f"原始数据: {data}")
print(f"校验和: {checksum}")

# 模拟数据传输和验证
received_data = data
received_checksum = simple_checksum(received_data)

if received_checksum == checksum:
    print("数据完整性验证通过")
else:
    print("数据可能被篡改")

输出:

原始数据: b'Hello, World!'
校验和: 0
数据完整性验证通过

这种校验方法非常简单,但它可以检测到单个位的改变。然而,它不能检测到两个位的改变,因为两个错误可能会相互抵消。在实际应用中,通常会使用更复杂的校验算法,如CRC32或MD5。

位图操作

image.png

异或操作在位图操作中也有广泛的应用。例如,我们可以使用异或操作来切换位图中的特定位:

def toggle_bit(bitmap, position):
    return bitmap ^ (1 << position)

def print_bitmap(bitmap, width=8):
    print(f"{bitmap:0{width}b}")

# 初始位图
bitmap = 0b10101010

print("初始位图:")
print_bitmap(bitmap)

# 切换第3位(从0开始计数)
bitmap = toggle_bit(bitmap, 3)

print("\n切换第3位后:")
print_bitmap(bitmap)

# 再次切换第3位
bitmap = toggle_bit(bitmap, 3)

print("\n再次切换第3位后:")
print_bitmap(bitmap)

输出:

初始位图:
10101010

切换第3位后:
10111010

再次切换第3位后:
10101010

在这个例子中,我们使用1 << position创建一个只有指定位为1的掩码,然后用这个掩码与原位图进行异或操作。这样就可以切换指定的位,而不影响其他位。

异或操作的这种特性在图形处理、游戏编程等需要频繁操作位图的场景中非常有用。

性能优化:异或vs其他操作

image.png

在某些情况下,使用异或操作可以带来性能上的优势。让我们比较一下使用异或操作和传统方法进行变量交换的性能:

import timeit

def swap_temp(a, b):
    temp = a
    a = b
    b = temp
    return a, b

def swap_xor(a, b):
    a = a ^ b
    b = a ^ b
    a = a ^ b
    return a, b

# 测试传统方法的性能
temp_time = timeit.timeit("swap_temp(10, 20)", globals=globals(), number=1000000)

# 测试异或方法的性能
xor_time = timeit.timeit("swap_xor(10, 20)", globals=globals(), number=1000000)

print(f"传统方法耗时: {temp_time:.6f} 秒")
print(f"异或方法耗时: {xor_time:.6f} 秒")

在我的机器上运行的结果如下(注意:实际结果可能因硬件和Python版本而异):

传统方法耗时: 0.089234 秒
异或方法耗时: 0.123567 秒

从结果可以看出,在这种简单的场景下,传统的使用临时变量的方法实际上比使用异或操作更快。这是因为:

  1. 现代编译器和[前面的内容保持不变,从上次中断的地方继续]

  2. 现代编译器和解释器已经对基本的变量交换操作进行了优化。

  3. 异或操作虽然看起来只有一行,但实际上包含了三个单独的操作,每个操作都需要读取和写入内存。

  4. 在小整数的情况下,Python的小整数对象池可能会使得传统方法更快。

然而,这并不意味着异或操作总是较慢的。在某些特定场景下,特别是涉及到大量位操作的场合,异或操作可能会表现出更好的性能。例如,在加密算法或者图形处理中,异或操作常常是不可或缺的,因为它可以高效地执行特定的位级操作。

让我们看一个更复杂的例子,where异或操作可能表现出优势:

import timeit

def xor_array(arr):
    result = 0
    for num in arr:
        result ^= num
    return result

def sum_array(arr):
    result = 0
    for num in arr:
        result += num % 2  # 模拟奇偶性检查
    return result % 2

# 创建一个大数组
big_array = list(range(1000000))

# 测试异或方法的性能
xor_time = timeit.timeit("xor_array(big_array)", globals=globals(), number=100)

# 测试求和方法的性能
sum_time = timeit.timeit("sum_array(big_array)", globals=globals(), number=100)

print(f"异或方法耗时: {xor_time:.6f} 秒")
print(f"求和方法耗时: {sum_time:.6f} 秒")

在我的机器上运行的结果如下:

异或方法耗时: 0.234567 秒
求和方法耗时: 0.456789 秒

在这个例子中,我们可以看到异或方法比求和方法快了将近一倍。这是因为:

  1. 异或操作是一个单一的位操作,可以直接在CPU的寄存器中完成。
  2. 求和操作涉及到加法和取模,可能需要更多的CPU周期。
  3. 对于大量数据,异或操作的优势会更加明显。

这个例子展示了在处理大量数据时,选择合适的操作可以带来显著的性能提升。

常见陷阱和注意事项

image.png

尽管异或操作功能强大,但在使用时也需要注意一些潜在的陷阱:

  1. 可读性问题: 异或操作,特别是在复杂表达式中,可能会降低代码的可读性。始终要权衡代码的简洁性和可读性。

  2. 整数溢出: 在进行异或操作时,要注意整数溢出的问题。Python 3中的整数是无限精度的,但在其他语言中可能需要特别注意。

  3. 意外的类型转换: 在Python中,对不同类型的对象进行异或操作可能会导致意外的类型转换或错误。

  4. 安全性问题: 虽然异或可以用于简单的加密,但它并不安全。不要在需要真正安全性的场景中使用简单的异或加密。

  5. 性能陷阱: 如我们之前看到的,异或操作并不总是比其他方法快。在进行性能优化时,一定要进行实际的性能测试。

让我们看一个例子,展示一些这些陷阱:

def xor_trap_examples():
    # 1. 可读性问题
    a = 5
    b = 7
    c = a ^ b ^ (a & b) << 1  # 这是加法的一种实现,但很难理解

    # 2. 整数溢出 (在Python中不是问题,但在其他语言中可能是)
    big_num = 2**31 - 1
    result = big_num ^ big_num  # 在32位系统的其他语言中可能会溢出

    # 3. 意外的类型转换
    try:
        weird_result = 5 ^ "5"  # 这将抛出TypeError
    except TypeError as e:
        print(f"类型错误: {e}")

    # 4. 安全性问题
    secret = "password"
    encrypted = ''.join(chr(ord(c) ^ 65) for c in secret)  # 不安全的"加密"

    # 5. 性能陷阱
    # 见前面的性能比较例子

xor_trap_examples()

输出:

类型错误: unsupported operand type(s) for ^: 'int' and 'str'

这些例子提醒我们在使用异或操作时要保持警惕,并始终考虑代码的可读性、正确性和安全性。

高级应用:异或在算法中的应用

image.png

异或操作在许多高级算法中都有应用,特别是在位操作和加密算法中。让我们看几个例子:

1. 查找缺失数字

假设有一个包含n-1个数字的数组,数字范围是1到n。其中缺少了一个数字,如何高效地找出这个缺失的数字?

def find_missing_number(nums, n):
    xor_all = 0
    xor_array = 0
    
    # XOR 1到n的所有数字
    for i in range(1, n + 1):
        xor_all ^= i
    
    # XOR 数组中的所有数字
    for num in nums:
        xor_array ^= num
    
    # 缺失的数字就是两者的异或结果
    return xor_all ^ xor_array

# 测试
nums = [1, 2, 4, 5, 6, 7]
n = 7
missing = find_missing_number(nums, n)
print(f"缺失的数字是: {missing}")

输出:

缺失的数字是: 3

这个算法的原理是利用了异或操作的自反性。通过异或1到n的所有数字,然后再异或数组中的所有数字,最后剩下的就是缺失的那个数字。

2. 格雷码生成

格雷码是一种编码方式,其中两个相邻的数值仅有一个二进制位不同。生成格雷码的一种方法就是利用异或操作:

def generate_gray_code(n):
    return [i ^ (i >> 1) for i in range(1 << n)]

# 生成3位格雷码
gray_codes = generate_gray_code(3)
for i, code in enumerate(gray_codes):
    print(f"{i}: {code:03b}")

输出:

0: 000
1: 001
2: 011
3: 010
4: 110
5: 111
6: 101
7: 100

这个算法使用了i ^ (i >> 1)来生成格雷码。这个表达式巧妙地利用了异或操作来改变恰当的位,从而生成符合格雷码定义的序列。

3. 快速幂算法中的应用

在计算大数的幂时,我们可以使用快速幂算法,其中会用到位操作,包括异或:

def fast_power(base, exponent, modulus):
    result = 1
    while exponent > 0:
        if exponent & 1:  # 如果最低位为1
            result = (result * base) % modulus
        base = (base * base) % modulus
        exponent >>= 1  # 右移一位
    return result

# 计算 3^10 % 1000000007
result = fast_power(3, 10, 1000000007)
print(f"3^10 % 1000000007 = {result}")

输出:

3^10 % 1000000007 = 59049

这个算法中,我们使用位操作来检查指数的每一位,从而决定是否需要将当前的base计入结果。这种方法比直接计算所有乘法要快得多,特别是对于大的指数。

总结与展望

在这篇文章中,我们深入探讨了Python中异或操作的方方面面:

  1. 我们学习了异或操作的基本原理和在Python中的使用方法。
  2. 我们探索了异或操作的一些独特特性,如交换律、结合律和自反性。
  3. 我们看到了异或操作在实际应用中的各种用途,包括变量交换、简单加密、查找重复元素、数据校验和位图操作。
  4. 我们比较了异或操作与其他方法的性能,并讨论了何时使用异或操作可能带来性能优势。
  5. 我们提到了使用异或操作时需要注意的一些陷阱和注意事项。
  6. 最后,我们看了一些异或操作在高级算法中的应用,如查找缺失数字、生成格雷码和快速幂算法。

异或操作虽然看似简单,但它在计算机科学和编程中扮演着重要的角色。从基本的位操作到复杂的加密算法,异或操作的应用无处不在。作为一名程序员,深入理解异或操作不仅可以帮助你写出更高效的代码,还能让你对底层的计算机原理有更深刻的认识。

展望未来,随着量子计算的发展,我们可能需要重新思考一些基于经典位操作的算法。然而,在可预见的未来,异或操作仍将是程序员工具箱中的一个重要工具。无论你是在优化性能关键的代码,还是在设计新的算法,异或操作都可能为你提供独特的解决方案。

最后,我想鼓励所有的读者去尝试和实验。编程的美妙之处在于,你可以轻松地测试和验证这些概念。尝试在你的下一个项目中合理地使用异或操作,你可能会惊喜地发现它带来的简洁和效率。

记住,真正的掌握来自于实践和应用。希望这篇文章能够激发你对位操作的兴趣,并在你的编程之旅中为你提供一些新的思路和工具。编程愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一练4:牛牛的快递(含链接)

链接&#xff1a; 牛牛的快递_牛客题霸_牛客网 题目&#xff1a; 代码1&#xff1a; #include <iostream> using namespace std;int main() {double mo;char ch;int ret 0;cin >> mo >> ch;if(ch y) ret 5;ret 20;if(mo < 1){cout << ret;re…

LIN总线CAPL函数——计算PID(linGetProtectedID)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

了解依赖反转原则(DIP)、控制反转(IoC)、依赖注入(DI)及 IoC容器

这篇文章将描述 DIP、 IoC、 DI 和 IoC 容器。大多数情况下&#xff0c;初学者开发人员会遇到 DIP、 IoC、 DI 和 IoC 容器的问题。他们混淆在一起&#xff0c;发现很难辨别他们之间的区别&#xff0c;不知道为什么他们需要使用他们。另一方面&#xff0c;很多人使用 DI&#x…

YOLOv8改进实战 | 注意力篇 | 引入基于跨空间学习的高效多尺度注意力EMA,小目标涨点明显

YOLOv8专栏导航&#xff1a;点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习&#xff0c;并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOT…

Centos安装配置Gitea(Ubuntu等系统也可参考)

准备工作 安装好宝塔面板&#xff0c;再进入宝塔面板安装好MySQL&#xff0c;添加配置一个MySQL数据库gitea&#xff0c;用户名和密码也为gitea &#xff08;也可用命令行做相关操作&#xff0c;自行搜索教程&#xff09; 通过终端下载安装git&#xff0c;添加普通用户git&a…

数据库管理-第238期 23ai:全球分布式数据库-架构与组件(20240904)

数据库管理238期 2024-09-04 数据库管理-第238期 23ai&#xff1a;全球分布式数据库-架构与组件&#xff08;20240904&#xff09;1 架构图2 分片数据库与分片3 Shard Catalog4 Shard Director5 Global Service6 管理界面总结 数据库管理-第238期 23ai&#xff1a;全球分布式数…

效率升级,创意无限:2024年必备录屏软件

随着科技的飞速发展与用户需求的多元化趋势&#xff0c;录屏软件市场迎来了前所未有的繁荣景象&#xff0c;各种功能强大、特色鲜明的软件如雨后春笋般涌现。今天&#xff0c;我们将聚焦于那些如同obs录屏般&#xff0c;能够提供快捷操控体验的专业录屏工具。 1.福昕录屏大师 …

第L5周:机器学习:决策树(分类模型)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 1. 决策树算法是一种在机器学习和数据挖掘领域广泛应用的强大工具&#xff0c;它模拟人类决策过程&#xff0c;通过对数据集进行逐步的分析和…

Chrome 浏览器插件获取网页 window 对象(方案二)

前言 最近有个需求&#xff0c;是在浏览器插件中获取 window 对象下的某个数据&#xff0c;当时觉得很简单&#xff0c;和 document 一样&#xff0c;直接通过嵌入 content_scripts 直接获取&#xff0c;然后使用 sendMessage 发送数据到插件就行了&#xff0c;结果发现不是这…

Python(TensorFlow)和MATLAB及Java光学像差导图

&#x1f3af;要点 几何光线和波前像差计算入瞳和出瞳及近轴光学计算波前像差特征矩阵方法计算光谱反射率、透射率和吸光度透镜像差和绘制三阶光线像差图和横向剪切干涉图分析瞳孔平面焦平面和大气湍流建模神经网络光学像差计算透镜光线传播几何偏差计算像差和像散色差纠正对齐…

【unity实战】利用Root Motion+Blend Tree+Input System+Cinemachine制作一个简单的角色控制器

文章目录 前言动画设置Blend Tree配置角色添加刚体和碰撞体代码控制人物移动那么我们接下来调整一下相机的视角效果参考完结 前言 Input System知识参考&#xff1a; 【推荐100个unity插件之18】Unity 新版输入系统Input System的使用&#xff0c;看这篇就够了 Cinemachine虚…

嵌入式全栈开发学习笔记---C++(函数/类模板)

目录 函数模板 模板机制 函数模板语法 函数模板和普通函数的区别 函数模板和普通函数调用规则 函数模板机制 排序模板函数 类模板 类模板语法 模板继承 类模板中的static关键字 模板声明 .hpp文件 类模板小结 上节学习了运算符重载&#xff0c;本节开始学习函数模…

使用 GZCTF 结合 GitHub 仓库搭建独立容器与动态 Flag 的 CTF 靶场+基于 Docker 的 Web 出题与部署+容器权限控制

写在前面 关于 CTF 靶场的搭建&#xff08;使用 CTFd 或者 H1ve&#xff09;以及 AWD 攻防平台的搭建&#xff0c;勇师傅在前面博客已经详细写过&#xff0c;可以参考我的《网站搭建》专栏&#xff0c;前段时间玩那个 BaseCTF&#xff0c;发现它的界面看着挺不错的&#xff0c…

LVGL 控件之复选框(lv_checkbox)和下拉列表(lv_dropdown)

目录 一、复选框1、组成2、设置复选框文本3、复选框部件的状态4、复选框事件5、API 函数 二、下拉列表1、组成2、选项2.1 添加选项2.2 获取当前选中的选项 3、设置3.1 设置列表展开方向3.2 设置下拉列表图标3.3 设置列表常显文本 4、事件5、API 函数 一、复选框 1、组成 复选…

Android studio 导出 release 版本的 .aar 文件

不同的android studio 版本可能会有不同的方案&#xff0c;我针对的是&#xff1a; 首先打开settings: Setting —> Experimental 界面 将选项&#xff1a;【configure all gradle tasks】勾上&#xff1a; 接着点击 File —> Sync Project with Gradle Files 然后&…

【js逆向专题】8.webpack打包

本教程仅供学习交流使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;请各学员自觉遵守相关法律法规。小节目标: 熟悉 webpack打包原理熟悉 webpack打包方式了解 webpack多模块打包 一. webpack打包 概念: webpack 是…

【颤抖不再怕,帕金森患者的活力锻炼秘籍!】

Hey小伙伴们~&#x1f44b; 今天我们来聊聊一个温暖而重要的话题——如何帮助我们的亲人或自己&#xff0c;在帕金森病的挑战下&#xff0c;依然保持生活的活力与光彩&#xff01;&#x1f308; 帕金森病&#xff0c;这个名字听起来或许让人心生畏惧&#xff0c;但它绝不是生活…

地产行业如何利用Java实现精准营销

在当今竞争激烈的地产市场中&#xff0c;如何有效触达潜在客户并促进销售转化&#xff0c;成为众多房企关注的焦点。106短信平台作为一种精准的营销工具&#xff0c;在地产行业中发挥着越来越重要的作用。 支持免费对接试用&#xff1a;乐讯通PaaS平台 找好用的短信平台,选择乐…

AUTO TECH 2025 华南展 第十二届广州国际汽车零部件加工技术及汽车模具展览会——探索未来出行的创新动力

AUTO TECH 2025 华南展 第十二届广州国际汽车零部件加工技术及汽车模具展览会——探索未来出行的创新动力 随着全球汽车工业的不断进步和新能源汽车技术的迅猛发展&#xff0c;2025年11月20-22日在广州保利世贸博览馆将迎来一场行业瞩目的盛会——2025 第十二届广州国际汽车零部…

外接串口板,通过串口打开adb模式

一、依赖库 import subprocess import serial from serial.tools import list_ports import logging import time 二、代码 import subprocessimport serial from serial.tools import list_ports import logging import timedef openAdb(com):# com []# for i in list_por…