linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

Python: List深入概述

  • Python 中列表的内存管理
  • Python 列表是如何在内部实现的
  • Python 列表操作及其复杂性
  • Python 列表替代方案和高效列表操作
  • 如何使用 Python 列表(代码示例)
  • Python 中的列表推导式是什么?

Python 列表是一种用途极其广泛且使用广泛的数据结构。它可以存储不同的项目集合,无论其类型或类型组合如何。本文旨在深入探讨 Python 列表、内存管理和列表理解。

Python 中列表的内存管理

Python 列表如此强大的原因之一是它们是动态的。这意味着列表大小可以在执行期间改变。创建列表时,Python 会分配比容纳未来项目所需的更多内存。因此,当您追加新元素时,Python 不需要分配更多内存,从而提高了程序的效率。列表中的每一项都引用存储在内存中的实际对象。例如,当您创建一个包含整数的列表时,该列表并不直接保存整数值。相反,它存储对存储实际整数的内存位置的引用(或指针)。此功能允许 Python 列表是异构的,即它们可以存储不同类型的项目。

Python 列表是如何在内部实现的

Python 列表被实现为动态数组。当您将一个项目追加到列表中时,Python 将其添加到数组的末尾。如果数组已满,Python 会分配一个更大的新数组,并将所有旧元素复制到新数组中。

这个过程通过过度分配来优化。当需要新数组时,Python 不仅为当前数量的元素分配足够的空间,还会为未来的元素分配额外的空间。虽然这种过度分配看起来很浪费,但它提高了附加元素时的性能,因为每个附加操作都可以选择新数组。

Python 中的列表类似于 Java 中的 ArrayLists 和 C++ 中的 Vectors 。

Python 列表操作及其复杂性

Python 列表提供了几种用于操作列表的内置方法。让我们讨论一些最常见的操作:

  1. 访问元素 ( list[index] ):访问列表中的元素是一个常数时间操作,即 O(1),无论列表的大小如何。

  2. 追加元素 ( list.append(item) ):正如我们之前讨论的,由于过度分配,向列表追加一个项目通常是一个常数时间操作,即 O(1)。但是,当需要分配新数组时,操作将变为线性时间,即 O(n),因为列表项将被复制到新的更大列表。

  3. 插入元素( list.insert(index, item) ):插入一项需要将所有后续元素移动一位,因此这是一个线性时间操作,即 O(n)。

  4. 删除元素( list.remove(item) ):Python 需要搜索列表中的项目并移动所有后续元素,因此这也是一个线性时间操作,即 O(n)。

  5. 搜索元素( item in list ):Python 需要检查每个项目直到找到该项目,因此这是一个线性时间操作,即 O(n)。

Python 列表替代方案和高效列表操作

Python 列表是我们可用的令人惊奇的数据结构。它们非常强大且用途广泛,您可以看到它们如何存储多种数据类型。这告诉我们在哪里可以使用 Python 列表以及在哪里应该考虑替代方案。

首先我们来说说高效的列表操作:

  1. 预分配列表空间:如果您知道列表将容纳多少项,请使用 [None] * n 语法为其预分配空间。这使得 Python 无需在添加元素时分配空间。如果您正在解决任何面试问题,并且确定存储元素需要恒定的内存。然后您可以执行以下操作:

  2. 使用列表推导式:列表推导式比使用 for 循环创建列表更具可读性且速度更快。

  3. 避免使用 insert(0, item) 和 del list[0] :这些操作很慢,因为它们需要移动所有其他元素。相反,如果您需要从列表两端快速追加或弹出,请考虑使用 collections.deque 。

Python 列表替代方案:

  1. 如果您需要从列表两端快速追加或弹出。考虑使用 Python 集合框架中提供的 collections.deque 。
  2. 如果您需要频繁搜索列表,请考虑使用 set 或 dict ,它们提供恒定时间搜索操作。
  3. 如果您的列表不会更改或仅用于查找。那么元组也是一个不错的选择。

请记住,Python 列表是可变的、有序的项目集合,并且具有多种强大的内置方法来操作这些项目。了解如何正确使用列表是 Python 编程的基础。

如何使用 Python 列表(代码示例)

# Creating a List
my_list = [1, 2, 3, 4, 5]
print(my_list)  # Output: [1, 2, 3, 4, 5]

# Accessing Elements
print(my_list[0])  # Output: 1
print(my_list[-1])  # Output: 5

# Modifying an Item
my_list[0] = 10
print(my_list)  # Output: [10, 2, 3, 4, 5]

# Appending Elements
my_list.append(6)
print(my_list)  # Output: [10, 2, 3, 4, 5, 6]

# Removing Elements
my_list.remove(10)
print(my_list)  # Output: [2, 3, 4, 5, 6]

# Inserting Elements
my_list.insert(0, 1)
print(my_list)  # Output: [1, 2, 3, 4, 5, 6]

# Checking if an Item Exists
print(1 in my_list)  # Output: True
print(10 in my_list)  # Output: False

# Finding the Length of the List
# Note: len() is a built-in function.
print(len(my_list))  # Output: 6

Python 中的列表推导式是什么?

假设你想在Python中遍历一个列表。然后执行某些操作,例如检查列表中的偶数。您通常会这样做:

number_list = [1, 2, 3, 4,  5, 6, 7, 8, 9, 10, 11, 12]

for number in number_list:
    if (number % 2 == 0):
        print(number)
# ---
# Output:
# 2
# 4
# 6
# 8
# 10
# 12

列表推导式是一种单行代码,可以提高 Python 中列表循环的性能,并允许生成更优化、更简洁的代码。使用列表推导式可以轻松编写相同的 for 循环。

number_list = [1, 2, 3, 4,  5, 6, 7, 8, 9, 10, 11, 12]

[print(x) for x in number_list if x % 2 == 0]

列表推导式遵循简单的结构 [expression for item in iterable] 。我们使用 print(x) 作为表达式,后跟 for 循环和条件。条件是可选的,但也经常使用。 [expression for item in iterable if condition] 。

使用列表推导式将小写字符字符串列表转换为大写字符的一个示例:

word_list = ['hello', 'world', 'zen', 'python']
upper_words = [word.upper() for word in word_list]
print(upper_words)  
# Output: ['HELLO', 'WORLD', 'ZEN', 'PYTHON']

嵌套列表理解也是可能的。例如,要展平矩阵(列表的列表):

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for sublist in matrix for num in sublist]
print(flat)  
# Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

请注意,嵌套列表推导式中 for 子句的顺序与您用于嵌套 for 循环的顺序相匹配。

列表推导式是强大的工具,可以使您的 Python 代码更加高效和可读。然而,当过度使用或用于复杂任务时,它们可能会变得难以理解,因此明智地使用它们通常是个好主意。

通过掌握 Python 列表的概念及其特性,可以提高您的 Python 编程技能并编写更清晰、更高效的代码。考虑操作的计算复杂性并根据您的特定需求选择适当的数据结构非常重要。

最近更新时间:
Prev
Python: 异常处理 try-except
Next
Python: 面向对象编程(OOP)