16. 多线程与多进程
import threadingdef print_numbers(): for i in range(1, 6): print(f”线程1: {i}”)def print_letters(): for letter in 'abcde': print(f”线程2: {letter}”)if __name__ == '__main__': thread1 = threading.Thread(target = print_numbers) thread2 = threading.Thread(target = print_letters) thread1.start() thread2.start() thread1.join() thread2.join()
- **注意事项**:多线程在共享资源访问时可能会出现竞争条件(race condition),导致数据不一致。例如多个线程同时对一个全局变量进行修改。为了解决这个问题,需要使用锁(Lock)机制。`threading`模块提供了`Lock`类,通过`acquire()`方法获取锁,`release()`方法释放锁。
import threadingcounter = 0lock = threading.Lock()def increment(): global counter for _ in range(1000000): lock.acquire() counter += 1 lock.release()if __name__ == '__main__': thread1 = threading.Thread(target = increment) thread2 = threading.Thread(target = increment) thread1.start() thread2.start() thread1.join() thread2.join() print(f”最终计数器值: {counter}”)
import multiprocessingdef square_number(num): return num * numif __name__ == '__main__': numbers = [1, 2, 3, 4, 5] with multiprocessing.Pool(processes = 3) as pool: results = pool.map(square_number, numbers) print(results)
- **进程间通信**:`multiprocessing`模块提供了多种进程间通信的方式,如队列(`Queue`)、管道(`Pipe`)等。例如,使用队列在进程间传递数据:
import multiprocessingdef producer(queue): for i in range(5): queue.put(i)def consumer(queue): while True: item = queue.get() if item is None: break print(f”消费数据: {item}”)if __name__ == '__main__': queue = multiprocessing.Queue() producer_process = multiprocessing.Process(target = producer, args = (queue,)) consumer_process = multiprocessing.Process(target = consumer, args = (queue,)) producer_process.start() consumer_process.start() producer_process.join() queue.put(None)# 发送结束信号 consumer_process.join()
17. 正则表达式(re模块)
import retext = ”The quick brown fox jumps over the lazy dog”match = re.search('brown', text)if match: print(f”找到匹配项: {match.group()}”)
- **替换字符串**:`re.sub()`函数用于在字符串中替换匹配正则表达式的部分。
text = ”Hello, World!”new_text = re.sub('World', 'Python', text)print(new_text)
- **提取数据**:通过捕获组(使用圆括号定义)可以从匹配的字符串中提取特定部分。
text = ”My phone number is 123 - 456 - 7890”match = re.search('(\d{3}) - (\d{3}) - (\d{4})', text)if match: print(f”区号: {match.group(1)}, 前缀: {match.group(2)}, 号码: {match.group(3)}”)
18. 面向对象编程的高级特性
class Animal: def __init__(self, name): self.name = name def speak(self): passclass Dog(Animal): def speak(self): return f”{self.name} says Woof!”class Cat(Animal): def speak(self): return f”{self.name} says Meow!”dog = Dog(”Buddy”)print(dog.speak())
class BankAccount: def __init__(self, balance): self.__balance = balance def get_balance(self): return self.__balance def deposit(self, amount): self.__balance += amountaccount = BankAccount(1000)# 不能直接访问__balance属性# print(account.__balance)# 这会导致错误print(account.get_balance())account.deposit(500)print(account.get_balance())
19. Python 内存管理
a = [1, 2, 3]# 创建一个列表对象,对象引用计数为1b = a# 增加一个引用,对象引用计数变为2del a# 删除引用a,对象引用计数减为1del b# 删除引用b,对象引用计数变为0,此时该列表对象占用的内存可能会被垃圾回收器回收
20. 单元测试(unittest 模块)
import unittestdef add(a, b): return a + bclass TestAddFunction(unittest.TestCase): def test_add(self): result = add(2, 3) self.assertEqual(result, 5)if __name__ == '__main__': unittest.main()
-
import unittestdef subtract(a, b): return a - bclass TestSubtractFunction(unittest.TestCase): def test_subtract(self): result = subtract(5, 3) self.assertEqual(result, 2)# 创建测试用例实例test_case1 = TestAddFunction('test_add')test_case2 = TestSubtractFunction('test_subtract')# 创建测试套件suite = unittest.TestSuite()suite.addTest(test_case1)suite.addTest(test_case2)# 创建测试运行器并执行测试套件runner = unittest.TextTestRunner()runner.run(suite)
此外,pytest也是一个流行的 Python 测试框架,它具有更简洁的语法和丰富的插件生态系统,在实际项目中也被广泛使用。例如,使用pytest进行上述加法函数的测试可以这样写:
def add(a, b): return a + bdef test_add(): result = add(2, 3) assert result == 5
在命令行中运行pytest命令即可执行测试。
21. 代码调试技巧
def factorial(n): result = 1 print(f”开始计算 {n} 的阶乘”) for i in range(1, n + 1): result *= i print(f”当前 i 的值: {i},当前结果: {result}”) return result
-
import pdbdef divide(a, b): pdb.set_trace() return a / bdivide(10, 0)
当程序执行到pdb.set_trace()时,会暂停,此时可以使用调试命令逐步分析代码,找出错误原因。