Python 从基础到进阶(一套打通)

文章目录

  • 一、Python 入门
  • 1.1 Python 简介
  • 1.2 安装 Python
  • Windows
  • Linux
  • macOS
  • 1.3 第一个 Python 程序
  • 交互式环境
  • 脚本文件
  • 二、Python 基础语法
  • 2.1 变量和数据类型
  • 变量
  • 数据类型
  • 数字类型
  • 字符串类型(str)
  • 布尔类型(bool)
  • 2.2 运算符
  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符
  • 2.3 控制流语句
  • 条件语句
  • 循环语句
  • `for` 循环
  • `while` 循环
  • 三、Python 数据结构
  • 3.1 列表(List)
  • 列表操作
  • 3.2 元组(Tuple)
  • 3.3 集合(Set)
  • 集合操作
  • 3.4 字典(Dictionary)
  • 字典操作
  • 四、Python 函数
  • 4.1 定义和调用函数
  • 4.2 函数参数
  • 位置参数
  • 关键字参数
  • 默认参数
  • 可变参数
  • 4.3 匿名函数(Lambda 函数)
  • 4.4 函数的嵌套和闭包
  • 函数的嵌套
  • 闭包
  • 五、Python 面向对象编程
  • 5.1 类和对象
  • 5.1 类和对象
  • 解释
  • 5.2 继承
  • 解释
  • 5.3 多态
  • 解释
  • 5.4 封装
  • 解释
  • 六、Python 模块和包
  • 6.1 模块
  • 自定义模块
  • 导入模块的方式
  • 6.2 包
  • 创建包
  • 使用包
  • `__init__.py` 文件的作用
  • 七、Python 进阶主题
  • 7.1 文件操作
  • 打开和关闭文件
  • 使用 `with` 语句
  • 文件读取方法
  • 7.2 异常处理
  • 异常类型
  • 自定义异常
  • 7.3 装饰器
  • 简单装饰器
  • 带参数的装饰器
  • 类装饰器
  • 7.4 生成器
  • 生成器函数
  • 生成器表达式
  • 7.5 并发编程
  • 多线程
  • 多进程
  • 异步编程
  • 7.6 正则表达式
  • 7.7 数据库操作
  • 基础部分补充
  • 数据结构部分补充
  • 函数部分补充
  • 面向对象编程部分补充
  • 模块和包部分补充
  • 进阶部分补充
  • 一、Python 入门

    1.1 Python 简介

    Python 由 Guido van Rossum 于 20 世纪 80 年代末发明,它具有以下显著特点:

  • 语法简洁:代码可读性高,减少了开发者编写和理解代码的时间。例如,打印 “Hello, World!” 在 Python 中只需一行 print("Hello, World!"),而在一些其他语言中可能需要更多的代码结构。
  • 功能强大:拥有丰富的标准库和第三方库,可用于各种领域,如 Web 开发、数据科学、人工智能等。
  • 跨平台性:可以在 Windows、Linux、macOS 等多种操作系统上运行。
  • 1.2 安装 Python

    Windows
    1. 访问 Python 官方网站(https://www.python.org/downloads/),根据自己的系统选择合适的 Python 3 版本(通常选择最新的稳定版本)进行下载。
    2. 运行下载的安装包,在安装过程中,务必勾选 “Add Python to PATH” 选项,这样可以在命令行中直接使用 Python 命令。
    3. 按照安装向导的提示完成安装。安装完成后,打开命令提示符(CMD),输入 python --version,如果显示 Python 的版本号,则说明安装成功。
    Linux

    不同的 Linux 发行版安装 Python 的方式略有不同:

  • Ubuntu/Debian:打开终端,输入 sudo apt-get update 更新软件源,然后输入 sudo apt-get install python3 安装 Python 3。
  • CentOS/RHEL:使用 sudo yum install python3 进行安装。
  • 安装完成后,同样可以通过 python3 --version 验证安装是否成功。

    macOS

    macOS 系统自带 Python 2.x,但建议安装 Python 3.x。可以通过以下两种方式安装:

  • Homebrew:如果已经安装了 Homebrew,在终端中输入 brew install python3 即可完成安装。
  • 官方安装包:从 Python 官方网站下载适合 macOS 的 Python 3 安装包,按照提示进行安装。
  • 1.3 第一个 Python 程序

    交互式环境

    打开命令行工具,输入 python 进入 Python 交互式环境。在交互式环境中,你可以逐行输入 Python 代码并立即看到执行结果。例如:

    print("Hello, World!")
    

    按下回车键后,屏幕将显示 Hello, World!。要退出交互式环境,输入 exit() 或按下 Ctrl + Z(Windows)/ Ctrl + D(Linux/macOS)。

    脚本文件

    使用文本编辑器(如 VS Code、Sublime Text 等)创建一个新文件,将其命名为 hello.py,并在文件中写入以下代码:

    print("Hello, World!")
    

    保存文件后,打开命令行工具,切换到保存 hello.py 文件的目录,输入 python hello.py 并回车,屏幕将显示 Hello, World!

    二、Python 基础语法

    2.1 变量和数据类型

    变量

    变量是存储数据的容器,在 Python 中,变量使用前不需要声明类型,直接赋值即可。例如:

    # 定义一个整数变量
    age = 25
    # 定义一个字符串变量
    name = "John"
    

    变量命名需要遵循以下规则:

  • 变量名只能包含字母、数字和下划线。
  • 变量名不能以数字开头。
  • 变量名区分大小写。
  • 不能使用 Python 的关键字(如 ifelsefor 等)作为变量名。
  • 数据类型
    数字类型
  • 整数(int):表示整数,没有小数部分。例如:num1 = 10
  • 浮点数(float):表示带有小数部分的数字。例如:num2 = 3.14
  • 复数(complex):由实部和虚部组成,虚部以 jJ 结尾。例如:num3 = 2 + 3j
  • 数字类型支持各种算术运算,如加法(+)、减法(-)、乘法(*)、除法(/)、整除(//)、取余(%)和幂运算(**)。例如:

    a = 10
    b = 3
    print(a + b)  # 输出 13
    print(a / b)  # 输出 3.3333333333333335
    print(a // b)  # 输出 3
    print(a % b)  # 输出 1
    print(a ** b)  # 输出 1000
    
    字符串类型(str)

    字符串是用单引号(')、双引号(")或三引号('''""")括起来的文本。例如:

    str1 = 'Hello'
    str2 = "World"
    str3 = '''This is a multi-line
    string.'''
    

    字符串支持拼接(+)、重复(*)等操作,还可以通过索引和切片来访问字符串中的字符。例如:

    str4 = str1 + " " + str2
    print(str4)  # 输出 "Hello World"
    print(str1 * 3)  # 输出 "HelloHelloHello"
    print(str4[0])  # 输出 "H"
    print(str4[0:5])  # 输出 "Hello"
    
    布尔类型(bool)

    布尔类型只有两个值:TrueFalse,通常用于条件判断。例如:

    is_student = True
    is_teacher = False
    

    2.2 运算符

    算术运算符

    除了前面提到的基本算术运算符,还有一些复合赋值运算符,如 +=-=*=/= 等。例如:

    x = 5
    x += 3  # 相当于 x = x + 3
    print(x)  # 输出 8
    
    比较运算符

    比较运算符用于比较两个值的大小关系,返回布尔值。常见的比较运算符有 ==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。例如:

    a = 10
    b = 5
    print(a > b)  # 输出 True
    print(a == b)  # 输出 False
    
    逻辑运算符

    逻辑运算符用于组合多个布尔表达式,常见的逻辑运算符有 and(逻辑与)、or(逻辑或)、not(逻辑非)。例如:

    x = 5
    y = 10
    print(x > 3 and y < 20)  # 输出 True
    print(x < 3 or y > 20)  # 输出 False
    print(not (x > 3))  # 输出 False
    
    位运算符

    位运算符用于对整数的二进制表示进行操作,常见的位运算符有 &(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)。例如:

    a = 5  # 二进制表示为 0101
    b = 3  # 二进制表示为 0011
    print(a & b)  # 按位与,输出 1(二进制 0001)
    print(a | b)  # 按位或,输出 7(二进制 0111)
    

    2.3 控制流语句

    条件语句

    条件语句用于根据条件的真假来执行不同的代码块,Python 中的条件语句使用 if-elif-else 结构。例如:

    age = 18
    if age < 18:
        print("未成年人")
    elif age == 18:
        print("刚成年")
    else:
        print("成年人")
    

    条件语句可以嵌套使用,以实现更复杂的逻辑。

    循环语句
    for 循环

    for 循环用于遍历序列(如列表、元组、字符串等)中的元素。例如:

    fruits = ["apple", "banana", "cherry"]
    for fruit in fruits:
        print(fruit)
    

    还可以使用 range() 函数生成一个整数序列进行遍历。例如:

    for i in range(5):
        print(i)
    
    while 循环

    while 循环在条件为真时重复执行代码块,直到条件变为假。例如:

    i = 0
    while i < 5:
        print(i)
        i += 1
    

    在循环中,可以使用 break 语句提前终止循环,使用 continue 语句跳过当前循环的剩余部分,直接进入下一次循环。例如:

    for i in range(10):
        if i == 5:
            break
        print(i)
    
    for i in range(10):
        if i % 2 == 0:
            continue
        print(i)
    

    三、Python 数据结构

    3.1 列表(List)

    列表是一种可变的有序序列,用方括号 [] 表示。列表中的元素可以是不同的数据类型。例如:

    numbers = [1, 2, 3, 4, 5]
    mixed_list = [1, "hello", True]
    
    列表操作
  • 访问元素:通过索引访问列表中的元素,索引从 0 开始。例如:print(numbers[0]) 输出 1。
  • 修改元素:可以直接通过索引修改列表中的元素。例如:numbers[2] = 10
  • 添加元素:使用 append() 方法在列表末尾添加一个元素,使用 extend() 方法将一个列表的元素添加到另一个列表的末尾,使用 insert() 方法在指定位置插入一个元素。例如:
  • numbers.append(6)
    numbers.extend([7, 8])
    numbers.insert(2, 9)
    
  • 删除元素:使用 remove() 方法删除指定值的第一个元素,使用 pop() 方法删除指定索引的元素(默认删除最后一个元素),使用 del 语句删除指定索引的元素。例如:
  • numbers.remove(9)
    numbers.pop(2)
    del numbers[0]
    
  • 切片:使用切片可以获取列表的一部分。例如:print(numbers[1:3]) 输出列表中索引为 1 到 2 的元素。
  • 3.2 元组(Tuple)

    元组是一种不可变的有序序列,用圆括号 () 表示。元组一旦创建,其元素不能被修改。例如:

    point = (3, 4)
    

    元组的访问方式与列表类似,通过索引来访问元素。例如:print(point[0]) 输出 3。

    3.3 集合(Set)

    集合是一种无序且唯一的数据结构,用花括号 {}set() 函数创建。集合中的元素不能重复。例如:

    fruits = {"apple", "banana", "cherry"}
    empty_set = set()
    
    集合操作
  • 添加元素:使用 add() 方法添加一个元素,使用 update() 方法添加多个元素。例如:
  • fruits.add("orange")
    fruits.update({"grape", "kiwi"})
    
  • 删除元素:使用 remove() 方法删除指定元素,如果元素不存在会抛出异常;使用 discard() 方法删除指定元素,如果元素不存在不会抛出异常。例如:
  • fruits.remove("apple")
    fruits.discard("banana")
    
  • 集合运算:支持并集(union()|)、交集(intersection()&)、差集(difference()-)等运算。例如:
  • set1 = {1, 2, 3}
    set2 = {3, 4, 5}
    print(set1.union(set2))  # 输出 {1, 2, 3, 4, 5}
    print(set1.intersection(set2))  # 输出 {3}
    print(set1.difference(set2))  # 输出 {1, 2}
    

    3.4 字典(Dictionary)

    字典是一种无序的键值对集合,用花括号 {} 表示,键和值之间用冒号 : 分隔。字典中的键必须是唯一的,且通常是不可变类型(如字符串、数字、元组)。例如:

    person = {"name": "John", "age": 25, "city": "New York"}
    
    字典操作
  • 访问元素:通过键来访问字典中的值。例如:print(person["name"]) 输出 “John”。
  • 修改元素:可以直接通过键来修改字典中的值。例如:person["age"] = 26
  • 添加元素:直接使用新的键值对进行赋值即可添加元素。例如:person["job"] = "Engineer"
  • 删除元素:使用 del 语句删除指定键的元素,使用 pop() 方法删除指定键的元素并返回其值。例如:
  • del person["city"]
    job = person.pop("job")
    
  • 遍历字典:可以使用 keys() 方法遍历键,使用 values() 方法遍历值,使用 items() 方法遍历键值对。例如:
  • for key in person.keys():
        print(key)
    
    for value in person.values():
        print(value)
    
    for key, value in person.items():
        print(key, value)
    

    四、Python 函数

    4.1 定义和调用函数

    函数是一段具有特定功能的代码块,可以重复使用。在 Python 中,使用 def 关键字定义函数。例如:

    def greet(name):
        print(f"Hello, {name}!")
    
    # 调用函数
    greet("Alice")
    

    函数可以有返回值,使用 return 语句返回值。例如:

    def add(a, b):
        return a + b
    
    result = add(3, 5)
    print(result)  # 输出 8
    

    4.2 函数参数

    位置参数

    位置参数是最常见的参数类型,按照参数的顺序传递。例如:

    def power(x, n):
        return x ** n
    
    result = power(2, 3)  # 2 的 3 次方
    
    关键字参数

    关键字参数通过参数名传递,不需要按照参数的顺序。例如:

    result = power(n=3, x=2)
    
    默认参数

    在定义函数时,可以为参数提供默认值。如果调用函数时没有传递该参数,则使用默认值。例如:

    def power(x, n=2):
        return x ** n
    
    print(power(3))  # 使用默认参数,输出 9
    print(power(3, 3))  # 传递自定义参数,输出 27
    
    可变参数
  • \*args:用于接收任意数量的位置参数,将这些参数封装成一个元组。例如:
  • def sum_numbers(*args):
        total = 0
        for num in args:
            total += num
        return total
    
    result = sum_numbers(1, 2, 3, 4)
    print(result)  # 输出 10
    
  • \**kwargs:用于接收任意数量的关键字参数,将这些参数封装成一个字典。例如:
  • def print_info(**kwargs):
        for key, value in kwargs.items():
            print(f"{key}: {value}")
    
    print_info(name="John", age=25, city="New York")
    

    4.3 匿名函数(Lambda 函数)

    匿名函数是一种简单的函数,没有函数名,使用 lambda 关键字定义。通常用于简单的、一次性的操作。例如:

    square = lambda x: x ** 2
    print(square(5))  # 输出 25
    

    4.4 函数的嵌套和闭包

    函数的嵌套

    在 Python 中,函数可以嵌套定义,即在一个函数内部定义另一个函数。例如:

    def outer_function():
        def inner_function():
            print("This is an inner function.")
        inner_function()
    
    outer_function()
    
    闭包

    闭包是指有权访问另一个函数作用域中变量的函数。例如:

    def outer_function(x):
        def inner_function(y):
            return x + y
        return inner_function
    
    closure = outer_function(10)
    result = closure(5)
    print(result)  # 输出 15
    

    五、Python 面向对象编程

    5.1 类和对象

    类是对象的抽象模板,对象是类的具体实例。在 Python 中,使用 class 关键字定义类。例如:

    class Person:
    

    5.1 类和对象

    class Person:
        # 类属性,所有实例共享
        species = "Homo sapiens"
    
        # 构造方法,在创建对象时自动调用
        def __init__(self, name, age):
            # 实例属性,每个实例有自己独立的副本
            self.name = name
            self.age = age
    
        # 实例方法,通过实例调用
        def greet(self):
            print(f"Hello, my name is {self.name} and I'm {self.age} years old.")
    
        # 类方法,通过类名或实例调用,第一个参数为 cls 表示类本身
        @classmethod
        def get_species(cls):
            return cls.species
    
        # 静态方法,通过类名或实例调用,没有默认的第一个参数
        @staticmethod
        def is_adult(age):
            return age >= 18
    
    
    # 创建对象
    p1 = Person("John", 25)
    p2 = Person("Alice", 20)
    
    # 调用实例方法
    p1.greet()
    
    # 调用类方法
    print(Person.get_species())
    
    # 调用静态方法
    print(Person.is_adult(p2.age))
    
    解释
  • 类属性species 是类属性,所有 Person 类的实例都共享这个属性。
  • 实例属性nameage 是实例属性,每个 Person 对象都有自己独立的 nameage 值。
  • 构造方法 __init__:在创建对象时自动调用,用于初始化对象的属性。
  • 实例方法greet 是实例方法,通过对象实例调用,第一个参数 self 指向调用该方法的对象实例。
  • 类方法get_species 是类方法,使用 @classmethod 装饰器,第一个参数 cls 指向类本身,可以通过类名或实例调用。
  • 静态方法is_adult 是静态方法,使用 @staticmethod 装饰器,没有默认的第一个参数,可以通过类名或实例调用。
  • 5.2 继承

    继承是面向对象编程的重要特性之一,它允许一个类(子类)继承另一个类(父类)的属性和方法。

    # 定义父类
    class Animal:
        def __init__(self, name):
            self.name = name
    
        def speak(self):
            print("Animal speaks")
    
    
    # 定义子类,继承自 Animal 类
    class Dog(Animal):
        def speak(self):
            print(f"{self.name} barks")
    
    
    # 定义另一个子类
    class Cat(Animal):
        def speak(self):
            print(f"{self.name} meows")
    
    
    # 创建对象
    dog = Dog("Buddy")
    cat = Cat("Whiskers")
    
    # 调用方法
    dog.speak()
    cat.speak()
    
    解释
  • DogCat 类继承自 Animal 类,它们继承了 Animal 类的 __init__ 方法和 name 属性。
  • DogCat 类重写了 speak 方法,实现了自己独特的行为,这称为方法的重写(覆盖)。
  • 5.3 多态

    多态是指不同的对象可以对相同的消息做出不同的响应。在 Python 中,多态通过继承和方法重写来实现。

    class Animal:
        def speak(self):
            pass
    
    
    class Dog(Animal):
        def speak(self):
            print("Dog barks")
    
    
    class Cat(Animal):
        def speak(self):
            print("Cat meows")
    
    
    def animal_speak(animal):
        animal.speak()
    
    
    # 创建对象
    dog = Dog()
    cat = Cat()
    
    # 调用函数
    animal_speak(dog)
    animal_speak(cat)
    
    解释
  • animal_speak 函数接受一个 Animal 类型的对象作为参数,无论传入的是 Dog 还是 Cat 对象,都可以调用其 speak 方法,实现了多态。
  • 5.4 封装

    封装是指将数据和操作数据的方法绑定在一起,并隐藏对象的内部实现细节。在 Python 中,通过访问控制来实现封装。

    class BankAccount:
        def __init__(self, account_number, balance):
            # 私有属性,以双下划线开头
            self.__account_number = account_number
            self.__balance = balance
    
        # 公有方法,用于获取账户余额
        def get_balance(self):
            return self.__balance
    
        # 公有方法,用于存款
        def deposit(self, amount):
            if amount > 0:
                self.__balance += amount
                print(f"Deposited {amount}. New balance: {self.__balance}")
            else:
                print("Invalid deposit amount.")
    
        # 公有方法,用于取款
        def withdraw(self, amount):
            if amount > 0 and amount <= self.__balance:
                self.__balance -= amount
                print(f"Withdrew {amount}. New balance: {self.__balance}")
            else:
                print("Invalid withdrawal amount.")
    
    
    # 创建对象
    account = BankAccount("123456", 1000)
    
    # 访问公有方法
    print(account.get_balance())
    account.deposit(500)
    account.withdraw(200)
    
    # 尝试直接访问私有属性(会报错)
    # print(account.__balance)
    
    解释
  • __account_number__balance 是私有属性,以双下划线开头,不能直接从类外部访问。
  • get_balancedepositwithdraw 是公有方法,通过这些方法可以安全地访问和修改私有属性。
  • 六、Python 模块和包

    6.1 模块

    模块是一个包含 Python 代码的文件,扩展名为 .py。模块可以包含函数、类、变量等。

    自定义模块

    创建一个名为 math_utils.py 的文件,内容如下:

    # math_utils.py
    def add(a, b):
        return a + b
    
    
    def subtract(a, b):
        return a - b
    
    
    def multiply(a, b):
        return a * b
    
    
    def divide(a, b):
        if b != 0:
            return a / b
        else:
            print("Error: division by zero")
    

    在另一个 Python 文件中使用该模块:

    # main.py
    import math_utils
    
    result = math_utils.add(3, 5)
    print(result)
    
    导入模块的方式
  • import 模块名:导入整个模块,使用时需要通过模块名来访问模块中的函数和变量。
  • from 模块名 import 函数名/类名/变量名:从模块中导入指定的函数、类或变量,使用时不需要通过模块名。
  • from math_utils import add, subtract
    
    result1 = add(3, 5)
    result2 = subtract(8, 3)
    print(result1)
    print(result2)
    
  • from 模块名 import \*:导入模块中的所有内容,使用时不需要通过模块名,但不建议使用,因为可能会导致命名冲突。
  • 6.2 包

    包是一个包含多个模块的目录,目录下必须有一个 __init__.py 文件(Python 3.3 及以后版本不是必需的,但为了兼容性建议保留)。

    创建包

    创建一个名为 my_package 的目录,在该目录下创建 __init__.py 文件和两个模块文件 module1.pymodule2.py

    my_package/
        __init__.py
        module1.py
        module2.py
    

    module1.py 内容如下:

    # module1.py
    def func1():
        print("This is func1 from module1")
    

    module2.py 内容如下:

    # module2.py
    def func2():
        print("This is func2 from module2")
    
    使用包

    在另一个 Python 文件中使用该包:

    # main.py
    from my_package import module1, module2
    
    module1.func1()
    module2.func2()
    
    __init__.py 文件的作用
  • 初始化包:可以在 __init__.py 文件中编写初始化代码,在导入包时自动执行。
  • 控制导入行为:可以使用 __all__ 变量控制 from 包名 import * 导入的内容。例如,在 __init__.py 中添加以下代码:
  • # __init__.py
    from .module1 import func1
    from .module2 import func2
    
    __all__ = ['func1', 'func2']
    

    然后在另一个文件中可以使用 from my_package import * 导入 func1func2

    七、Python 进阶主题

    7.1 文件操作

    打开和关闭文件

    在 Python 中,可以使用 open() 函数打开文件,使用 close() 方法关闭文件。open() 函数的常用模式有:

  • 'r':只读模式(默认)。
  • 'w':写入模式,会覆盖文件原有内容。
  • 'a':追加模式,在文件末尾添加内容。
  • 'b':二进制模式,用于处理二进制文件。
  • # 打开文件
    file = open("test.txt", "w")
    
    # 写入文件
    file.write("Hello, Python!")
    
    # 关闭文件
    file.close()
    
    # 打开文件以读取内容
    file = open("test.txt", "r")
    
    # 读取文件内容
    content = file.read()
    print(content)
    
    # 关闭文件
    file.close()
    
    使用 with 语句

    with 语句可以自动管理文件的打开和关闭,避免手动调用 close() 方法。

    with open("test.txt", "r") as file:
        content = file.read()
        print(content)
    
    文件读取方法
  • read():读取整个文件内容。
  • readline():读取一行内容。
  • readlines():读取所有行,返回一个列表,每个元素是一行内容。
  • with open("test.txt", "r") as file:
        lines = file.readlines()
        for line in lines:
            print(line.strip())  # 去除每行末尾的换行符
    

    7.2 异常处理

    在 Python 中,使用 try-except 语句来捕获和处理异常。

    try:
        num = 10 / 0
    except ZeroDivisionError:
        print("除数不能为零")
    
    try:
        file = open("nonexistent.txt", "r")
    except FileNotFoundError:
        print("文件未找到")
    finally:
        # 无论是否发生异常,finally 块中的代码都会执行
        if 'file' in locals():
            file.close()
    
    异常类型

    Python 有许多内置的异常类型,如 ZeroDivisionErrorFileNotFoundErrorTypeError 等。还可以使用 else 子句,当 try 块中没有发生异常时执行。

    try:
        num = 10 / 2
    except ZeroDivisionError:
        print("除数不能为零")
    else:
        print(f"结果: {num}")
    
    自定义异常

    可以通过继承 Exception 类来创建自定义异常。

    class MyException(Exception):
        def __init__(self, message):
            self.message = message
    
        def __str__(self):
            return self.message
    
    
    try:
        raise MyException("这是一个自定义异常")
    except MyException as e:
        print(e)
    

    7.3 装饰器

    装饰器是一种特殊的函数,它可以接受一个函数作为参数,并返回一个新的函数,用于扩展原函数的功能。

    简单装饰器
    def my_decorator(func):
        def wrapper():
            print("Before function call")
            func()
            print("After function call")
        return wrapper
    
    
    @my_decorator
    def say_hello():
        print("Hello!")
    
    
    say_hello()
    
    带参数的装饰器
    def repeat(n):
        def decorator(func):
            def wrapper(*args, **kwargs):
                for _ in range(n):
                    result = func(*args, **kwargs)
                return result
            return wrapper
        return decorator
    
    
    @repeat(3)
    def greet(name):
        print(f"Hello, {name}!")
    
    
    greet("Alice")
    
    类装饰器
    class MyDecorator:
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print("Before function call")
            result = self.func(*args, **kwargs)
            print("After function call")
            return result
    
    
    @MyDecorator
    def say_goodbye():
        print("Goodbye!")
    
    
    say_goodbye()
    

    7.4 生成器

    生成器是一种特殊的迭代器,它可以在需要时逐个生成值,而不是一次性生成所有值,从而节省内存。

    生成器函数

    使用 yield 关键字定义生成器函数。

    def my_generator():
        yield 1
        yield 2
        yield 3
    
    
    gen = my_generator()
    
    # 迭代生成器
    for num in gen:
        print(num)
    
    生成器表达式

    生成器表达式类似于列表推导式,但使用圆括号。

    gen_expr = (x * 2 for x in range(5))
    
    for num in gen_expr:
        print(num)
    

    7.5 并发编程

    多线程

    Python 中的 threading 模块可以用于实现多线程编程。

    import threading
    
    
    def print_numbers():
        for i in range(5):
            print(i)
    
    
    def print_letters():
        for letter in 'abcde':
            print(letter)
    
    
    # 创建线程
    thread1 = threading.Thread(target=print_numbers)
    thread2 = threading.Thread(target=print_letters)
    
    # 启动线程
    thread1.start()
    thread2.start()
    
    # 等待线程结束
    thread1.join()
    thread2.join()
    
    多进程

    Python 中的 multiprocessing 模块可以用于实现多进程编程。

    import multiprocessing
    
    
    def print_numbers():
        for i in range(5):
            print(i)
    
    
    def print_letters():
        for letter in 'abcde':
            print(letter)
    
    
    if __name__ == '__main__':
        # 创建进程
        process1 = multiprocessing.Process(target=print_numbers)
        process2 = multiprocessing.Process(target=print_letters)
    
        # 启动进程
        process1.start()
        process2.start()
    
        # 等待进程结束
        process1.join()
        process2.join()
    
    异步编程

    Python 中的 asyncio 模块可以用于实现异步编程,适用于 I/O 密集型任务。

    import asyncio
    
    
    async def hello():
        print("Hello")
        await asyncio.sleep(1)
        print("World")
    
    
    async def main():
        await asyncio.gather(hello(), hello())
    
    
    asyncio.run(main())
    

    7.6 正则表达式

    正则表达式是一种用于匹配字符串模式的工具,Python 中的 re 模块提供了正则表达式的支持。

    import re
    
    # 匹配手机号码
    pattern = r'^1[3-9]\d{9}$'
    phone_number = '13800138000'
    if re.match(pattern, phone_number):
        print("是有效的手机号码")
    else:
        print("不是有效的手机号码")
    
    # 查找所有匹配项
    text = "Hello 123 World 456"
    numbers = re.findall(r'\d+', text)
    print(numbers)
    
    # 替换匹配项
    new_text = re.sub(r'\d+', '###', text)
    print(new_text)
    

    7.7 数据库操作

    Python 可以与多种数据库进行交互,以 SQLite 为例:

    import sqlite3
    
    # 连接到数据库
    conn = sqlite3.connect('example.db')
    
    # 创建游标对象
    cursor = conn.cursor()
    
    # 创建表
    cursor.execute('''CREATE TABLE IF NOT EXISTS users
                      (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)''')
    
    # 插入数据
    cursor.execute("INSERT INTO users (name, age) VALUES (?,?)", ('John', 25))
    
    # 提交事务
    conn.commit()
    
    # 查询数据
    cursor.execute("SELECT * FROM users")
    rows = cursor.fetchall()
    for row in rows:
        print(row)
    
    # 关闭连接
    conn.close()
    

    基础部分补充

  • 编码规范:像 PEP 8 编码规范,它详细规定了 Python 代码的格式、命名规则等内容。比如,变量名建议使用小写字母和下划线组合(蛇形命名法),函数名同理;类名则采用大写字母开头的驼峰命名法。遵循编码规范能让代码更具可读性和可维护性。
  • 注释:包括行注释(使用 #)和块注释(使用三引号 '''""")。合理的注释有助于开发者理解代码的逻辑和功能,特别是在团队协作或项目后期维护时非常重要。
  • 数据结构部分补充

  • 堆(Heap):虽然 Python 标准库中的 heapq 模块提供了堆操作的功能,但文档未涉及。堆是一种特殊的树形数据结构,常被用于实现优先队列,在算法设计和优化中应用广泛。
  • 队列(Queue):除了使用列表模拟队列外,Python 标准库中的 queue 模块提供了线程安全的队列实现,包括普通队列(Queue)、优先队列(PriorityQueue)和后进先出队列(LifoQueue),适用于多线程编程场景。
  • 函数部分补充

  • 生成器函数的高级用法:如生成器的 send()throw()close() 方法。send() 方法可以向生成器内部发送一个值,并恢复生成器的执行;throw() 方法用于在生成器内部抛出一个异常;close() 方法用于关闭生成器。
  • 递归函数:递归是函数调用自身的编程技巧,在处理树形结构、分治算法等问题时非常有用,但使用不当可能会导致栈溢出错误,需要注意递归的终止条件和性能优化。
  • 面向对象编程部分补充

  • 抽象基类(ABC):Python 的 abc 模块提供了抽象基类的功能,用于定义接口和规范子类的行为。通过定义抽象方法,要求子类必须实现这些方法,增强了代码的可维护性和可扩展性。
  • 多重继承和 MRO(方法解析顺序):Python 支持多重继承,即一个子类可以继承多个父类的属性和方法。但多重继承可能会导致方法冲突,MRO 规定了 Python 在查找方法时的顺序,确保方法调用的正确性。
  • 模块和包部分补充

  • 包的分发和安装:如使用 setuptoolspoetry 等工具创建 Python 包的分发文件(如 .whl.tar.gz),并将其发布到 PyPI(Python Package Index)上,供其他开发者安装和使用。
  • 虚拟环境:像 venvvirtualenvconda 等工具可以创建独立的 Python 虚拟环境,隔离不同项目的依赖,避免版本冲突。
  • 进阶部分补充

  • 网络编程:包括使用 socket 模块进行底层网络编程,实现 TCP 和 UDP 套接字通信;使用 requests 库进行 HTTP 请求,用于 Web 数据获取和交互;使用 FlaskDjango 等 Web 框架搭建 Web 应用。
  • 数据科学和机器学习:Python 在数据科学和机器学习领域应用广泛,如使用 NumPy 进行数值计算,Pandas 进行数据处理和分析,MatplotlibSeaborn 进行数据可视化,Scikit-learn 进行机器学习模型的训练和评估,TensorFlowPyTorch 进行深度学习开发。
  • 自动化测试:Python 提供了多种测试框架,如 unittestpytestdoctest,用于编写和运行单元测试、集成测试等,确保代码的正确性和稳定性。
  • 作者:浪子西科

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 从基础到进阶(一套打通)

    发表回复