黑马程序员python自学笔记,超详细(内置环境配置与编译器的下载)
Python的学习
环境的搭建
请参考以下文章
Python:环境变量配置方法 详细教程_python环境变量的配置-CSDN博客
编译器的下载
1 | https://www.jetbrains.com.cn/en-us/pycharm/ |
HelloWorld案例的实现
1 | print("HelloWorld") |
基础语法
输入与输出
1 | print() 输出括号的内容之后默认回车,变量与变量之间用逗号隔开 |
注释
1 | # 为单行注释 |
变量
1 | 概述: |
type()
概述:判断数据类型
常见的转换语句
语句(函数) | 说明 |
---|---|
int(x) | 将x转换为一个整数 |
float(x) | 将x转换为一个浮点数 |
str(x) | 将对象x转换为字符串 |
字符串的拼接与格式化
拼接:
使用“+”号连接字符串变量或者字符串字面量,但是无法与非字符串类型进行拼接
格式化:
- “%占位符”%变量
- f“{变量} {变量}”
if语句
格式:
1 | if型: |
随机数的产生
1 | import random |
while循环
1 | while 条件: |
嵌套循环
注意用缩进表示层次关系就行
for循环
1 | 格式: |
注意:他会将序列的元素一个一个放入临时变量里在代码区处理,直到所有的元素都处理才停止
循环中断与停止
- continue:中断循环,直接进入下一次
- break:结束循环
range语句
功能:
获得一个数字序列
语法格式:
1 | range(num) #从0开始到num结束(不含有num本身),步长默认为1 |
range用途很多,多数用在for循环场景
函数
概述:
组织好的,可重复使用的,用来实现特定功能的代码段
定义:
1 | def 函数名(传入参数): |
lambda匿名函数
概述:无名称的函数,只可临时使用一次
定义:
1 | lambda 传入参数:函数体(一行代码) |
多个返回值
1 | def test_return(): |
多个传参方式
位置传参:根据参数位置来传递参数
关键字传参:通过”键=值“形式传递参数,没有顺序要求
缺省参数:缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值
不定长参数:也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)
位置传递
1
2
3
4
5
6
7
8
9
10def user_info(*arge):
print(arge)
#('TOM')
user_info('TOM')
#('TOM','18')
user_info('TOM',18)
注意:
传进的所有参数都会被args变量收集,他会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是元组类型,这就是元组类型,这就是位置传递
关键字传递
1
2
3
4
5
6
7
8def user_info(**kargs):
print(kwargs)
#{'name';'TOM','age';18,'id':110}
user_info(name='TOM',age=18,id=110)
注意:
参数是”键=值“形式的形式的情况下,所有的”键=值“都会被kwargs接受,同时会根据”键=值“组成字典
注意:
- 位置参数必须出现在其他参数前面,包括函数定义和调用
函数作为参数传递
1 | def test_func(compute): |
这是一种计算逻辑的传递,而非数据的传递,就像上述代码那样,不仅仅是相加,相减,相除,等任何逻辑都可以自行定义并作为函数传入
None
概述:
None是类型‘NoneType’的字面量,用于表示:空的,无意义的
函数不是用return就会默认返回None
说明文档
1 | """ |
类型注解
变量注解
- 语法一:变量:类型
- 语法二:在注释中,#type:类型
函数注解:
1 | def 函数方法名(形参:类型,……,形参:类型) -> 返回值类型: |
注意,返回值类型注解的符号使用:->
Union注解(联合类型注解):
- 导包:from typing import Union
- 使用:Union[类型,……,类型]
局部变量与全局变量
局部变量:
定义在函数内部,外部无法使用
全局变量:
定义在函数外面,函数内外都可以使用,定义在函数内部的变量可以通过global关键字声明为全局变量
对象
在程序中是可以做到和生活中那样,设计表格,生产表格,填写表格的组织形式的
1.在程序中设计表格,我们称为:设计类(class)
2.在程序中打印生产表格,我们称之为:创建对象
3.在程序中填写表格,我们称之为:对象属性赋值
类
1.类是由哪两部分组成呢?
类的属性,称之为:成员变量
类的行为,称之为:成员方法
注意:函数是写在类外的,定义在类内部,我们都称之为方法
2.类和成员方法的定义语法
1 | class 类名称: |
3.self的作用
- 表示类对象本身的意思
- 只有通过self,成员方法才能访问类的成员变量
- self出现在形参列表中,但是不占用参数位置,无需理会
类与对象
1.现实世界的事物由什么组成?
- 属性
- 行为
类也可以包含属性和行为,所以使用类描述现实世界事物非常合适的
2.类和对象的关系是什么?
- 类是程序中的“设计图纸”
- 对象是基于图纸生产的具体实体
3.什么是面向对象编程?
面向对象编程就是,使用对象进行编程。
即,设计类,基于类创建对象,并使用对象来完成具体的工作
构造方法
Python类可以使用: init ()方法,称之为构造方法。
可以实现:
- 在创建对象(构造类)的时候,会自动执行。
- 在创建类对象(构造类)的时候,将传入的参数自动传递给 init 方法使用
1 | class student: |
魔术方法
方法 | 功能 |
---|---|
init | 构造方法,可用于创建类对象的时候设置初始化行为 |
str | 用于实现类对象转字符的行为 |
lt | 用于两个类对象进行小于或大于比较 |
le | 用于两个类进行小于等于或大于等于比较 |
eq | 用于两个类进行相等比较 |
封装
1.封装的概念是指?
将现实世界事物在类中描述为属性和方法,即为封装。
2.什么是私有成员?为什么需要私有成员?
现实事物有部分属性和行为是不公开对使用者开放的。同样在类的描述属性和方法的时候也需要到达这个要求,就需要定义私有成员了
3.如何定义私有成员?
成员变量和成员方法的命名均以 __ 作为开头即可
4.私有成员的访问限制?
- 类对象无法访问私有成员
- 类中的其他成员可以访问私有成员
继承
什么是继承?
继承就是一个类,继承另外一个类的成员变量和成员方法
语法:
1 | class 类(父类1,父类2,父类3,...,父类n): |
子类构建的类对象,可以
- 有自己的成员变量,和成员方法
- 使用父类的成员变量和成员方法
2.单继承和多继承
单继承:一个类继承另一个类
多继承:一个类继承多个类,按照顺序从左向右依次继承
多继承中,如果父类有同名方法或属性,先继承的优先级高于后继承
3.pass关键之的作用是什么
pass是占位语句,用来保证函数(方法 )或类定义的完整,表示无内容,空的意思
复写
1.复写表示:
对父类的成员属性或者成员方法进行重新定义
2.复写的语法:
在子类中重新实现同名成员方法或成员属性即可
3.在子类中,如何调用父类成员
方法一:
调用父类成员
使用成员变量:父类名.成员变量
使用成员方法:父类名.成员方法(self)
方法2:
使用super()调用父类成员变量
使用成员变量:super().成员变量
使用成员方法:super().成员方法()
注意:只能可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的
多态
1.什么是多态?
多态指的是,同一个行为的不同对象获得不同的状态。
如,定一个函数(方法),通过类型注释声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态
2.什么是抽象类(接口的)
包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法(pass)称之为抽象方法
3.抽象类的作用
多用于做顶层设计(设计标准),一边子类做具体实现。
也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法,并配合多态使用,获得不同的工作状态。
闭包
1.什么是闭包?
定义双重函数,内层嵌套可以访问外层函数的变量,将内存函数作为外层函数的返回,此内层函数就是闭包函数
2.闭包的好处和缺点?
- 优点:不定义全局变量,也可以让函数持续访问和修改一个外部变量
- 优点:闭包函数引用的外部变量,是外层函数的内部变量。作用域封闭难以被误操作修改
- 缺点:额外的内存占用
3.nonlocal关键字的作用
在闭包函数(内部函数中)想要修改外部变量的变量值,需要用nonlocal声明这个外部变量
装饰器
1.什么是装饰器?
装饰器就是使用一个闭包函数,在闭包函数内调用目标函数。可以达到不改动目标函数的同时。增加额外的功能。
2.装饰器的写法
1 | def outer(func): |
设计模式
1.什么是设计模式
设计模式就是一种编程套路。使用特定的套路得到特定的效果
2.什么是单例设计模式
单例模式就是对一个类,只获取其唯一的类实例对象,维持复用它。
- 节省空间
- 节省创建对象的开销
3.什么是工厂模式
将对象的创建由使用原生类本身创造,转换到由特定的工厂方法来创造
4.好处
- 大批量创建对象的时候有统一的入口方法,易于代码维护
- 当发生修改,仅修改工厂类的创建方法即可
- 符合现实世界模式,即由工厂来制作产品(对象)
线程
1.什么是进程
程序在操作系统内运行,即成为一个运行进程
2.什么是线程
进程内部可以有多个线程,程序的运行本质上就是由进程内部的线程在实际工作的
3.什么是并行执行
- 多个线程同时在运行,即不同的程序同时运行,称之为:多任务并行执行
- 一个进程内多个线程同时在运行,称之为:多线程并行执行
threading模块
1 | import threading |
数据库
1.数据库是什么?有什么作用呢?
数据库就是指数据存储的库,作用就是组织数据并存储数据。
2.数据库如何组织数据呢?
按照:库->表->数据 三个层级进行组织
3.数据库软件是什么?我们学习哪种数据库软件呢?
数据库软件就是提供库->表->数据,这种数据组织形式的工具软件,也是称之为数据库管理系统
常见的数据库软件由:Oracle,MySQL,SQL Server,PostgreSQL,SQLite
4.数据库和SQL的关系是?
数据库(软件)提供数据组织储存的能力
SQL语句则是操作数据,数据库的工具语言
数据容器
概述:
一种可以存储多个元素的python数据类型
常见的有list(列表),tuple(元组),str(字符串),set(集合),dict(字典)
list
基本格式:
1 | #字面量 |
索引:
每个元素都有编号,被称为下标索引
- 从前到后的方向,编号从0开始递增
- 从后向前的方向,编号从-1开始递减
列表的方法
使用方式 | 说明 |
---|---|
列表.append(元素) | 向列表中追加一个元素 |
列表.extend(容器) | 将数据容器的内容依次取出,追加到列表尾部 |
列表.insert(下标,元素) | 在指定下标处,插入指定的元素 |
del 列表[下标] | 删除列表指定下标元素 |
列表.pop(下标) | 删除列表指定下标元素 |
列表.remove(元素) | 从前向后,删除此元素第一个匹配项 |
列表.clear() | 清空列表 |
列表.count(元素) | 统计此元素在列表中出现的次数 |
列表.index(元素) | 查找指定元素在列表的下标(找不到会报错ValueError) |
len(列表) | 统计容器内有多少元素 |
特点
- 可以容纳不容类型的元素(混装)
- 数据是有序的(有下标序号)
- 允许数据重复
tuple
基本格式:
1 | #定义元组字面量 |
元组的方法
方法 | 说明 |
---|---|
index() | 查找指定元素在元组的下标(找不到会报错ValueError) |
count() | 统计此元素在元组中出现的次数 |
len(元组) | 统计容器内有多少元素 |
元组的特点
多数特性与列表一致,不同点在于元组具有不可以修改的特性
str
索引:
- 从前到后的方向,编号从0开始递增
- 从后向前的方向,编号从-1开始递减
1 | #通过下标获取特定位置字符 |
字符串的替换
语法:字符串.replace(字符串1,字符串2)
功能:将字符串内的全部内容:字符串1,替换为字符串2,返回一个新的字符串
字符串的分割
语法:字符串.split(分隔符字符串)
功能:按照指定的分隔符字符串,将字符串划分为多个字符串,并返回一个列表对象
规整操作
1 | 语法:字符串.strip() #去除前后的空格 |
特点
- 只存储字符串
- 不可修改
序列
概述:
内容有序,可以使用下标索引的一类数据容器,列表,元组,字符串,均可以视为序列
切片:
语法:序列[起始:结束:步长]
- 起始可以省略,省略从头开始
- 结束可以省略,省略到尾结束
- 步长可以省略,省略步长为1(可以为负数,表示倒叙执行)
set
基本格式
1 | #定义集合字面量 |
常用功能
操作 | 说明 |
---|---|
集合.add(元素) | 集合内添加一个元素 |
集合.remove(元素) | 移除集合内指定元素 |
集合.pop() | 从集合中随机取出一个元素 |
集合.clear() | 将集合清空 |
集合1.difference(集合2) | 得到一个新集合,内含2个集合的差集,原有的2个集合内容不变 |
集合1,difference_updata(集合2) | 在集合1中,删除集合2中存在的元素,集合1被修改,集合2不变 |
集合1.union(集合2) | 得到1个新集合,内含2个集合的全部元素,原有的2个集合内容不变 |
len(集合) | 得到一个整数,记录集合的元素数量 |
特点
- 可以容纳不同的数据类型(混装)
- 数据是无序存储的
- 没有重复数据
- 可以增加删除元素
- 支持for循环
dict
基本格式:
1 | #字典存储的是键值对 |
注意
- 键值对的Key和Value可以是任意类型(key不可以为字典)
- 字典内的Key不能重复,重复添加等于覆盖原有数据
- 字典没有下标索引,但可以通过key索检value
常用功能
操作 | 说明 |
---|---|
字典[key] | 获取指定key对应的value值 |
字典[key]=value | 添加或更新键值对 |
字典.pop(key) | 取出key对应的value并在字典内删除此key的键值对 |
字典.clear() | 清空字典 |
字典.keys() | 获取字典的全部key,可用于for循环遍历字典 |
len(字典) | 计算字典内的元素数量 |
容器的通用功能
功能 | 说明 |
---|---|
通用for循环 | 遍历容器(字典是遍历Key) |
max() | 容器内最大的元素 |
min() | 容器内最小的元素 |
len() | 容器元素的个数 |
list() | 转换为列表 |
tuple() | 转换为元组 |
str() | 转换为字符串 |
set() | 转换为集合 |
sorted(序列,[reverse=True]) | 排序,reverse=True表示降序得到一个排好序的列表 |
列表的sort方法
使用方法:
列表.sort(key=选择排序依据的函数,reverse=True|False)
- 参数key,要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排列的依据
- 参数reverse,是否反转排序结果,True表示降序,False表示升序
文件
open()打开函数
1 | open(name,mode,encoding) |
访问模式
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会再文件的开头。这是默认模式 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除,如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有的内容。如果该文件不存在,创建新文件进行写入。 |
操作总汇
操作 | 描述 |
---|---|
文件对象 = open(file,mode,encoding) | 打开文件获取文件对象 |
文件对象.read(num) | 读取指定长度字节,不指定num读取文件全部 |
文件对象.readline() | 读取一行 |
文件对象.readlines() | 读取全部行,得到列表 |
for line in 文件对象 | for循环文件行,一次循环得到一行数据 |
文件对象.close() | 关闭文件对象 |
with open() as f | 通过with open语法打开文件,可以自动关闭 |
文件对象.wirte() | 写入内容 |
文件对象.flush() | 刷新内容到硬盘里 |
捕获异常
语法:
1 | try: |
导入模块
概述:
就是一个Python文件,里面有类,函数,变量,我们可以拿来用(导入模块去使用)
语法
1 | [from 模块名] import [模块|类|变量|函数|*] [as 别名] |
注意:
- from可以省略,直接import即可
- as别名可以省略
- 通过“.”来确定层级关系
1 | _main_变量的功能是? |
第三方包
概述:
非Python官方制作的包,具有丰富的功能,可以提升我们题高开发效率,如:
- 科学计算中常用的:numpy包
- 数据分析中常用的:pandas包
- 大数据计算中常用的:pyspark,apache-flink包
- 图形可视化常用的:matplotlib,pyecharts
- 人工智能常用的:tensorflow
- 等
安装第三方包-pip
利用Python内置的pip程序
- 打开我们许久未见的:命令提示符程序,在里输入:
- pip install 包名称
- pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
数据可视化
什么是json
- Json是一种轻量级的数据交互格式。可以按照json指定的格式去组织和封装数据
- json本质上是一个带有特定格式的字符串
主要功能:json就是一种在各个编程语言中流通的数据格式(各种编程语言的中转站),负责不同编程语言中的数据传递和交互,类似于:
- 国际通用语言—英语
- 全中国通用语言—普通话
Python语言使用JSON有很大优势,因为:JSON无非就是一个单独的字典或者一个内部元素都是字典的列表
所以JSON可以直接和Python的字典或列表无缝转换。
操作
操作 | 描述 |
---|---|
json.dumps(data) | 将python数据转换为json数据,如果有中文数据可以使用:ensure_ascii=False参数来确保中文正常转换 |
json.loads(data) | 将json数据转换为Python列表或者字典 |
PyEcharts模块
开发可视化图使用的技术栈是:
Echarts框架的Python版本:PyEcharts包
如果查看官方示例:
1 | 打开官方画廊:https://gallery.pyecharts.org/#/README |
基础折线图
1 | # 导包Line功能构建折线图对象 |
全局配置选项
- 配置图标的标题
- 配置图列
- 配置鼠标移动效果
- 配置工具栏
- 等整体配置项
基础地图
1 | # 导包map实现对象创造 |
基础柱状图
1 | # 导包Bar |
基础时间柱状图
1 | # 导包Bar |
设置主题
1 | from pyecharts.globals import ThemeType |
正则表达式
概述:
就是使用字符串来定义规则,并通过规则去验证字符串是否匹配
正则的三个基础方法:
Python正则表达式,使用re模块,并基于re模块中的三个基础方法来做正则匹配。分别是:match,search,findall三个基础方法
re.match(匹配规则,被匹配字符串)
1
2
3
4
5
6
7
8
9
10
11
12从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空
s = 'python itheima python itheima python itheima'
result = re.match('python',s)
print(result) #<re.Match object; span=(0,6),match='python'
print(resuit.span()) #(0,6)
print(resuit.group()) #python
s = '1python itheima python python itheima'
result = re.match('python',s)
print(result) #Nonesearch(匹配规则,被匹配字符串)
1
2
3
4
5
6
7
8
9
10
11
12
13搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后
s = '1phthon666itheima666python666'
result = re.search('python',s)
print(result) #<re.Match object;span=(1,7),match='python'>
print(result.span()) #(1,7)
print(result.group()) #python
整个字符串都找不到,返回None
s = 'itheima666'
result = re.search('python',s)
print(result) #Nomefindall(匹配规则,被匹配字符串)
1
2
3
4
5
6
7
8
9
10
11匹配整个字符串,找出全部匹配项
s = '1python666itheima666python666'
result = re.findall('python',s)
print(result) #{'python','python'}
找不到返回空list:[]
s = '1python666itheima666python666'
result = re.findall('itcast',s)
print(resuit) #[]
元字符匹配
单字符匹配:
字符 | 功能 |
---|---|
. | 匹配任意一个字符(除了\n),\ .匹配点本身 |
[] | 匹配[]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字 |
\s | 匹配空白,及空格,tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z,A-Z,0-9,_ |
\W | 匹配非单词字符 |
示例:
1 | 字符串 s = "itheima1@@python2!!666##itcast3" |
数量匹配:
字符 | 功能 |
---|---|
* | 匹配前一个规则的字符现0至无数次 |
+ | 匹配前一个规则的字符出现1至无数次 |
? | 匹配前一个规则的字符出现0次或1次 |
{m} | 匹配前一个规则的字符出现m次 |
{m,} | 匹配前一个规则的字符出现最少m次、 |
{m,n} | 匹配前一个规则的字符出现m到n次 |
边界匹配:
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界 |
分组匹配:
|
可以比配左右任意一个表达式()
可以将括号中字符作为一个分组
网络编程
服务端开发
1 | #socktr创建对象 |
下载网络调试助手作为客户端
https://github.com/nicedayzhu/netAssist/releases
客服端开发
1 | #创建socket对象 |