boxmoe_header_banner_img

⋅無⋅限⋅進⋅步⋅

加载中

文章导读

Python基础


avatar
yuhui 2025年10月21日 33

Python基础

Python是一门开源的高级编程语言

优点:

优雅地语法、动态类型具有解释性质。

支持面向过程和面向对象的编程

丰富的第三方库

调用其他语言所写的代码,因此被称为胶水语言

缺点

运行慢,是解释型语言

不需要编译就运行,代码在运行时会逐行翻译成CPU能理解的机器码,翻译过程耗时

同时Python是动态类型语言

动态类型语言:在程序运行过程中自动决定对象的类型,不需要声明变量的类型

代码执行过程:

源码->编译器->pyc文件(字节码)->python虚拟机运行

操作过程:

1、在操作系统安装python和运行环境

2、编写python源码

3、编译器运行python源码,编译生成pyc文件(字节码)

4、python虚拟机将字节码转换为机器语言

5、硬件执行机器语言

1741862661650-4572e929-c9b9-4e1b-8f33-11b1fc00f55d.png

两种运行方式:

交互式:不需要创建脚本文件,通过Python解释器的交互模式编写代码

1741862661653-8cc3a07a-9a7e-48df-add4-3bb44887c8c9.png

脚本式:代码可以在各种Python编译器或者集成开发环境上云霄,例如python自带的IDLE、Atom、Visual Studio、Pycharm和Anaconda

1741862661682-7d8fb22a-6ab7-4815-9c28-97b90abced73.png

编码规范:编写代码应该遵守的命名规则、代码缩进、代码和语句分割方式等

分号:允许在行尾添加分号,但是不建议使用分号隔离语句,建议每条一句单独一行

空行:不同函数或语句块之间可以使用空行来分隔。用以区分两段代码,提高代码可读性

圆括号:用于长语句的续行,一般不适用不必要的括号

空格:不建议在括号内使用空格,对于运算符,可以按照个人习惯决定是否在两侧加空格

标识符命名:标识符用于表示常量、变量、函数以及其他对象的名称

标识符通常由字母、数字、下划线组成、但不能以数字开头

标识符大小写敏感,不允许重名

如果标识符不符合规则、编译器运行代码会输出SyntaxError语法错误

Python基本数据类型有布尔型(True or False )整数型、浮点型、字符串型,所有数据都是以对象的形式存在的

1741862661674-67c8c4f3-977a-407d-9ba2-7404f9dd0aae.png

代码缩进:

代码缩进代表代码块的作用域,如果一个代码块包含两个或更多语句,则这些语句必须具有相同的缩进量,对于Python而言代码缩进是一种语法规则,使用代码缩进和冒号来区分代码之间的层次

编写代码的时,建议使用4个空额来生成缩进。如果程序代码使用了错误的缩进,则会在运行中发出IndentationError错误信息

if…else…是一个代码块 具有相同缩进

print(a)调用参数a,并且和if…else…在一个代码块 需要有相同缩进

1741862661662-95cdb847-1bc4-45ba-94c3-055db6b374ed.png

使用注释:

注释即在程序中添加解释说明,分为单行注释和多行注释

单行注释以#字符直到行尾结束

多行注释内容可以包含多行,这些内容包含在一对三引号内——”’…”’ OR """…"""

1741862671275-2203caa1-a846-4789-b123-d67d178ad206.png

源码文件结构

完整的python源码文件一般包含 解释器 编码格式声明 文档字符串 模块导入和运行代码

如果会在程序中调用标准库或其他第三方的库的类时,需要使用import或 from… import语句导入相关的模块,导入语句始终在文件的顶部。在模块注释或文档字符串(docstring)之后

解释器声明的作用:指定运行本文简单编译器的路径,windows操作系统可以省略下例第一行解释器声明(非默认路径安装编译器或有多个python编译器)

编码格式声明的作用:指定本程序使用的编码类型,以指定的编码类型读取源代码(python2默认使用ASCII编码(不支持中文),python3默认支持UTF-8源码(支持中文)

文档字符串的作用是对本程序功能的总体介绍

time作为python内置模块,作用是提供处理时间相关的函数

1741862671258-88eed83b-be77-4649-a43c-9be3ff92e6cf.png

Python的函数与模块

函数(function)是组织好的、可重复使用的一段代码,能够提高程序的模块化程度和代码利用率,使用def定义

模块是一个保存好的python文件,可以由函数或者类组成,模块和常规python程序之间的唯一区别是用途不同:模块被其他程序调用。用词,模块通常没有main函数

1741862671274-1e54cfb0-9cad-4c6c-b8d2-7bb4865efd20.png

类与方法

类(class)描述一类相同的属性和方法的几何,关键字class

被实例化的类的函数被称作方法method,类定义方法时候必须携带self关键字,表示类的实例本身

1741862671295-3a97e1ad-21e4-4c7f-ab46-5579e6d49ac2.png

Python数据类型

标准库含盖的内置类型

Python 标准库 — Python 3.8.20 文档

数据类型:

数值、字符串、列表、元组、字典和集合

数值:数值数据类型用于存储数值。它们是不可改变的数据类型,改变数值数据类型会分配一个新对象

python中的与或非 布尔操作不使用操作符,而使用关键词and/or/not

1741862671291-c2f36152-8e88-40d7-9398-7c23e89bd916.png

字符串:由数字、字母、下划线组成的一串字符。由单引号、双引号或三引号创建对象

字符串的基本操作:

1741862672146-78531c7c-837f-4260-9999-b92b6cfc2b36.png

字符串的不可变性:

1741862672142-fd9c89bf-948d-48fe-b04b-cf268609d2c8.png

字符串的常用操作:

1741862672252-6fd00e59-0dc0-444d-b224-d2fd5ba28611.png

列表:可以完成大多数集合类的数据结构实现,支持字符、数字、字符串甚至可以包含列表(即嵌套)用[]标识

常用操作:

1741862672203-b7bd6716-f81b-4817-bb57-5a9cb29c33cc.png

遍历并获取元素和对应索引

1741862672150-63fdb448-cee4-4fbf-b737-3a967f89c909.png

输出结果:

1741862673270-a16fb6dc-d518-4766-b0c4-07961b089244.png

列表推导式:

1741862673273-aa994edd-b15c-4f58-ab91-18c0231b4ef5.png

排序:

list.sort(cmp=None,key=None,reverse=False):cmp为可选参数如果指定了该参数,会使用该参数的方法进行排序。key是用来进行比较的元素。reverse为排序规则,False为升序

1741862673282-b496b640-ddbc-4f45-aaa3-e8378ba83e87.png

元组:

元组用()标识,内部原色用逗号隔开。元组不能二次赋值,相当于只读的列表。

常用操作:

1741862673281-1cbd6afc-b31d-4472-a033-17f48e9594d0.png

字典:

字典dictionary是灵活的内置数据结构类型,字典用{}标识

字典由索引(key)和它对应的值value组成。和列表对比,字典当中的元素是通过键来存取的,而不是通过偏移存取

常用操作:

1741862673286-321e9122-be9f-43b3-9d4d-78b97ea24350.png

1741862674552-83b6da04-6cd3-4998-bdc1-3a32fc0937ed.png

集合:

集合是一个无序的不重复元素序列,集合可以使用大括号{}或者set()函数创建

常用操作:

1741862674567-3d56b0d6-86fa-4c88-9f42-b97adcb0cbe2.png

深拷贝与浅拷贝

对象赋值实际上是对象的引用,当创建一个对象把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用

本例使用copy模块来理解深拷贝和浅拷贝的区别

1741862674519-f762dbdc-f12f-4ec4-ad84-11217ffe67d2.png

1741862674519-2ee718b4-f289-4ae3-a017-68e934509b2e.png

输出结果:

1741862674510-6319b6d8-73b3-4e7f-9103-afd79a8aac2c.png

if语句:匹配条件后执行后续指令

本例作用是接收一个用户输入的分数,然后判断用户所输入的分数属于什么级别

1741862676005-adb7c910-c3b8-4541-b87e-b148124c6775.png

for循环:可以遍历任何序列的项目,如一个列表或一个字符串

本例打印九九乘法表

1741862675952-3808ba08-f5f0-4853-b1dc-02e4f9af0bc4.png

输出结果

1741862675954-8d1a1098-1dce-465a-8efc-6498077f8f28.png

while循环:在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。

当满足条件时循环执行语句块,想要结束时,使用break或continue结束循环

1741862675943-e33da8a0-e84e-4041-88af-f59e204495cf.png

输出结果

1741862675949-82e366e8-f98c-4c94-8e19-b4c4e35da12e.png

自定义函数:除了python提供的内建函数,还可以自己创建函数,也就是自定义函数

定义函数:使用def关键字自定义一个函数,能够调用函数功能(打印信息)

1741862677732-24067a6a-a121-4971-9334-81253fd05805.png

输出结果

1741862677741-3f06313e-a3f8-45ad-8c79-a14374eb0765.png

函数的参数传递与默认参数:

自定义函数,要求打印不同方式传入的参数、

1741862677743-b7a67b94-808a-4e52-b3b2-6c21ad342b35.png

输出结果

1741862677750-30ce9a11-61d4-4486-8dd4-115dcb98a869.png

不定长参数

不定长参数为希望函数处理的参数个数比在定义的时候多。此时使用*表示元组类型参数,**表示字典类型的参数

1741862677754-eff9a715-1899-4689-b18b-09df787036f8.png

输出结果

1741862679326-6ae867b9-39b1-4e8d-945b-410a07e2b969.png

返回值:函数在完成方法后给调用者的结果,使用return语句完成

1741862679322-356c989c-fa7f-42a9-a311-b9ca03c3ca45.png

输出结果

1741862679329-a99de048-a425-4641-800a-0e12b8dcd643.png

IO操作:Python其中一个内置模块,操作为 对文件的读写,通常可以使用open函数完成操作。

1741862679438-43a7423b-a294-4624-a29c-0fdd2142183f.png

文件写入:

1741862679343-78b3e624-86e7-4338-87f2-2c52ed407d11.png

输出结果:

1741862680978-5d18b917-56a3-4969-a7b6-e2cc3c858acc.png

1741862681008-bdda665e-b544-42de-af3f-602adec07586.png

1741862680987-110c9c68-83aa-4bb9-8306-67c8f125730e.png

文件读取:使用read方法,read()如果不指定大小表示全部读取

1741862681003-b714a59b-50ac-4b78-9302-1f66eb493edc.png

输出结果

1741862680977-42b5e985-f2e4-4f66-bf17-5ca46c1b654b.png

上下文管理器操作文件:上下文管理器规定了资源的使用范围,代码开始时候分配资源,结束时释放资源,能够很好的精简代码和提高代码可读性,上下文管理器和with语句一起工作,基本语法为:

with 上下文表达式 [as 资源对象] : #as表示将上下文的返回值赋值给资源对象

对象的操作

1741862682817-d73933cc-bf2a-45ee-b617-db647116bf30.png

输出结果

1741862682877-bace3538-6c34-462d-b7b6-7609837f6d2b.png

异常处理:程序在执行过程中产生的错误称为异常。常见有

语法错误SynataxError

未声明变量NameError

访问未知属性AttributeError等

python有强大的异常处理机制,它可以准确的反馈错误信息。

python使用try-except语句处理异常,其中try语句用于检查异常,except用于捕获异常

制造异常:

1741862682836-6f716fb3-08e2-426c-ba65-c30877ef0fe9.png

输出结果

1741862682841-18df6193-5c43-4da6-ae5f-18b045d3d2a2.png

可以捕获ZeroDivisionError这个异常,保持程序正常运行

使用try-excpet生成代码

捕获ZeroDivisionError这个异常,输出’第二个数不能为0′

1741862682841-ea712cde-647b-4068-9b5a-5370fa64d478.png

输出结果

1741862684506-8e0a4fd4-260d-47cf-82d7-1e1681e9a079.png

如果需要捕获多个异常,可以在并列有多个except语句捕获不同异常

捕获所有异常:exception类是所有异常的父类,可用来表示所有异常

1741862684516-79fd6078-c552-4b7a-b78a-990f79f4ffa7.png

输出结果

1741862684515-1353fa48-013f-45f5-8a84-e3377236d0d2.png

没有捕获到异常(else和finally):程序中如果没有捕获到异常,程序会执行else语句,还有情况是无论是否捕获到异常,都要执行一些终止行为,这时可以使用finally语句

Python中完整的异常处理格式为:

1741862684504-1ca5d906-98b6-4056-8538-b095c5918422.png

面向对象编程(类):类和对象是面向对象编程的重要概念

对象是具体事物,类是对一群具有相同特征和行为的事物的统称,中文里我们可以理解为“分类”。

例如第一个案例中,狗是一个类,而哈士奇是其中一个对象,哈士奇具备狗这个类的所有特征和行为。

创建和使用类:

1741862684511-69d0f1a9-e174-42d5-a226-64670a93c0fc.png

1741862686293-d2fe6783-2feb-496f-9f4a-dd2a16500f70.png

输出结果

1741862686285-b50800e5-2b57-44d0-ae9c-92cf104350b8.png

类的属性:

上述案例如要再建一个Dog类的对象,需要再次使用“对象名.属性名”的形式添加,比较麻烦,为了解决这个问题,python提供了一个构造方法init(前后两个下划线)实现类的初始化实现

将name和age两个属性初始化到Dog类中

1741862686330-ce4fbde7-d5d5-4c6e-8e26-b6e4cfb481ee.png

输出结果

1741862686260-56857681-706d-43d5-84a6-94e22c9575c1.png

类的封装:把隐藏属性、方法与方法实现的细节的过程称为封装。通过将属性定义为私有属性,避免外界随意赋值

私有属性通过两个下划线前缀实现

1741862686287-da908f92-0e60-44e0-abb9-ef8d3f4b366f.png

输出结果

1741862688206-afead5ce-94f4-4231-b2fd-0297c68eab48.png

类的继承:

面向对象的编程好处之一是代码的重用,实现这种重用的方法之一是通过继承机制,基础完全可以理解成类之间的类型和子类型关系。

以下构建了一个Dog子类Husky,继承父类的属性和方法,使用方法为class子类(父类)

如果一个子类需要多基础,方法为class子类(父类1,父类2),本案例为单继承

1741862688226-656b9484-a303-4c80-85df-1873dc838ec2.png

输出结果

1741862688231-a39e775a-168d-4da3-b82b-f1c4606b3fd9.png

类多态:多态指不考虑对象类型的情况下使用对象,意为 python不关心对象是父类还是子类,只关心对象的行为(方法)

下例中父类Dog,有shout方法。Dog的子类哈士奇和藏獒,重写了父类的shout方法,定义一个函数sound,调用shout方法可以不用关心对象是父类还是子类,只要他们都有这个shout方法

1741862688260-5e8919e3-a772-480a-ab56-6ccd6638a73a.png

输出结果

1741862688213-26d0ace0-572c-4645-8f2b-618e4c8a691a.png

正则表达式:特殊的字符序列,帮助方便的检查每一个字符串是否与某种模式匹配,在python使用re模块实现正则表达式功能

语法:

1741862689978-75375462-a2b6-4d81-bfbc-470f291af713.png

1741862689966-a53f7cf2-da53-47cb-9c57-365c8025716e.png

Flag标志

1741862689993-ca46ac3f-a08c-459c-a921-9b0028406b20.png

re.match:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

函数语法:

re.match(pattern,string,flags=0)

其中pattern表示匹配的正则表达式,string表示要匹配的对象,flags为标志位

示例

1741862689975-1ad66451-4455-441e-b43d-6e9154c84997.png

输出结果

1741862689971-79bcd521-5abe-4770-a2a3-66d8eefff206.png

re.search:扫描整个字符串并返回第一个成功的匹配

函数语法:

re.search(pattern,string,flags=0)

示例

1741862691828-debbdf1a-8d39-4291-8872-aa9d01329e93.png

输出结果

1741862691827-a5dbac39-4fff-43ce-80a3-a2bba2179a7c.png

检索和替换:re模块提供了re.sub用于替换字符串中的匹配项

语法:

re.sub(pattern,repl,string,count=0,flags=0)

pattern表示正则表达式

repl表示替换成的字符串,也可以为函数

string表示要被查找的原始对象

count为最大替换次数

0表示所有

示例

1741862691817-4829f2bf-c217-43ef-85ad-9be9c79a3997.png

输出结果

1741862691834-67d0f885-8201-4380-8b15-dfbd933e4074.png

re.conpile:用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()这两个函数使用

语法:

re.compile(pattern[,flags])

示例

1741862691848-e6b3e89a-068c-4cdb-a43b-f8c6609cf13c.png

输出结果

1741862693959-05ce6dc9-89d2-43f5-b81e-a55945a1bd4c.png

findall:表示在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表

语法:

findall(string[,pos[,endpos]])

string为待匹配字符串

pos指定字符串起始位置,默认为0

Endpos指定字符串结束位置,默认为字符串长度

示例

1741862693957-d45e5515-bc4c-4497-8dbd-18ce55df188c.png

输出结果

1741862694295-6cd96235-252b-49cd-8175-11709aac18ac.png

re.split:按照能够匹配的子串将字符串分割后返回列表

语法:

re.split(pattern,string[,maxsplit=0,flags=0])

pattern为正则表达式

string为要匹配的字符串

maxsplit为分割次数,默认为0不限次数

示例

1741862693976-77d2b29d-2923-422c-8f8e-98c4c03cd29f.png

输出结果

1741862693961-8c7df671-1304-4637-8638-90901f23e9db.png

装饰器:本质为一个python函数,特殊之处在于返回值也是一个函数,可以在不改动现有函数的前提下,对函数的功能进行扩展。装饰器的语法是以@开头,用法如下:

1、构建初始函数

1741862695934-7564e4e2-308c-40e8-b90d-d88f8262bc67.png

输出结果

1741862695924-b9ef3ff6-0faa-41c4-974a-810d184bf465.png

2、扩展函数功能需求

现在需要在之前输出 I learned Python Data Stuctures

一般的解决办法是:

1741862695938-63cda22d-fdf4-41fc-937e-5488dca2c0ce.png

1741862695937-b454c505-b820-4eb8-8cc1-2766654379dd.png

加一行print函数

这样可以解决问题,但改变了现有的函数,如果想不改变原函数的情况下实现该功能,可以使用装饰器

3、装饰函数

1741862695939-6ff35678-8cf4-46de-bd21-615bcf02c299.png

定义一个新函数 decorator(),参数为一个函数,返回值也是一个函数,作为参数的函数func()在返回函数wrapper()内部执行,然后在test()函数前加上@decorator,就像被新装饰这个新的函数

输出结果

1741862698204-27aadfb7-6f32-47ee-982c-132e1fe38fc1.png

生成器:有时集合的元素数量巨大,全部读取放入内存对硬件要求过高,此时可以使用生成器通过循环逐步获取集合后续的元素

在Python中,使用了yield的函数被称为生成器(generator),基本用法:

1、以列表推导式的形式创建生成器

使用圆括号编写生成器

1741862698218-ff668dde-4db6-48c6-bb05-e9ac319c1ffa.png

输出结果

1741862698241-107f1051-0c76-4a36-9d0e-be9af6be5633.png

2、使用yield创建生成器

1741862698225-de6974ab-f0ea-4b26-8e82-a3109a63e54f.png

1741862698231-5f5c0053-6e0c-4e6e-9e5c-e871a899c063.png

输出结果

1741862700208-2ab623ec-b3a9-408a-ab7d-62d5e471e070.png

唤醒生成器:使用next和send方法唤醒生成器,相比于next,send在唤醒生成器时还可以向断点处传入一个数据

1741862700215-7d47a303-b7b6-4bb1-ab5c-e86fc0b5d484.png

迭代器:访问集合的一种方式,迭代器是一个可以记住遍历位置的对象,迭代器从第一个元素开始访问,知道所有元素被访问结束

两个基本的方法 iter()和 next()

示例

1、判断可迭代对象

1741862700234-5395c9dc-b39e-4573-b73d-ab38d726debc.png

输出结果

1741862700217-d50fbb6b-d670-4a84-8317-9bc74b078908.png

2、迭代器基本方法

通过iter()函数获取这些可迭代对象的迭代器,然后可以对获取到的迭代器不断使用next()函数来获取下一条数据

1741862700237-8998efbc-f601-4401-a240-8f1361aeca20.png

3、类实现迭代

类你实现iter()和next()方法,可以实现一个迭代器

StopIteration异常用于标识迭代的完成,防止出现无限循环的情况

示例

1741862702383-59eb3f01-99b2-438a-a89d-a205b8dc7d16.png

输出结果

1741862702378-84a80941-2c61-45ef-a10c-d1d1920292ee.png

多任务:多任务并发编程是一个常见功能,Python的多任务分为多线程和多进程

一个线程是完成特定任务的指令流,是处理器可以分配时间的最小执行单元。线程通常位于进程里面,由一个程序计数器,一个堆栈,一组寄存器,,一个标识符组成

一个进程里面包含一个主线程,还可以生成很多子线程。每个线程都包含自己的寄存器和堆栈等,我们可以有单线程的进程,也可以有多线程的进程。一般一个程序的执行实例就是一个进程

多线程:python中多线程可以用threading模块实现

1、多线程执行任务

1741862702440-48aa26a1-cf97-4df2-a184-76d033af722a.png

输出结果

1741862702369-b32e4376-4a14-4937-b973-4732cc346d67.png

2、线程同步

如果多个线程共同对某个数据修改,可能出现预料外的后果,为确保数据正确性,需要对多个线程同步,使用lock实现简单的线程同步,这个对象有acquire方法和release方法,实现同步引入锁的概念,锁有两种状态,locked 和 unlock 每当一个线程比如要访问共享数据时,必须先获得锁定,如果已经有别的线程获得锁定了,那么就此线程会暂停,也就是同步阻塞,等到其他线程访问完毕,释放锁以后,再让此线程继续

示例

1741862702491-df200012-c68a-4c22-8dbc-de495e9c360c.png

输出结果

1741862704808-a6c95b48-24d7-4fdd-9d94-b3aece13ea42.png

多进程:python要进行多进程操作,需要用到muiltprocessing模块,其中process类和多线程很相似

1741862704835-fcb6ffed-823c-44ec-b627-5309699fb3dc.png

1741862704838-d90db9e9-632e-49d9-b819-449298f4bc7b.png

输出结果

1741862704820-ad49fa9c-26ae-4fd0-a0b0-0634dd928323.png

更新: 2025-03-13 18:45:11
原文: https://www.yuque.com/yuhui.net/network/kg9930b68bw2p559



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字

插入代码