Python基础
Python是一门开源的高级编程语言
优点:
优雅地语法、动态类型具有解释性质。
支持面向过程和面向对象的编程
丰富的第三方库
调用其他语言所写的代码,因此被称为胶水语言
缺点
运行慢,是解释型语言
不需要编译就运行,代码在运行时会逐行翻译成CPU能理解的机器码,翻译过程耗时
同时Python是动态类型语言
动态类型语言:在程序运行过程中自动决定对象的类型,不需要声明变量的类型
代码执行过程:
源码->编译器->pyc文件(字节码)->python虚拟机运行
操作过程:
1、在操作系统安装python和运行环境
2、编写python源码
3、编译器运行python源码,编译生成pyc文件(字节码)
4、python虚拟机将字节码转换为机器语言
5、硬件执行机器语言

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

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

编码规范:编写代码应该遵守的命名规则、代码缩进、代码和语句分割方式等
分号:允许在行尾添加分号,但是不建议使用分号隔离语句,建议每条一句单独一行
空行:不同函数或语句块之间可以使用空行来分隔。用以区分两段代码,提高代码可读性
圆括号:用于长语句的续行,一般不适用不必要的括号
空格:不建议在括号内使用空格,对于运算符,可以按照个人习惯决定是否在两侧加空格
标识符命名:标识符用于表示常量、变量、函数以及其他对象的名称
标识符通常由字母、数字、下划线组成、但不能以数字开头
标识符大小写敏感,不允许重名
如果标识符不符合规则、编译器运行代码会输出SyntaxError语法错误
Python基本数据类型有布尔型(True or False )整数型、浮点型、字符串型,所有数据都是以对象的形式存在的

代码缩进:
代码缩进代表代码块的作用域,如果一个代码块包含两个或更多语句,则这些语句必须具有相同的缩进量,对于Python而言代码缩进是一种语法规则,使用代码缩进和冒号来区分代码之间的层次
编写代码的时,建议使用4个空额来生成缩进。如果程序代码使用了错误的缩进,则会在运行中发出IndentationError错误信息
if…else…是一个代码块 具有相同缩进
print(a)调用参数a,并且和if…else…在一个代码块 需要有相同缩进

使用注释:
注释即在程序中添加解释说明,分为单行注释和多行注释
单行注释以#字符直到行尾结束
多行注释内容可以包含多行,这些内容包含在一对三引号内——”’…”’ OR """…"""

源码文件结构
完整的python源码文件一般包含 解释器 编码格式声明 文档字符串 模块导入和运行代码
如果会在程序中调用标准库或其他第三方的库的类时,需要使用import或 from… import语句导入相关的模块,导入语句始终在文件的顶部。在模块注释或文档字符串(docstring)之后
解释器声明的作用:指定运行本文简单编译器的路径,windows操作系统可以省略下例第一行解释器声明(非默认路径安装编译器或有多个python编译器)
编码格式声明的作用:指定本程序使用的编码类型,以指定的编码类型读取源代码(python2默认使用ASCII编码(不支持中文),python3默认支持UTF-8源码(支持中文)
文档字符串的作用是对本程序功能的总体介绍
time作为python内置模块,作用是提供处理时间相关的函数

Python的函数与模块
函数(function)是组织好的、可重复使用的一段代码,能够提高程序的模块化程度和代码利用率,使用def定义
模块是一个保存好的python文件,可以由函数或者类组成,模块和常规python程序之间的唯一区别是用途不同:模块被其他程序调用。用词,模块通常没有main函数

类与方法
类(class)描述一类相同的属性和方法的几何,关键字class
被实例化的类的函数被称作方法method,类定义方法时候必须携带self关键字,表示类的实例本身

Python数据类型
标准库含盖的内置类型
数据类型:
数值、字符串、列表、元组、字典和集合
数值:数值数据类型用于存储数值。它们是不可改变的数据类型,改变数值数据类型会分配一个新对象
python中的与或非 布尔操作不使用操作符,而使用关键词and/or/not

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

字符串的不可变性:

字符串的常用操作:

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

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

输出结果:

列表推导式:

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

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

字典:
字典dictionary是灵活的内置数据结构类型,字典用{}标识
字典由索引(key)和它对应的值value组成。和列表对比,字典当中的元素是通过键来存取的,而不是通过偏移存取
常用操作:


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

深拷贝与浅拷贝
对象赋值实际上是对象的引用,当创建一个对象把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用
本例使用copy模块来理解深拷贝和浅拷贝的区别


输出结果:

if语句:匹配条件后执行后续指令
本例作用是接收一个用户输入的分数,然后判断用户所输入的分数属于什么级别

for循环:可以遍历任何序列的项目,如一个列表或一个字符串
本例打印九九乘法表

输出结果

while循环:在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。
当满足条件时循环执行语句块,想要结束时,使用break或continue结束循环

输出结果

自定义函数:除了python提供的内建函数,还可以自己创建函数,也就是自定义函数
定义函数:使用def关键字自定义一个函数,能够调用函数功能(打印信息)

输出结果

函数的参数传递与默认参数:
自定义函数,要求打印不同方式传入的参数、

输出结果

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

输出结果

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

输出结果

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

文件写入:

输出结果:



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

输出结果

上下文管理器操作文件:上下文管理器规定了资源的使用范围,代码开始时候分配资源,结束时释放资源,能够很好的精简代码和提高代码可读性,上下文管理器和with语句一起工作,基本语法为:
with 上下文表达式 [as 资源对象] : #as表示将上下文的返回值赋值给资源对象
对象的操作

输出结果

异常处理:程序在执行过程中产生的错误称为异常。常见有
语法错误SynataxError
未声明变量NameError
访问未知属性AttributeError等
python有强大的异常处理机制,它可以准确的反馈错误信息。
python使用try-except语句处理异常,其中try语句用于检查异常,except用于捕获异常
制造异常:

输出结果

可以捕获ZeroDivisionError这个异常,保持程序正常运行
使用try-excpet生成代码
捕获ZeroDivisionError这个异常,输出’第二个数不能为0′

输出结果

如果需要捕获多个异常,可以在并列有多个except语句捕获不同异常
捕获所有异常:exception类是所有异常的父类,可用来表示所有异常

输出结果

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

面向对象编程(类):类和对象是面向对象编程的重要概念
对象是具体事物,类是对一群具有相同特征和行为的事物的统称,中文里我们可以理解为“分类”。
例如第一个案例中,狗是一个类,而哈士奇是其中一个对象,哈士奇具备狗这个类的所有特征和行为。
创建和使用类:


输出结果

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

输出结果

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

输出结果

类的继承:
面向对象的编程好处之一是代码的重用,实现这种重用的方法之一是通过继承机制,基础完全可以理解成类之间的类型和子类型关系。
以下构建了一个Dog子类Husky,继承父类的属性和方法,使用方法为class子类(父类)
如果一个子类需要多基础,方法为class子类(父类1,父类2),本案例为单继承

输出结果

类多态:多态指不考虑对象类型的情况下使用对象,意为 python不关心对象是父类还是子类,只关心对象的行为(方法)
下例中父类Dog,有shout方法。Dog的子类哈士奇和藏獒,重写了父类的shout方法,定义一个函数sound,调用shout方法可以不用关心对象是父类还是子类,只要他们都有这个shout方法

输出结果

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


Flag标志

re.match:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
函数语法:
re.match(pattern,string,flags=0)
其中pattern表示匹配的正则表达式,string表示要匹配的对象,flags为标志位
示例

输出结果

re.search:扫描整个字符串并返回第一个成功的匹配
函数语法:
re.search(pattern,string,flags=0)
示例

输出结果

检索和替换:re模块提供了re.sub用于替换字符串中的匹配项
语法:
re.sub(pattern,repl,string,count=0,flags=0)
pattern表示正则表达式
repl表示替换成的字符串,也可以为函数
string表示要被查找的原始对象
count为最大替换次数
0表示所有
示例

输出结果

re.conpile:用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()这两个函数使用
语法:
re.compile(pattern[,flags])
示例

输出结果

findall:表示在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
语法:
findall(string[,pos[,endpos]])
string为待匹配字符串
pos指定字符串起始位置,默认为0
Endpos指定字符串结束位置,默认为字符串长度
示例

输出结果

re.split:按照能够匹配的子串将字符串分割后返回列表
语法:
re.split(pattern,string[,maxsplit=0,flags=0])
pattern为正则表达式
string为要匹配的字符串
maxsplit为分割次数,默认为0不限次数
示例

输出结果

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

输出结果

2、扩展函数功能需求
现在需要在之前输出 I learned Python Data Stuctures
一般的解决办法是:


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

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

生成器:有时集合的元素数量巨大,全部读取放入内存对硬件要求过高,此时可以使用生成器通过循环逐步获取集合后续的元素
在Python中,使用了yield的函数被称为生成器(generator),基本用法:
1、以列表推导式的形式创建生成器
使用圆括号编写生成器

输出结果

2、使用yield创建生成器


输出结果

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

迭代器:访问集合的一种方式,迭代器是一个可以记住遍历位置的对象,迭代器从第一个元素开始访问,知道所有元素被访问结束
两个基本的方法 iter()和 next()
示例
1、判断可迭代对象

输出结果

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

3、类实现迭代
类你实现iter()和next()方法,可以实现一个迭代器
StopIteration异常用于标识迭代的完成,防止出现无限循环的情况
示例

输出结果

多任务:多任务并发编程是一个常见功能,Python的多任务分为多线程和多进程
一个线程是完成特定任务的指令流,是处理器可以分配时间的最小执行单元。线程通常位于进程里面,由一个程序计数器,一个堆栈,一组寄存器,,一个标识符组成
一个进程里面包含一个主线程,还可以生成很多子线程。每个线程都包含自己的寄存器和堆栈等,我们可以有单线程的进程,也可以有多线程的进程。一般一个程序的执行实例就是一个进程
多线程:python中多线程可以用threading模块实现
1、多线程执行任务

输出结果

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

输出结果

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


输出结果

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

评论(0)
暂无评论