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

news2024/10/7 6:31:53

作为现代编程语言的典范,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:
        break
    print(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 self
    
    def __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 + 1

def square(x):
    return x * x

def 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 Optional

def 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.coloradmin.cn/o/2193679.html

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

相关文章

图文深入理解Oracle DB Scheduler

值此国庆佳节,深宅家中,闲来无事,就多写几篇博文。今天继续宅继续写。本篇图文深入介绍Oracle DB Scheduler。 Oracle为什么要使Scheduler? 答案就是6个字:简化管理任务。 • Scheduler(调度程序&#x…

代码随想录训练营Day26 | 669. 修剪二叉搜索树 | 108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树

学习文档:代码随想录 (programmercarl.com) Leetcode 669. 修剪二叉搜索树 题目描述 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留…

o1-preview 在 IMO 2024 第一题的实测表现

相关博客:Learning to Reason with LLMs 以及 Introducing OpenAI o1-preview 测试了 IMO 2024 的第一题,OpenAI-o1-preview 的解题过程包括两部分:思考和推理。 正确答案是全体偶数,o1-preview 的 **思考方向正确,推…

计算机网络——email

pop3拉出来 超出ASCII码范围就不让传了 这样就可以传更大的文件

Linux命令大全及小例子

撰写一份关于Linux命令大全的详尽报道和分析是一项重要的任务,旨在让读者全面了解Linux命令的用途和应用场景。Linux系统因其强大的命令行工具而闻名,无论是系统管理、文件操作还是网络配置,Linux命令行都提供了灵活且强大的解决方案。以下是…

【模板进阶】std::void_t

一、 s t d : : v o i d _ t std::void\_t std::void_t的源码分析和常规范例 1. s t d : : v o i d _ t 1.std::void\_t 1.std::void_t的源码分析 C 17 C17 C17引入了 s t d : : v o i d _ t std::void\_t std::void_t,它其实是一个别名模板,源码非常简…

如何为树莓派安装操作系统,以及远程操控树莓派的两种方法,无线操控和插网线操控

文章目录 一、下载树莓派的系统二、将文件下载到SD卡中1.使用官方软件2.其他选择 三、远程连接电脑安装vnc-viewer1.无线操作(配置树莓派,开启VNC)电脑远程配置2.有线连接(需要一根网线) 总结 一、下载树莓派的系统 下…

github学生认证(Github Copilot)

今天想配置一下Github Copilot,认证学生可以免费使用一年,认证过程中因为各种原因折腾了好久,记录一下解决方法供大家参考。 p.s.本文章只针对Github学生认证部分遇到的问题及解决方法,不包括配置copilot的全部流程~ 1、准备工作…

【python实操】python小程序之定义类

引言 python小程序之定义类 文章目录 引言一、定义类1.1 题目1.2 代码1.3 代码解释 二、思考2.1 面向对象编程(OOP)原则2.2 self 参数2.3 内存地址2.4 代码的可读性和可维护性 一、定义类 1.1 题目 小猫爱吃鱼,小猫要喝水,定义不…

Vue (快速上手)

Vue 初识Vue 在Vscode中创建html文件&#xff0c;然后打开该文件&#xff0c;输入英文!即可显示出提示框&#xff0c;选定第一个即可出现默认的html模板。 案例一&#xff1a;值的传递 使用大括号{{}}声明 一个将要被Vue所控制的 DOM 区域&#xff0c;其值可以在<script&…

构建数字化生态平台,开启企业新未来

随着数字化时代的到来&#xff0c;构建数字化生态平台已成为企业获取竞争优势、实现可持续发展的重要途径。数字化生态平台是指利用数字技术构建的&#xff0c;能够整合多方资源&#xff0c;为用户提供一站式服务和价值的开放平台。 数字化生态平台的特点 1.开放性&#xff1a…

Vue/组件的生命周期

这篇文章借鉴了coderwhy大佬的Vue生命周期 在Vue实例化或者创建组件的过程中 内部涉及到一系列复杂的阶段 每一个阶段的前后时机都可能对应一个钩子函数 以下是我根据coderwhy大佬文章对于每一个阶段的一些看法 1.过程一 首先实例化Vue或者组件 在实例化之前 会对应一个钩子函…

Android 组件化利器:WMRouter 与 DRouter 的选择与实践

在移动端开发中&#xff0c;组件化 和 模块化 是常见的开发策略。随着项目的规模增大&#xff0c;不同功能之间的依赖、耦合度会变得越来越复杂&#xff0c;模块间的解耦成为不可避免的需求。路由框架正是在这种需求背景下应运而生。本文我们将讨论两款在Android开发中比较流行…

PyEcharts教程(002):上手PyEcharts

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

51单片机的红外感应洗手器【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机红外感应传感器继电器LED等模块构成。适用于智能红外感应自动洗手器等相似项目。 可实现功能: 1、红外感应传感器实时检测是否有人体接近&#xff08;距离小于20cm&#xff09; 2、如果有人靠近&#xff0c;继电器自动闭合&#…

ZJYYC2360. 圆球的最大得分

思路&#xff1a;这是一道区间dp的题目。最大的数放在最远处会更优&#xff0c;所以每个小孩可以放在 l 处或 r 处&#xff0c;即这段区间的最左边或最右边。这题可以用记忆化搜索来写&#xff0c;用dp[l][r]来记录 i ~ j 之间调整位置后的最大得分。 #include <bits/stdc.…

学校周赛(3)

​ A: 题目&#xff1a; ​​​​​​​ 解题&#xff1a; 本道题木只需要找到一个*的位置&#xff0c;并且查看这个*是否满足四种情况即可&#xff0c;对与判断的体哦见是四周不出现任何的*,由于每次搜索我们首先搜索到的的最左上角的*,因此我们以左上角的为中心进行讨论…

在VSCode中使用Excalidraw

概述 Excalidraw是一款非常不错的示意图绘制软件&#xff0c;没想到在VSCode中有其扩展&#xff0c;可以在VScode中直接使用。 安装扩展 使用 需要创建.excalidraw.svg、.excalidraw或.excalidraw.png等名称的文件。 搭配手写版使用 自由画笔工具可以配合手写板&#xff0c…

【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(下篇)

【ps】本篇有 8 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;字母大小写全排列 .1- 题目解析 .2- 代码编写 2&#xff09;优美的排列 .1- 题目解析 .2- 代码编写 3&#xff09;N 皇后 .1- 题目解析 .2- 代码编写 4&#xff09;有效的数独 .1-…

教育领域的技术突破:SpringBoot系统实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…