【python补漏】2 进阶

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 递归

    //示例:

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    乔江seven

    你的鼓励将是我创作的最大动力!

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值