Python入门

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: Python简介关于Python2.x与3.x的使用 摘自 Python核心编程 第三版 Wesley Chun著print 变为 print()默认字符的编...

Python

简介

关于Python2.x与3.x的使用

摘自 Python核心编程 第三版 Wesley Chun著

  • print 变为 print()
  • 默认字符的编码是 Unicode
  • 增加单类 类型
  • 更新异常的语法
  • 更新了整数
  • 迭代无处不在

【基础数据类型】

  • 数值类型
    • 整数 各种进制 0 八 0x 十六 0b 二
    • 浮点数 1.2e2 13.34e-2
    • 复数 3+4j 0.1-0.5j
  • 布尔型
    • 0或0.0 :看成false
    • "" '' :false
    • () [] {} :false
  • 字符串
    • 单引号 双引号: 单行字符串
    • 三引号 多行字符串
  • 空值 None

运算符

  • 算术运算符
    • 加减一样,* 乘,不仅可以用于数字,还可以用于字符串 ,/ 除,和Java不一样,整数相除也会得到浮点数
    • // 取整除,得到商的整数部分 ,% 取余数 ,** 幂运算 可以用来开根
  • 关系运算符
    • 都是和Java一致
  • 逻辑运算符
    • and or not
  • 身份运算符

    • is : a is b 就是比较 id(a) id(b) 相同则是返回1
    • is not 比较id 不相同返回1
  • 位运算符

    • << >> 左右移
    • & |按位与或
    • ^ ~ 按位异或 按位翻转
  • 算术运算符优先级 ** / // % +
    • // 取整数部分除法
    • ** 幂运算
  • 转义字符:
    • \a 响铃
    • \b 退格 backspace
    • \000 空
    • \f 换页
    • \ 续行符(行尾)

【基础语法】

  • 单行注释:# 多行注释:”’ ”’
  • 空行的重要性,代码段之间有空行,Python之禅

【import】

参考博客

  • 关于同级,子级目录是比较方便的,涉及到上级目录的就麻烦点了

【输入输出】

读取命令行参数

参考博客

只有输入参数,没有选项

    import sys
    print("脚本名:", sys.argv[0])
    for i in range(1, len(sys.argv)):
        print("参数", i, sys.argv[i])

python tree.py hi op 顺序是python,第一个参数是文件,之后才是别的参数
结果>> 脚本名 tree.py 参数1 hi 参数2 op

有选项
getopt.getopt(args, options[, long_options])

    import sys, getopt
    opts, args = getopt.getopt(sys.argv[1:], "hi:o:")
    for op, value in opts:
  • sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。
  • "hi:o:": 当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个”:”号。
    • 所以”hi:o:”就表示”h”是一个开关选项(单单的-h);”i:”和”o:”则表示后面应该带一个参数。
  • 调用getopt函数。函数返回两个列表:opts和args。opts为分析出的格式信息。args为不属于格式信息的剩余的命令行参数。
    • opts是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数则为空串”。
    • getopt函数的第三个参数[, long_options]为可选的长选项参数,上面例子中的都为短选项(如-i -o)
  • 长选项格式举例:
    • --version
    • --file=error.txt
  • 让一个脚本同时支持短选项和长选项 getopt.getopt(sys.argv[1:], "hi:o:", ["version", "file="])

【序列】

序列通用操作(包含:字符串,列表,元组)
- ​索引,从左至右:0,1,2...n 从右至左:-1,-2...-n
- 切片(截取序列的部分) temp[:] 返回一个副本
- temp[2:4]就是[2,4)
- temp[1:]1到最后 temp[-3:] [-3,-1]
- temp[:4] [0,4) temp[:-3] [0,-3]
- :lista+listb 直接连接
- :lista*4
- 判断是否存在in not int
- len()
- min() max() sum() 要求元素全是数值


【列表】

  • 元素可包含 字符串,浮点,整型,列表,布尔
  • 操作:
    • 增加 + ,append()/extend()尾部加入元素/列表 insert(index, "") 元素插入到任意位置,其后元素后移
    • 检索 count() in
    • 删除 :del list[2]/ remove("apple") /pop(index) index为空指最后一个
    • 永久性排序:sort() a-z sort(reverse=True) z-a 列表全是字符串才可
    • 临时性排序:sorted() 也可以使用上面的参数 列表全是字符串才可
    • 永久性的逆序列表:reverse()
  • 类似数组的操作,例如声明数组:参考博客
    • 原始的定义就是 lists = [1, 2, 4]
    • 若要定义连续列表 lists = range(0, 100) 得到的是range对象不是列表对象
    • 若要定义大小1000全为0列表 lists = [0 for x in range(0, 1000)]
  • 二维数组的定义:
    • 原始: lists = [[1, 2], [3, 4]]
    • 仿造一维的定义: lists = [[0 for x in range(10)] for y in range(10)] 10*10 初始为0的列表
    • 简便但是不可行的方法: lists = [[0]*10]*10 这是个坑, 只是声明了一维数组,然后多次引用, 虽然看起来是二维, 引用数据就会发现是一维

【元组】

  • 元组和列表类似但是元组是创建不可更改的
    • 和列表相比,相同点:按定义的顺序排序,负索引一致,可以使用分片
    • 不同点:元组使用的是(),不能增加删除元素,没有index方法但是有in,可以在字典中作为键列表不可以,
    • 由于具有写保护,代码安全,操作速度略快列表
  • 操作:
    • 访问: 和列表一样的索引和分片,
    • 连接:+ 连接得到新的元组
    • 删除:del 删除整个元组

【字符串】

  • str() 将对象转化成字符串 (注:Python中不能像Java一样字符串和数值直接+)
  • repr() 注意和str()的区别
  • r"d:\python27\" r前缀表示转义字符看成普通字符
  • 因为Python字符串实现是类似字符数组,temp = "python" temp[0] 结果:p temp.index("p") 结果是:0
  • 操作:
    • index('s') 找到s字符的下标
    • find('s',[start,end]) 找s的下标,只有一个整数参数则是start
    • replace('s','v') 替换
    • count('sd') 计数
    • split('') 正则切分 空参数默认是空格
    • join('') 列表转化成字符串的方法
    • cmp(str1,str2) 比较两个字符串是否相等
    • + 进行拼接 可以拼接字符串 列表
    • a in b 判断a是否在b里存在
    • * 重复序列 例如 print "-"*20 就会输出20个 -
    • b = "www.github.com" c = b.split(".") "#".join(c) 实现了将字符串的 . 换成了#
    • "i am %s %d" % ("python",67)%s %d %f 和C语言一样占位符
      • 新的方式 "i am {0} {1} ..".format(23,"ret")
      • 或者"i am {name} {age} ..".format(age=23,name="ret")
      • 字典方式
    • title() 首字母大写

字符串,列表,元组相互转换:
- 字符串-列表 : list(“python”)
- 字符串-元组:tuple(“python”)
- 列表或元组-字符串 join(obj) 参数是列表或元组类型,其元素只能是字符串类型


字符串编码问题(python 2问题):

    # coding:utf-8
    unicode_str = unicode('使用',encoding='utf-8')
    print unicode_str.encode('utf-8')
    import codecs
    codecs.open('filename',encoding='utf-8')
  • 因为文件不是UTF8:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb9 in position 2: invalid start byte

字典(键值对)

  • 通过用空间来换取时间,与列表相比,键的增加不影响查找插入速度,需要占用大量内存
  • 特性:
    • 值是可以是任意的,甚至是字典嵌套
    • 键必须不可变,只能由 数值,字符串,元组,不能用列表
  • 操作:
    • 定义字典 dict={}
    • 添加 : dict['a'] = 2323
    • 返回所有key:keys()
    • 查询是否有这个键 :has_key()
    • get() keys() values()
    • 转化元组并返回 :items()
    • 删除指定键:del() del dict['name']
    • 删除所有:clear()
    • 删除指定键并返回值 :pop()
    • 合并另一个字典:update()
    • in
  • 嵌套:
    • 字典套列表 {'d':['we','e']}
    • 列表套字典,当成普通类型包含即可
    • 字典套字典

【基本运行结构】

  • 输入输出:
    • input(“”) 默认当成字符串输入 数值:int() 强转一下
    • print(“”)
  • 选择:
    • if elif else
  • for循环:
    • for in while 例如:for i in range(1,10,2): 范围 [1,10) 增量为2
    • pass 语句,当某个子句没有任何操作,,用pass保持程序结构完整性 不影响下一句 不像continue
  • while 循环;
    • while True:`` while ‘2’ in nums:`` while num<2:
    • while 列表: 直到列表为空退出循环
    if (b==0) and (a==1) :
        pass
        print("pass")
    else:
        print("Hi")

【函数】

  • 形参赋值传递方式

    • 按位置 就是直接用看起来和Java一样,但不是按类型和位置,只是位置
    • 按指定名称 调用的时候 create(name='df')
    • 缺省默认值(参数缺省之后,调用可以不传这个参数,否则必须要传) def create(name='df')
    • 列表类型,不想形参改变实参 传递副本过去即可 list[:]
  • 以下两种情况(* 和 **),都必须放在形参列表的最后 (两者同时使用时:* 只能在 ** 前 )

    • 多个实参 create(age, *name) create(12, 's','d')
      • 所以这是名为name的元组 不能指定没有的名称 错误:create(12,d=2, 2,3,4)
    • 多个指定名称实参 create(age, **name) create(12, name='d', lo=23)
      • 必须要指定名称 这是名为name的键值对字典
      • 错误:create(12,d=23,3,3,3)
    • 注意:
      • def hi(name, age=0, *names, **s) hi('d', 23,34, d=6) age会被赋值23
      • def hi(name, *names, age=0, **s) hi('d', 23,34, d=6) 这样写age就不会赋值,除非指定名称 age=23
  • 返回值

    • 返不返回 看需求 没有像Java一样的强制性约束类型
  • 将函数写在一个py文件里,然后导入 import 文件名,名曰导入模块

    • 还可以加别名 import creat as fun 给模块加别名
    • 导入指定的函数 from create import create_aliens, type_button 多个就,分隔 同理 as给函数加别名 * 通配所有
  • 注意:递归深度,Python中递归默认深度是 989, 要么更改实现,要么就 sys.setrecursionlimit(10000000)

变量

  • 局部变量:
  • 全局变量:定义在函数外的变量,也称公用变量,函数中 global x 声明引用全局变量x

【类】

Python 不存在多态,存在鸭子类型 博客介绍
- 写在一个py文件里,默认构造器,可以加参数 def __init__(self):

  • 属性:
    • 实例属性 形如self.name,在任何方法中声明过即可
    • 类属性 不加self前缀,__name私有的类属性, 类不能访问对象属性
    • 类属性可以修改,但是实际上只能修改实例属性(这个修改只是声明了同名的实例属性,引用的时候就会覆盖类属性,看起来就是修改了
      • 可以删除实例属性,然后就能看到原有的类属性了
    class People:
        name = 'md'
    p = People()
    p.name = 'gh' # 声明了实例属性覆盖了类属性
    del p.name # 删除实例属性,恢复类属性引用
  • 方法:

    • 对象方法,类方法,静态方法
    • 对象方法,同样的 __开头是私有的,只能在对象的公有方法中self.__引用
    • 静态方法,之中只能引用类成员,不能访问对象成员
  • 构造函数和析构函数:

    • def __init__(self)
    • def __del__(self)
    class Person:
        # 对象方法, 将对象作为参数self传进去
        def say(self):
            print('hi')
        # 静态方法
        @staticmethod
        def drink():
            print('static method')
        # 类方法,将类作为参数cls传进去
        @classmethod
        def eat(cls):
            print('class method')
  • self 代表了自身引用 类似Java的this
  • 特别不舒服 init 这种命名 不像Java的构造函数重载,这个就是后面覆盖前面定义的init 不管形参列表

    • 因为不存在重载,就是说不能多个构造函数的书写了。。。
  • 导入和函数一样 注意继承中类的依赖

继承

  • Python是支持多重继承的

  • 同文件 父类定义要在子类之前

  • 父类的构造器不会自动调用,需要显式使用父类构造器:

    • 2.×版本: super(子类名, self).__init__(参数)
    • 3.×版本: super().__init__(参数)
    • 或者 父类名.__init__()
  • 重写父类方法:只需要定义一个和父类方法同名的方法即可,因为没有多态,覆盖时形参不作考虑

  • 多态:

    • 方法重载: 子类覆盖父类的方法
    • 运算符重载: 加__add__(self, x)__sub__(self, x)

【异常】

    try:
        print(5/0)
    except ZeroDivisionError:
        print("0 不能做除数")
    else:
        print("成功")
    finally:
        print('finally')
  • 基本语法 try except else finally
    • else是无异常执行
    • 有异常就执行 except, except 超类Exception,也可以多个except (和Java一致)
    • 最终执行finally 和 Java的结构是一致的
except 分句使用形式 说明
except 捕获所有类型
except name 只捕获指定类型
except name, value 捕获指定类型,并获得抛出的异常对象
except (name1, name2) 捕获列出的异常
except (name1, name2), value 捕获列出的异常,获得抛出的异常对象

- raise 语句 和Java的throw关键字 一致 , 不过raise只是抛出一个通用异常类型 Exception
- dir(exceptions) 查看所有异常类型
- raise name 手动引发异常
- raise name,data 传递一个附加的数据
- 同样的也是可以自定义异常类型的,class MyExcetion(Exception):
- with 语句 在异常处理中,将 try except finally 关键字以及与资源分配释放相关的代码省略掉。
- 文件打开 with open('a.py') as files:

常见异常类 描述
NameError/UnboundLocalError 引用不存在的变量/或者引用在声明之前
ZeroDivisionError 除数为0
SyntaxError 语法错误
IndexError 索引错误
KeyError 使用不存在的字典关键字
IOError 输入输出错误
ValueError 搜索列表中不存在的值
AtrributeError 调用不存在的方法
TypeError 未强制转换就混用数据类型
EOPError 文件结束标识错误

【文件】

  • 注意路径,Windows系统中要使用反斜杠 \
  • 最简单:file = open('') 只读打开
  • 使用with来操作 好处是Python自动关闭文件
    with open('filename') as name: 
        name.read()
  • 为写打开新文本文件只读 file = open('a.txt','w+'[,coding='utf-8']) 打开删空
  • file.write('')
  • os模块

    • os.rename('filename1','filename2') mv
    • os.remove('filename.py') rm
    • os.listdir(path) ls
    • os.getcwd() pwd
    • os.makedirs(r'path') mkdir
    • os.chdir('') 改变一个目录
    • os.rmdir('') 删除该目录,前提是空目录
  • os.path模块

    • abspath(”) 获取绝对路径
    • exists(”) 是否存在
    • isdir(”) 是否是一个目录
    • isfile(”) 是否是文件
    • islink(”) 是否是软链接硬链接文件
    • getsize() 获取文件尺寸
  • shutil模块

    • dir() 复制单个文件
    • shultil.copytree(r”,r”) 复制目录树

b 表示字节流(二进制文件) 不加表示字符流(文本文件)

方式 意义 当存在 当不存在
r 只读打开 打开 返回空指针
w 只写打开新 打开删空 新建打开
a 追加打开 打开 新建打开
r+ 读打开可写 打开 返回空指针
w+ 写打开新可读 打开删空 新建打开
a+ 追加打开可读 打开 新建打开
rb 只读打开 打开 返回空指针
wb 只写打开新 打开删空 新建打开
ab 追加打开 打开 新建打开
rb+ 读打开可写 打开 返回空指针
wb+ 写打开新可读 打开删空 新建打开
ab+ 追加打开可读 打开 新建打开

json

    alien = {'color': 'green', 'age': '23'}
    files = 'a.json'
    with open(files, 'w') as o:
        json.dump(alien, o)
    data = json.load(files)
    # 引用
    data['root']['name']
  • json.dump()持久化 和 load() 装载

【测试】

  • 文件名test开头就当做是测试类,不会直接运行
  • 类继承 unittest.TestCase, 所有test_开头的方法都将自动运行
  • 断言 self.assertEqual assertNotEquals assertIn(item, list)
  • 直接运行 unittest.main()
  • 输出结果,. 测试通过 E 测试运行错误 F 测试断言不通过

【GUI】

Tkinter

安装
- python2: sudo apt install python-tk
- python3: sudo apt install python3-tk
引入
- python2:import Tkinter import Tkinter as tk from Tkinter import *
- 但是python3.5的环境下,import tkinter 才是正确的

wxPython

Qt5


【数据库】

【MySQL】

  • python3环境下: sudo apt install python3-mysqldb
  • sudo apt install libmysqlclient-dev
  • sudo pip install mysql-python

【Redis】

安装
  • python2 sudo pip install redis
  • python3 sudo pip3 install redis
使用

【绘图】 matplotlib

python 3.5 安装
sudo apt install python3-matplotlib
sudo apt install python3.5-dev python3.5-tk tk-dev
sudo apt install libfreetype6-dev g++


【代码风格】

  • 一行只写一句
  • 表达式尽量不要省略括号,有助于理解
  • 函数的行数不要超过100行
  • 尽量使用系统函数
  • 尽量使用局部变量,不要使用全局
  • 循环,分支,最好不要超过5层
  • 尽量减少否定的条件语句
  • 对输入的数据进行合法性检查

巨坑: tab和空格不能混用,如果你复制别人的代码是tab,自己敲空格,就会缩进错误!!!!, 天灭tab空格保平安, 要不是kate编辑器显示了tab字符,找半天都不知道错在哪


【常见函数】

  • id() 查看内存地址
  • help(方法名) 展示方法的说明文档
  • dir(对象) 展示对象的方法API

【常见库】

  • import codecs 编码
  • import os
    import time
    import shlex
    import datetime
    import subprocess
    def execute_command(cmdstring, cwd=None, timeout=None, shell=False):
        """执行一个SHELL命令
                封装了subprocess的Popen方法, 支持超时判断,支持读取stdout和stderr
            参数:
            cwd: 运行命令时更改路径,如果被设定,子进程会直接先更改当前路径到cwd
            timeout: 超时时间,秒,支持小数,精度0.1秒
            shell: 是否通过shell运行
        Returns: return_code
        Raises:  Exception: 执行超时"""
        if shell:
            cmdstring_list = cmdstring
        else:
            cmdstring_list = shlex.split(cmdstring)
        if timeout:
            end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
        #没有指定标准输出和错误输出的管道,因此会打印到屏幕上;
        sub = subprocess.Popen(cmdstring_list, cwd=cwd, stdin=subprocess.PIPE,shell=shell,bufsize=4096)
        #subprocess.poll()方法:检查子进程是否结束了,如果结束了,设定并返回码,放在subprocess.returncode变量中 
        while sub.poll() is None:
            time.sleep(0.1)
            if timeout:
                if end_time <= datetime.datetime.now():
                    raise Exception("Timeout:%s"%cmdstring)
        return str(sub.returncode)

QT

  • 在Terminal中输入:sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer
    qt4-dev-tools 中包括了Qt Assistant,Qt Linguist,Qt Creator
    qt4-doc 这个是帮助文档
    qt4-qtconfig Qt的配置工具,这个装好默认好
    qt4-demos 官方的一些Demo
    qt4-designer 可视化窗体设置工具
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
10天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
18天前
|
Python
【python从入门到精通】-- 第五战:函数大总结
【python从入门到精通】-- 第五战:函数大总结
56 0
|
6天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
8天前
|
数据采集 存储 数据库
Python中实现简单爬虫的入门指南
【10月更文挑战第22天】本文将带你进入Python爬虫的世界,从基础概念到实战操作,一步步指导你如何使用Python编写一个简单的网络爬虫。我们将不展示代码示例,而是通过详细的步骤描述和逻辑讲解,帮助你理解爬虫的工作原理和开发过程。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往数据收集新世界的大门。
|
6天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
【10月更文挑战第24天】 在Python的世界里,装饰器是一个既神秘又强大的工具。它们就像是程序的“隐形斗篷”,能在不改变原有代码结构的情况下,增加新的功能。本篇文章将带你走进装饰器的世界,从基础概念出发,通过实际例子,逐步深入到装饰器的高级应用,让你的代码更加优雅和高效。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
8天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
13 3
|
7天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
19 1
|
9天前
|
存储 程序员 开发者
Python编程入门:从零开始掌握基础语法
【10月更文挑战第21天】本文将带你走进Python的世界,通过浅显易懂的语言和实例,让你快速了解并掌握Python的基础语法。无论你是编程新手还是想学习一门新的编程语言,这篇文章都将是你的不二之选。我们将一起探索变量、数据类型、运算符、控制结构、函数等基本概念,并通过实际代码示例加深理解。准备好了吗?让我们开始吧!
|
13天前
|
存储 算法 Python
【10月更文挑战第16天】「Mac上学Python 27」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。
75 3
|
15天前
|
设计模式 开发者 Python
Python编程中的设计模式:从入门到精通####
【10月更文挑战第14天】 本文旨在为Python开发者提供一个关于设计模式的全面指南,通过深入浅出的方式解析常见的设计模式,帮助读者在实际项目中灵活运用这些模式以提升代码质量和可维护性。文章首先概述了设计模式的基本概念和重要性,接着逐一介绍了几种常用的设计模式,并通过具体的Python代码示例展示了它们的实际应用。无论您是Python初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和实用的技巧。 ####