深入了解Python:那些常被忽略的知识点

作为现代编程语言的典范,Python以其简洁、高效和广泛的应用领域赢得了无数开发者的青睐。然而,即使是经验丰富的Python程序员,也可能不了解Python的一些特性或最佳实践。这篇文章将介绍Python中常被忽略的一些知识点,通过全面的分析和代码示例,帮助你更深入地理解和使用Python。
在这里插入图片描述

1. 可变对象与不可变对象

Python中的数据类型分为可变和不可变两种。常被忽视的是它们在内存管理和性能上的影响。例如,列表(list)是可变的,而元组(tuple)是不可变的。
在这里插入图片描述

示例代码

# 可变对象示例
list1 = [1, 2, 3]
list2 = list1
list2.append(4)
print(list1)  # 输出: [1, 2, 3, 4]# 不可变对象示例
tuple1 = (1, 2, 3)
tuple2 = tuple1
tuple2 += (4,)
print(tuple1)  # 输出: (1, 2, 3)

在第一段代码中,list1list2引用同一个对象,因此修改list2也会改变list1。而在第二段代码中,尽管tuple2看似“改变”了,但实际上Python为tuple2分配了一个新的对象。

2. 深拷贝与浅拷贝

对于复杂的数据结构(如嵌套列表),了解深拷贝和浅拷贝之间的区别非常重要。浅拷贝复制对象引用,而深拷贝则复制对象本身及其所有嵌套对象。
在这里插入图片描述

示例代码

import copy# 浅拷贝示例
list1 = [[1, 2, 3], [4, 5, 6]]
list2 = copy.copy(list1)
list2[0][0] = 9
print(list1)  # 输出: [[9, 2, 3], [4, 5, 6]]# 深拷贝示例
list3 = copy.deepcopy(list1)
list3[0][0] = 0
print(list1)  # 输出: [[9, 2, 3], [4, 5, 6]]

在浅拷贝的示例中,list2list1共享内部列表的引用。因此,list2的修改会影响到list1。相反,深拷贝确保list3list1完全独立。

3. 生成器表达式与列表推导式

Python支持多种构造方式来创建迭代器和列表。虽然列表推导式(list comprehensions)被使用得非常广泛,但生成器表达式却常常被忽视。
在这里插入图片描述

示例代码

# 列表推导式
squares = [x**2 for x in range(10)]
print(squares)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# 生成器表达式
squares_gen = (x**2 for x in range(10))
print(next(squares_gen))  # 输出: 0
print(next(squares_gen))  # 输出: 1

列表推导式生成整个列表,并将其保留在内存中,这对于大规模数据可能引发性能问题。生成器表达式则逐个对元素进行计算和迭代,在内存利用方面更加高效。

4. 上下文管理器与with语句

上下文管理器(context managers)和with语句在管理资源(如文件、网络连接等)方面提供了一种优雅的解决方案。
在这里插入图片描述

示例代码

# 常规文件操作
try:file = open('example.txt', 'r')data = file.read()
finally:file.close()# 使用上下文管理器
with open('example.txt', 'r') as file:data = file.read()

第二种方式使用with语句,实现了上下文管理器的协议,确保资源在使用后自动释放,即使出现异常时也不会有资源泄漏的问题。

5. itertools模块

itertools提供了一组用于操作迭代器的工具,可以大大简化复杂的迭代逻辑。即便如此,其强大功能在很多应用中仍然不被充分利用。
在这里插入图片描述

示例代码

import itertools# 无限计数器
for i in itertools.count(10):if i > 15:breakprint(i, end=' ')  # 输出: 10 11 12 13 14 15 # 组合
data = [1, 2, 3]
combinations = itertools.combinations(data, 2)
print(list(combinations))  # 输出: [(1, 2), (1, 3), (2, 3)]

通过itertools,我们可以轻松创建无限计数器、组合、排列等复杂的迭代模式,这既增加了代码的可读性,也提高了其性能。

6. 多线程与多进程

在Python中,由于全局解释器锁(GIL)的存在,多线程多用于IO操作;而多进程则可用于CPU密集型任务。理解两者的区别和最佳实践非常重要。
在这里插入图片描述

示例代码

import threading
import multiprocessing# 多线程示例
def thread_task():print("Thread task")thread = threading.Thread(target=thread_task)
thread.start()
thread.join()# 多进程示例
def process_task():print("Process task")process = multiprocessing.Process(target=process_task)
process.start()
process.join()

使用多线程和多进程技术可以显著提高程序的性能,尤其是在处理需要并行的任务时。选择哪种并发方式要根据具体的应用情况。

7. Decorators与元编程

在这里插入图片描述

装饰器是Python中非常有力的特性,但却常常被低估。装饰器允许程序员以直观的方式修改函数或类的行为,而不需要改变其实际代码。

示例代码

# 简单的装饰器示例
def simple_decorator(func):def wrapper():print("Before function call")func()print("After function call")return wrapper@simple_decorator
def target_function():print("Inside the target function")target_function()

在这个示例中,装饰器simple_decorator修饰了target_function,可以在其调用前后添加行为,而无需更改函数的自身实现。

8. Python中隐藏的魔法方法

Python中的一些“魔法方法”(以双下划线开头和结束的方法,如__init__, __str__, __len__等)为类的定制行为提供了广泛的支持。但某些魔法方法可能不被广泛了解,例如__call__, __enter____exit__

示例代码

# __call__ 方法示例
class CallableClass:def __call__(self):print("Instance called as a function")instance = CallableClass()
instance()  # 输出: Instance called as a function# __enter__ 和 __exit__ 方法示例
class ContextManager:def __enter__(self):print("Entering context")return selfdef __exit__(self, exc_type, exc_value, traceback):print("Exiting context")with ContextManager():print("Inside the context")

这些魔法方法为Python提供了许多灵活的功能,使得对象可以像函数一样调用,或者能够被with语句使用。

9. Python中的函数式编程

在这里插入图片描述

尽管Python不是纯函数式编程语言,但它支持很多函数式编程的概念,例如高阶函数、匿名函数(lambda)、以及函数组合。

示例代码

# 高阶函数与 Lambda 示例
numbers = [1, 2, 3, 4]# 使用 map 和 lambda 进行平方运算
squared = map(lambda x: x**2, numbers)
print(list(squared))  # 输出: [1, 4, 9, 16]# 简单的函数组合
def add_one(x):return x + 1def square(x):return x * xdef compose(func1, func2):return lambda x: func1(func2(x))new_function = compose(add_one, square)
print(new_function(2))  # 输出: 5 (先计算平方,再加一)

函数式编程风格可以使代码更简洁、更具模块化,并且更容易测试。在Python中,结合使用列表推导式和高阶函数可以大大提高代码的表达力。

10. 类型提示与静态分析

随着Python 3的演进,类型提示逐渐成为Python开发中的关键工具。通过类型提示和工具(如mypy)的静态分析可以提高代码质量和可靠性。

示例代码

# 使用类型提示的函数
def add(x: int, y: int) -> int:return x + y# 检查可选类型
from typing import Optionaldef greet(name: Optional[str] = None) -> str:if name is None:return "Hello, Stranger!"else:return f"Hello, {name}!"print(greet())  # 输出: Hello, Stranger!
print(greet("Alice"))  # 输出: Hello, Alice!

类型提示不仅有助于提高代码的可读性,也能借助IDE提供更好的自动补全和静态分析,帮助开发者提前捕获可能的错误。

结论

Python是一门丰富多彩的编程语言,其中蕴含着许多易于被忽略但却非常有用的知识点。这些特性在实际开发中可以显著改善代码的性能、清晰度和维护性。希望这篇文章能帮助你进一步理解和利用Python,成为一个更加高效的Python开发者。

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

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

相关文章

C++入门(引用篇)

在C编程的广阔天地中,引用是一种强大且独特的工具,它允许程序员为已存在的变量创建别名,通过这个别名可以直接访问和操作原始变量。引用的这一特性不仅简化了代码,提高了代码的可读性,还带来了性能上的优势。接下来&am…

推理攻击-Python案例

1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。 2、一种简单的实现方法:用模型对训练数据标签进行拟合,拟合结果即推理为训练集中的情况。 3、了解这些案例可以帮助我们更好的保护数据隐私。 推理攻击(…

【Conda】Conda命令详解:高效更新与环境管理指南

目录 1. Conda 更新命令1.1 更新 Conda 核心1.2 更新所有包 2. 严格频道优先级3. 强制安装特定版本4. 创建与管理环境4.1 创建新环境4.2 激活和停用环境4.3 导出和导入环境4.4 删除环境 5. 清理缓存总结 Conda 是一个强大的包管理和环境管理工具,广泛应用于数据科学…

.net8系列-07图文并茂手把手教你连接SqlServer数据库使用log4net记录.net日志

文章目录 前情提要步骤概览 下载依赖下载安装成功 数据库准备脚本准备执行脚本,创建所需数据库创建成功,查看日志表 准备代码初始代码配置数据库开启数据库写入日志逻辑开启日志 运行测试删除之前的编译文件重新编译运行测试本地日志测试成功数据库日志测…

【英语】2. 英语的表达习惯

文章目录 前言less v. more n.解释e.g. less v. more prep.被动与中文的歧义总结参考文献 前言 进行英语前后缀的复习 less v. more n. 解释 外国的表达方式:更多地偏向静态,因此更多地使用名词 e.g. (rather Chinglish expression) She could not c…

使用 docker-compose 启动 es 集群 + kibana

编写 docker-compose yaml version: v3 services:elasticsearch-node1:image: elasticsearch:7.17.24container_name: elasticsearch-node1ports:- "9200:9200"- "9300:9300"environment:- node.nameelasticsearch-node1- cluster.namemy-es-cluster- dis…

云计算身份认证与访问控制(Cloud Computing Identity Authentication and Access Control)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

PyEcharts教程(002):上手PyEcharts

2、上手PyEcharts(以jupyter notebook编译) 2.1 如何查看pyecharts版本 import pyecharts print(pyecharts.__version__)2.2 上手Pyecharts 首先绘制第一个图表 from pyecharts.charts import Bar # 创建柱形图对象 bar Bar() # 添加x轴 bar.add_xa…

Python案例--九九乘法表

乘法口诀表是学习基础数学中不可或缺的工具,它帮助我们快速记忆乘法结果。在这篇文章中,我将向你展示如何使用Python编程语言来生成一个9x9的乘法口诀表。这不仅对教育工作者和学生有用,而且对任何需要快速回顾乘法事实的人来说都是一个有用的…

浸没边界 直接强迫法 圆球绕流验证 阅读笔记

Combined multi-direct forcing and immersed boundary method for simulating flows with moving particles https://doi.org/10.1016/j.ijmultiphaseflow.2007.10.004 他的意思是,不止需要一次的直接强迫 直接强迫的次数与误差成低于二阶的关系 不知道是不是一阶…

学习使用Cube软件

一、点亮LED灯 1、新建项目 File → New → STM32 Project搜索芯片信号项目名称 弹窗点击Yes 2、点亮LED 配置GPIO为输出模式 细化配置 保存(ctrl S)自动生成代码 手动生成代码 选择跳转到代码页面

【机器学习】知识总结1(人工智能、机器学习、深度学习、贝叶斯、回归分析)

目录 一、机器学习、深度学习 1.人工智能 1.1人工智能概念 1.2人工智能的主要研究内容与应用领域 1.2.1主要研究内容: 1.2.2应用领域 2.机器学习 2.1机器学习的概念 2.2机器学习的基本思路 2.3机器学习的分类 3.深度学习 3.1深度学习的概念 3.2人工智能…

网站集群批量管理-Ansible-模块管理

1. 概述 1. 自动化运维: 批量管理,批量分发,批量执行,维护 2. 无客户端,基于ssh进行管理与维护 2. 环境准备 环境主机ansible10.0.0.7(管理节点)nfs01 10.0.0.31(被管理节点)backup10.0.0.41(被管理节点) 2.1 创建密钥认证 安装sshpass yum install -y sshpass #!/bin/bash ##…

毕设 大数据抖音短视频数据分析与可视化(源码)

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕…

自然语言处理问答系统

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

调试意义、步骤及方式

调试 文章目录 调试1.什么是bug?2.调试是什么?有多重要?2.1调试2.2调试的基本步骤2.3Debug和Release的介绍2.3.1常用的快捷键及功能1.F52.F9条件断点3.F104.F115.CTRLF5 3.调试的时候查看程序当前信息3.1查看临时变量的值3.1.1自动窗口3.1.2监…

力扣59.螺旋矩阵||

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode) 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出&#xff…

Github 2024-10-06 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目2Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次…

HarmonyOS第一课 04 应用程序框架基础-习题分析

判断题 1.在基于Stage模型开发的应用项目中都存在一个app.json5配置文件、以及一个或多个module.json5配置文件。T 正确(True) 错误(False) 这个答案是T - AppScope > app.json5:app.json5配置文件,用于声明应用的全局配置信息,比如应用…

【TypeScript】知识点梳理(三)

#void前面提到了代表空,但有个特殊情况,是空不是空,细谈是取舍,但我们不深究hhh# 代码示例: type func () > voidconst f1: func function() {return true; } 定义了空,返回非空值,理论…