当前位置: 首页 > news >正文

二、Python核心编程

 Python数据结构:列表、元组、字典、集合及列表推导式与生成器表达式

在Python编程中,数据结构是存储、组织和操作数据的基础。Python提供了多种内置数据结构,其中列表、元组、字典和集合是最常用的几种。此外,Python还支持列表推导式和生成器表达式,它们为数据处理提供了强大的工具。本文将详细介绍这些数据结构及其用法,以及列表推导式和生成器表达式的应用。

1. 数据结构

      • 列表、元组、字典、集合等内置数据结构的用法

  1. 列表(List)

列表是Python中最基本的数据结构之一,它是一个有序的集合,可以存储任意类型的对象。列表是可变的,这意味着你可以在程序运行时添加、删除或修改列表中的元素。

  • 创建列表:使用方括号[]创建列表,例如my_list = [1, 2, 3, "a", "b"]。

  • 访问元素:通过索引访问列表中的元素,索引从0开始。例如,my_list[0]将返回列表的第一个元素。

  • 常用方法:

  • append(x):在列表末尾添加元素x。

  • insert(i, x):在索引i处插入元素x。

  • extend(iterable):将另一个可迭代对象的元素添加到列表末尾。

  • pop([i]):移除并返回索引i处的元素,默认移除并返回最后一个元素。

  • remove(x):移除列表中第一个匹配的元素x。

  2. 元组(Tuple)

元组与列表类似,但它是不可变的。一旦创建,元组中的元素就不能被修改、添加或删除。

  • 创建元组:使用圆括号()创建元组,例如my_tuple = (1, 2, 3)。

  • 访问元素:通过索引访问元组中的元素,索引从0开始。

  • 常用方法:由于元组是不可变的,因此它支持的方法较少,主要包括count(x)和index(x),分别用于返回元素x在元组中出现的次数和第一次出现的索引。

  3. 字典(Dict)

字典是Python中另一种重要的数据结构,它以键值对的形式存储数据。字典中的元素是无序的,但每个键都是唯一的。

  • 创建字典:使用大括号{}创建字典,例如my_dict = {"name": "Alice", "age": 25}。

  • 访问元素:通过键访问字典中的值,例如my_dict["name"]将返回"Alice"。

  • 常用方法:

  • keys():返回字典中所有键的视图。

  • values():返回字典中所有值的视图。

  • items():返回字典中所有键值对的视图。

  • pop(key[, default]):移除字典中指定的键,并返回该键对应的值。如果键不存在,则返回默认值。

  • update([other]):用另一个字典或可迭代对象中的键值对更新当前字典。

  4. 集合(Set)

集合是一个无序的、不包含重复元素的数据结构。它主要用于数学上的集合运算,如交集、并集和差集。

  • 创建集合:使用大括号{}或set()函数创建集合,例如my_set = {1, 2, 3}或my_set = set([1, 2, 3])。

  • 常用方法:

      • add(x):向集合中添加元素x。

      • remove(x):从集合中移除元素x。如果元素不存在,则引发KeyError。

      • discard(x):从集合中移除元素x。如果元素不存在,则不引发异常。

      • union(other):返回两个集合的并集。

      • intersection(other):返回两个集合的交集。

      • difference(other):返回两个集合的差集。

      • 列表推导式与生成器表达式

  1. 列表推导式(List Comprehension)

列表推导式是Python中一种简洁而优雅的方式,用于创建新的列表。它结合了循环和条件语句,可以在一行代码中高效地生成、变换或筛选列表。

  • 基本语法:[expression for item in iterable if condition]

      • expression:对每个元素的处理,通常是生成新列表元素的方式。

      • for item in iterable:循环,对可迭代对象的每个元素进行迭代。

      • if condition:可选部分,用于筛选哪些元素应该被加入到新列表中。

  • 示例:

  • 生成一个包含1到10的平方的列表:squares = [i**2 for i in range(1, 11)]。

  • 筛选出长度为大于5的单词并将其转换为大写:words = ["python", "list", "comprehension", "example"]; filtered_uppercased_words = [word.upper() for word in words if len(word) > 5]。

  2. 生成器表达式(Generator Expression)

生成器表达式与列表推导式类似,但它是惰性的,即它只在需要时才生成值。这使得生成器表达式在处理大量数据时更加高效,因为它可以节省内存。

  • 基本语法:(expression for item in iterable if condition)

      • 与列表推导式的语法几乎相同,但使用圆括号()而不是方括号[]。

  • 示例:

  • 生成0到4的平方的生成器:squares = (x*x for x in range(5))。

  • 生成0到9中偶数的平方的生成器:even_squares = (x*x for x in range(10) if x%2 == 0)。

生成器表达式在需要逐个处理数据时非常有用,因为它不会一次性生成整个列表,而是按需生成值。这在处理大数据集时尤其重要,因为它可以显著减少内存使用。

结语

Python提供了丰富的内置数据结构,包括列表、元组、字典和集合,每种数据结构都有其独特的用途和优点。此外,列表推导式和生成器表达式为数据处理提供了强大的工具,使得数据生成、变换和筛选变得更加简洁和高效。掌握这些数据结构及其用法,以及列表推导式和生成器表达式的应用,将帮助你更加高效地编写Python代码。

  2. 面向对象编程

在Python编程中,面向对象编程(OOP)是一种重要的编程范式,它提供了一种组织代码的方式,使得代码更加模块化、可重用和易于维护。

      • 类与对象的概念

类(Class)是面向对象编程中的基本概念,它是创建对象的蓝图或模板。类定义了对象的属性和行为,即对象可以存储什么数据以及可以执行哪些操作。

对象(Object)是类的实例。当你创建一个类后,你可以根据这个类创建多个对象。每个对象都有自己独立的属性(数据)和方法(行为),但它们都遵循类的定义。

在Python中,定义一个类使用class关键字。例如:

 class Dog:
    def __init__(self, name, age):
        self.name = name  # 属性
        self.age = age    # 属性

    def bark(self):
        print(f"{self.name} is barking!")  # 方法

在这个例子中,Dog是一个类,它有两个属性:name和age,以及一个方法:bark。创建Dog类的对象时,你需要提供name和age的值。

my_dog = Dog("Buddy", 3)
my_dog.bark()  # 输出: Buddy is barking!

      • 继承、封装与多态

二、继承、封装与多态继承(Inheritance)是面向对象编程中的一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。这有助于代码的重用和扩展。

 class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass  # 抽象方法,子类需要实现

class Dog(Animal):
    def speak(self):
        print(f"{self.name} says woof!")

my_dog = Dog("Rex")
my_dog.speak()  # 输出: Rex says woof!

在这个例子中,Dog类继承了Animal类,并重写了speak方法。

封装(Encapsulation)是将数据和操作数据的方法绑定在一起,并对外部隐藏对象的内部实现细节。这有助于保护数据不被外部直接访问和修改,从而提高了代码的安全性和可维护性。

在Python中,封装通常通过私有属性(以双下划线开头的属性)和私有方法(以双下划线开头的方法)来实现。虽然Python没有真正的私有属性或方法(它们仍然可以通过一些技巧访问),但这是一种约定俗成的做法,表明这些属性或方法不应该被外部直接访问。

 class Person:
    def __init__(self, name, age):
        self.__name = name  # 私有属性
        self.__age = age    # 私有属性

    def get_age(self):
        return self.__age   # 提供公共方法来访问私有属性

    def set_age(self, age):
        if age > 0:
            self.__age = age  # 提供公共方法来修改私有属性,并添加验证

my_person = Person("Alice", 30)
print(my_person.get_age())  # 输出: 30
my_person.set_age(31)
print(my_person.get_age())  # 输出: 31
# my_person.__age = 40  # 这将引发AttributeError,因为__age是私有属性

多态(Polymorphism)是面向对象编程中的一个重要特性,它允许不同的类以统一的接口相互操作。多态性通常通过继承和接口实现。在Python中,多态性通常通过方法重写和动态类型绑定来实现。

 class Shape:
    def area(self):
        pass  # 抽象方法,子类需要实现

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        import math
        return math.pi * self.radius ** 2

shapes = [Rectangle(3, 4), Circle(5)]
for shape in shapes:
    print(shape.area())  # 输出每个形状的面积,展示了多态性

在这个例子中,Rectangle和Circle类都继承了Shape类,并重写了area方法。这使得我们可以以统一的方式计算不同形状的面积。

      • 构造函数与析构函数

构造函数(Constructor)是在创建对象时自动调用的特殊方法,用于初始化对象的属性。在Python中,构造函数通常是__init__方法。

 class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

my_car = Car("Toyota", "Camry", 2020)

析构函数(Destructor)是在对象被销毁时自动调用的特殊方法,用于执行清理操作,如释放资源。在Python中,析构函数通常是__del__方法。然而,需要注意的是,Python的垃圾回收机制是自动的,并且不保证析构函数会在对象被销毁时立即调用。因此,通常不建议在析构函数中执行重要的清理操作,而是应该使用上下文管理器(with语句)或其他机制来管理资源。

 class FileHandler:
    def __init__(self, filename):
        self.file = open(filename, "r")

    def read(self):
        return self.file.read()

    def __del__(self):
        self.file.close()  # 注意:这不一定会在对象被销毁时立即调用

# 更好的做法是使用with语句来管理文件资源
with open("example.txt", "r") as file:
    content = file.read()

在这个例子中,虽然FileHandler类有一个析构函数来关闭文件,但更好的做法是使用with语句来确保文件在使用后被正确关闭。

结语

面向对象编程是Python中一种强大的编程范式,它提供了组织代码的方式,使得代码更加模块化、可重用和易于维护。通过理解类与对象、继承、封装与多态以及构造函数与析构函数等基本概念,你可以更好地利用Python的OOP特性来编写高效、可维护的代码。

  3. 文件操作与异常处理

在Python编程中,文件操作与异常处理是两个至关重要的方面。文件操作允许我们读取、写入和管理存储在磁盘上的数据,而异常处理则确保程序在遇到错误时能够优雅地应对,避免崩溃并提供有用的错误信息。本文将详细介绍Python中的文件打开、读写与关闭操作,异常捕获与处理机制,以及自定义异常类的创建。

      • 文件的打开、读写与关闭

在Python中,文件操作主要通过内置的open函数来实现。open函数的基本语法如下:

 f = open(name, mode, encoding='utf-8')

  • name:要打开或创建的文件名(包括路径)。

  • mode:文件打开模式,如只读('r')、写入('w')、追加('a')等。

  • encoding:指定文件的编码格式,默认为'utf-8',用于解决中文乱码问题。

1. 打开文件

使用open函数可以打开一个已存在的文件,或者创建一个新文件。例如:

 # 打开一个已存在的文本文件
file = open('example.txt', 'r', encoding='utf-8')

2. 读写文件

  • 读取文件:读取文件内容可以使用read()、readline()和readlines()方法。

 # 读取整个文件内容
  content = file.read()
  print(content)

  # 逐行读取文件内容
  file.seek(0)  # 将文件指针重置到文件开头
  while True:
      line = file.readline()
      if not line:
          break
      print(line.strip())

  # 读取所有行并存储为列表
  file.seek(0)  # 将文件指针重置到文件开头
  lines = file.readlines()
  for line in lines:
      print(line.strip())

  • 写入文件:

写入文件内容使用write()方法。如果文件以二进制模式打开,则需要写入字节串。

# 以写模式打开文件(会覆盖原有内容)
  file = open('example.txt', 'w', encoding='utf-8')
  file.write('Hello, World!\n')
  file.write('This is another line.\n')

3. 关闭文件

使用完文件后,应使用close()方法关闭文件,以释放系统资源。

 file.close()

为了更好地管理文件资源,Python提供了with语句。使用with语句可以确保文件在使用完毕后自动关闭,即使在发生异常时也是如此。

 with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)

      • 异常捕获与处理

在Python中,异常处理主要通过try-except块来实现。将可能引发异常的代码放在try块中,并在except块中定义异常发生时的处理逻辑。

 try:
    # 可能引发异常的代码
    result = 10 / 0  # 这将引发ZeroDivisionError异常
except ZeroDivisionError:
    print("发生了除以零的错误")

 捕获多个异常

可以使用多个except子句来捕获不同类型的异常,或者使用元组来同时捕获多个异常类型。

 try:
    # 可能引发异常的代码
    x = int('abc')  # 这将引发ValueError异常
except (ValueError, ZeroDivisionError) as e:
    print(f"捕获到异常: {e}")

获取详细异常信息

在异常处理块内,可以使用sys.exc_info()函数获取正在处理的异常的详细信息,包括异常类型、异常值和追踪回溯对象。

 import sys
import traceback

try:
    # 可能引发异常的代码
    1 / 0
except ZeroDivisionError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print("异常类型:", exc_type)
    print("异常值:", exc_value)
    print("追踪回溯:")
    traceback.print_tb(exc_traceback)

else和finally子句

  • else子句:在没有发生异常时执行特定代码。

  • finally子句:无论是否发生异常,都会执行其中的代码块,通常用于资源释放和清理工作。

 try:
    # 可能引发异常的代码
    result = 10 / 2
except ZeroDivisionError:
    print("发生了除以零的错误")
else:
    print("结果是", result)
finally:
    print("执行完毕, 无论是否发生异常")

      • 自定义异常类

当标准异常无法准确描述特定业务逻辑错误时,可以创建自定义异常类。自定义异常类需要继承自Exception类或其子类,并可以添加额外的属性和方法。

 class CustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

try:
    # 引发自定义异常
    raise CustomError("自定义异常信息")
except CustomError as e:
    print(e.message)

通过自定义异常类,可以使错误处理更直观,提高代码的可读性和可维护性。

总结

本文详细介绍了Python中的文件操作与异常处理机制。文件操作包括打开、读写和关闭文件,而异常处理则涉及异常捕获、处理以及自定义异常类的创建。掌握这些技能将有助于编写更健壮、可维护和易于调试的Python代码。

相关文章:

  • Tomcat常见漏洞攻略
  • Linux 启动Jar脚本设置开机自启【超级详细】
  • 蓝桥刷题note9(分发饼干,最长回文子串)
  • Windows server 2022域控制服务器的配置
  • 【Java基础-50.1】Java线程阻塞详解:类型、实现与案例分析
  • 1.1编译器概述笔记(努力持续记笔记)
  • 【江西棒垒球】如何参加奥运会·棒球5号位
  • Win98模拟器(安卓):重温经典,一键怀旧
  • 基于Spring Boot的供应商管理系统的设计与实现(LW+源码+讲解)
  • visual studio 使用ssh连接wsl失败原因
  • 神聖的綫性代數速成例題18. 正交變換、歐幾里得空間的同構、實對稱矩陣的正交相似對角化的應用”
  • 计算机网络精讲day2———计算机网络的性能指标(下)
  • 55岁了,可以用AIGC创作吗?
  • Android在kts中简单使用AIDL
  • SQLite Delete 语句详解
  • 第十六届蓝桥杯康复训练--7
  • Python实现deepseek接口的调用
  • 中间件漏洞—Jboss
  • 信号的漏桶实现
  • 神聖的綫性代數速成例題20. 廣義逆矩陣的概念與計算、線性空間上的雙線性函數及其性質、歐幾里得空間中正交投影的應用
  • 我国首个少数民族非遗纺织类国标正式实施
  • “五一”看什么?这里有一份申城视听指南
  • 车展之战:国产狂飙、外资反扑、智驾变辅助
  • AI世界的年轻人,如何作答未来
  • 魔都眼|静安光影派对五一启幕:苏河湾看徐悲鸿艺术画作
  • 三大猪企一季度同比均实现扭亏为盈,营收同比均实现增长