1 类和对象
1.1 类
(1)类的定义和使用

(2)成员方法的定义语法


使用程序中的类,可以完美的描述现实世界中的事物。但是类只是一种程序中的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作。—— 面向对象编程
//示例:自定义闹钟类

(3)构造方法

//示例:

(4)其他的类内置方法

① __str__(字符串方法):当类对象需要被转换为字符串时,会转为内存地址,我们可以通过 __str__方法,控制类转换为字符串的行为。
②__lt__(小于符号比较方法):直接比较两个对象是不可以的,通过自定义类中的 __lt__ 方法可以实现小于符号和大于符号两种比较方法。
//示例:

1.2 封装
(1)封装的定义
面向对象的三大特性
- 面向对象编程,是许多编程语言都支持的一种编程思想。简单理解是:基于模板(类)去创建实体(对象),使用对象完成功能开发。
- 面向对象包含3大主要特性:封装、继承、多态。
封装:将现实世界事物的属性、行为封装到类中,描述为从成员变量和成员方法,从而二完成程序对现实世界的描述。

在现实世界中,一些属性或行为是不公开的,我们说有“权限”。
(2)私有成员
私有成员:类中提供了私有成员的形式支持控制权限,即私有成员变量、私有成员方法;
定义私有成员的方式: 以"__"开头(2个下划线);类内部的成员方法可以访问所有成员。
//示例:对私有成员的访问在代码中不会报错;但是访问私有成员变量实际上会创建一个临时变量操作;访问私有方法,python会去方法列表中寻找,找不到,然后报错!

Python 设计这种机制,主要目的其实是为了防止在继承时,子类不小心覆盖了父类的内部属性,而不是为了提供绝对的数据安全或隐私保护。
1.3 继承
(1)继承的基础语法
继承:从父类那里继承成员变量和成员方法。分为单继承(继承一个类)和多继承(继承多个类)
多继承注意事项:多个父类中,如果有同名的成员,默认以继承顺序从左到右为优先级。
(我想要什么功能,继承相应的类,我的技能+++)
//示例1:单继承

//示例2:多继承,若不添加新的内容,需要在类内容体中写 "pass" 。
pass关键字:占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思。

//示例3:Super_Star继承了多项技能!

//示例4:先继承的保留,后继承的被覆盖。

(2)复写
复写:子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。即:在子类中重新定义同名的属性或方法即可。
//示例1:修改父类的job、cooking属性。

一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员如果需要使用被复写的父类的成员,需要特殊的调用方式:
![]()
//示例2:只能在子类内部调用父类开放的同名成员,子类的实体类对象调用默认调用子类复写的。

//示例3:子类内部只能访问父类开放权限的成员。

1.4 类型注解
(1)为什么需要类型注解?
//现象:①对于一个列表(Python 内置的类型对象)对象输入".ap"的时候会自动提示可能指定的的方法".append",但是自定义的类在使用对象实例时不会自动提示自定义的成员方法。② 对于内置的类型的方法调用/内置的方法调用,进行传参时,快捷键 ctrl + p 会自动弹出提示,传如哪些参数以及它们的类型,但是自定义的方法调用传参时,仅能提示传入参数名字,而类型未知。。。
—— Pycharm无法通过代码确定应该传入什么类型,我们需要类型注解!
(2)类型注解
python在3.5版本开始引入了类型注解,以方便静态类型检查工具,IDE等第三方工具。
类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显示的说明)。
主要功能:
- 帮助第三方IDE工具(如Pycharm)对代码进行类型推断,协助做代码提示;
- 帮助开发者自身对变量进行类型注释。()
支持:备注
- 变量的类型注解
- 函数(方法)的形参列表和返回值的类型注解。
(3)变量的类型注解
基础语法:变量:类型



为变量设置注解时,显示的变量的定义,一般无需注解;因为这些内容就算不写注解,IDE也能够明确变量的类型;一般,无法直接看出来变量类型之时会添加便能量的类型注解。

需要明确的是,注解并不会真正对类型做验证和判断,它仅仅是提示性的,不是决定性的。
//示例:数据类型和注解类型无法对应也不会导致错误

(4)函数(方法)的类型注解

函数和方法的形参类型注解语法:
//示例1:函数(方法)的形参注解

//示例2:函数(方法)的返回值注解,注解仅是提示,不会做限制

(5)Union类型

Union联合类型,在变量注解、函数(方法)形参和返回值注解中,均可使用。
//示例:

1.5 多态
多态:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。
(1)多态常作用在继承关系上:
比如:函数(方法)形参声明接收父类对象,实际传入父类的子类进行工作
即:以父类做定义声明→以子类做实际工作→用以获得统一行为,不同状态
//示例:


(2)抽象类(接口)
注意到上面案例中 Animal 的 speak 方法是空实现,这种设计的含义是:
- 父类用来确定有哪些方法
- 具体的方法实现,由子类自行决定
这种写法就叫做抽象类(也可以称之为接口)。下面做定义:
抽象类:含有抽象方法的类就称之为抽象类; —— 顶层设计
抽象方法:方法体是空实现的(pass)称之为抽象方法。 —— 具体实现

抽象类的作用:多用于做顶层设计(设计标准),以便子类做具体实现;也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法。
数据可视化分析-案例
1-数据类封装

2-文件读取类封装


3-数据可视化

2 SQL入门与实战


2.1 数据库介绍
(1)认识数据库



(2)数据库管理系统(数据库软件)

这些软件都能实现管理库、管理表,基于表来管理数据。
(3)数据库与SQL的关系

2.2 安装MySQL数据库


(安装流程就不写了,有很多已有多的教程~注意在最开始安装的选项,如果要自定义安装路径则选择“custom 版本”否则默认在C盘安装了)

图形化工具,Navicat:下面三个数据库通常是MySQl内置数据库,一帮情况下不要动。

2.3 SQL基础
(1) SQL概述

(2) SQL分类

(3) SQL的语法特征


(4) DDL-库管理和表管理


(5)DML

①数据插入 INSERT


②数据删除 DELETE

③数据更新 UPDATE


(6) DQL-数据查询
①基础查询


② 数据过滤


③ 分组聚合

//示例1:group by中出现谁,前面的字段的非聚合函数部分只能出现谁。

④ 结果排序

//示例:

⑤结果分页限制

//示例:

//示例2:

2.4 Python-MySQL
(1)基础使用

//示例1:创建链接——获取游标对象——选择数据库——执行语句。

(2)数据插入


//示例2:

//示例:从数据库中读取数据反写文件:


3 PySpark
3.1 了解PySpark







//示例:

总结一下:
PySpark的功能都是从SparkContext对象作为开始;
PySpark的编程模型:
- 数据输入:通过SparkContext完成数据读取
- 数据计算:读取到的数据转换为RDD对象,调用RDD的成员方法完成计算
- 数据输出:调用RDD的数据输出相关成员方法,将结果输出到python容器(list、tuple、dict)、文本文件、数据库等
3.2 数据输入
(1)RDD对象
PySpark支持多种数据的输入,在输入完成后,都回得到一个RDD类的对象。
RDD全称为:弹性分布式数据集(Resilient Distributed Datasets)
PySpark针对数据的处理,都是以RDD对象作为载体,即:
- 数据存储在RDD内
- 各类数据的计算方法,也都是RDD的成员方法
- RDD的数据计算方法,返回值依旧是RDD对象
(2)Python数据容器转RDD对象
PySpark支持通过SparkContext对象的 parallelize 成员方法,将:list、tuple、set、dict、str转换为PySpark的RDD对象。
注意:
- 字符串会被拆分为一个个的字符串,存入RDD对象
- 字典仅有key会被存入RDD对象
//示例1:Python数据容器→RDD对象


//示例2:读取文件转RDD对象


3.3 数据计算
PySpark的数据计算,都是基于RDD对象来进行的——依赖RDD对象内置的成员方法(算子)。。
(1)map
map算子:基于接收到的处理函数将RDD对象的数据一条条处理,并返回新的RDD。

//示例:map算子接受一个处理函数对RDD内的元素逐个处理


(2)flatMap
flatMap算子:对rdd执行map操作,然后进行解除嵌套操作。

//示例:flatMap算子计算逻辑同map,比mao多了解除一层嵌套的功能


(3)reduceByKey
功能:针对KV型(二元元组)RDD,自动按照key分组,然后根据提供的聚合逻辑,完成组内数据(value)的聚合操作。
注意:reduceByKey中接受的函数,只负责聚合,不理会分组,分组是自动By Key来做的。

//示例1:


案例1:统计文本数据的单词数量


(4)filter
功能:过滤想要的数据进行保留。

//示例:


(5)distinct
功能:对RDD数据进行去重,返回新RDD
//示例:


(6)SortBy
功能:对RDD数据进行排序,基于指定的排序依据。

//示例:全局排序需要设置分区数量为1


案例2:


3.4 数据输出

(1)collect
功能:将RDD各个分区内的数据,统一收集到Drive中,形成一个List对象。
//示例:


(2)reduce
功能:对RDD数据集按照传入的逻辑进行聚合。

//示例:


(3)take
功能:取RDD的前N个元素,组成list返回。

//示例:


(4)count
功能:返回RDD的数据数量,返回一个数字。


(5)saveAsTextFile
功能:将RDD的数据写入文本文件中,支持本地写出,hdfs等文件系统。
(注意,winutils.exe与hadoop.dll的版本与下载的Hadoop安装包版本一定要一致)

//示例:

saveAsTextFile默认将数据分区写入,分区数量即电脑的核心数。

可以设置写入到一个文件当中:

//示例:


3.5 综合案例
首先查看文件数据的特点("\t"作为分隔符),先划分,再操作。



4 Python高阶
4.1 闭包
(1)什么是闭包
问题:通过全局变量 account_amount来记录余额,尽管可以实现我们的功能,仍存在问题:
- 代码在命令空间上不够简洁
- 全局变量有被修改的风险(别的代码导入此包时可以修改)
闭包:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。

//示例1:logo是外部函数创建的临时变量,在全局是无法访问到的,但是对于内部函数 inner() 来说作为外部变量,可以一直访问到。



(2)nonlocal关键字
需要使用 nonlocal 关键字修饰外部函数的的变量才可以在内部函数中修改它。
//示例2:修改外部函数变量的值,若不用nonlocal则表示新建一个Inner的内部变量,但是下面示例中没有声明 num1 变量因此报错。

//示例3:


(3)闭包注意事项
优点:
- 无需定义全局变量即可实现通过函数,持续的访问,修改某个值
- 闭包使用的变量用于所在函数内,难以被错误调用修改
缺点:由于内部函数下持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存。(不明显)
4.2 装饰器
(1)什么是装饰器
装饰器:其实也是一种闭包,功能是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。

//示例:


4.3 设计模式
设计模式:是一种编程套路,可以极大地方便程序的开发。最常见、最经典的设计模式,就是面向对象。
除了面向对象之外,在编程中也有很多既定的套路方便开发,我们称之为设计模式:
- 单例模式、工厂模式
- 建造者、责任链、状态、备忘录、解释器、观察者、中介、模板、代理模式
- ...
(1)单例模式

单例模式(Singleton Pattern):一种常用的软件设计模式,其主要目的是确保一个类只有一个实例存在。在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
- 定义:确保一个类只有一个实例,并提供一个访问它的全局访问点
- 适用场景:当一个类只能有一个实例,而客户可以从一个众所周知的访问点访问它时。
单例的实现模式:
设计模式是一种风格/写法,使用特定的风格得到特定的效果。单例模式对一个类获取唯一实例对象,持续复用它,可以节省内存、节省创建对象的开销。
(2)工厂模式
当需要大量创建一个类的实例时,可以使用工厂模式。
即,从原生的使用类的构造创建对象 → 基于工厂提供的方法创建对象。
优点:
- 大批量创建对象时有统一的入口,易于代码维护
- 当发生修改,仅修改工程类的创建方法
- 符合现实世界的模式,即由工厂来制作产品(对象)

4.4 多线程
(1)进程、线程
现代操作系统(MacOS、UNIX、Linux、Windows等),都支持“多任务”的操作系统。
进程:便称运行在系统之上的一个程序为一个运行进程 ,并分配进程ID方便系统管理。
线程:一个进程可以开启多个线程,执行不同的工作,是进程的实际最小工作单位。

注意事项:
进程之间是内存隔离的,即不同的进程拥有各自的内存空间。
线程之间是内存共享的,线程是属于进程的。

(2)并行执行
并行执行:同一时间做不同的工作。
进程之间就是并行执行的,操作系统可以同时运行多个程序——多任务并行执行。
线程也可以并行执行——多线程并行执行。
(3)多线程编程

//示例:

需要传参的话可以通过:
- args参数通过元组(按参数顺序)的方式
- kwargs参数通过字典的形式
//示例:

4.5 网络编程
(1)Socket
socket(套接字):是进程之间的一个通信 工具,进程之间要进行网络通信需要Socket。
Socket 负责进程之间的网络数据传输,好比数据的搬运工。


(2)服务端编程

//示例:
(2)客户端编程

//示例:

4.6 正则表达式
(1)正则表达式
正则表达式(规则表达式-Regular Expression):使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。
比如,验证一个字符串是否符合条件的电子邮箱地址。相比于使用 if else 做判断简洁高效。
Python正则表达式,使用 re 模块,并基于 re模块中三个基础方法来做正则匹配。分别是:match、search、findall 。
(2)re模块的三个主要方法
① re.match(匹配规则,被匹配字符串)
从被匹配字符串开头进行匹配,成功返回匹配对象,不成功返回 None.
② re.search(匹配规则,被匹配字符串)
全局匹配,匹配第一个命中项,不成功返回 None.
③ re.match(匹配规则,被匹配字符串)
全局匹配,匹配所有命中项,不成功返回 None.(返回值是list)
//示例:


(3) 元字符匹配

//示例:

其他匹配:


//示例:

4.7 递归


//示例:







174

被折叠的 条评论
为什么被折叠?



