加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python从零单排!按照这进度!不出两月我就能拿到8K了!

发布时间:2020-12-17 00:43:28 所属栏目:Python 来源:网络整理
导读:既然Python是一门面向对象的编程语言,那么今天我们着重讲一下如何处理"对象" 一、文件 之前接触到的一系列数据值,都是在内存中的,也就是不会永久保存。当数据量非常小的时候,当然可以每次都临时定义生成,但如果数据量稍大,这样处理就不合适了。结合我

既然Python是一门面向对象的编程语言,那么今天我们着重讲一下如何处理"对象"

一、文件

之前接触到的一系列数据值,都是在内存中的,也就是不会永久保存。当数据量非常小的时候,当然可以每次都临时定义生成,但如果数据量稍大,这样处理就不合适了。结合我们平时使用电脑的习惯,其实大部分数据都是以“文件”式存在于硬盘里的,比如.avi,?.torrent,.exe,?.txt等。

1.open函数

利用python的内置函数open()可以执行打开文件的操作,对于一些python的数据科学库像numpy和panda有自己的文件读取函数。下面我们通过一个简单的例子展示一下:

open("hope.txt","r")

open函数与我们之前介绍的print函数不同,接受了两个参数,参数之间以逗号隔开。

  • "hope.txt":目标文件名,字符串类型;
  • "r":打开模式,"r"代表“只读”(read)。另有"w"表示“写入”(write),"a"表示“增补”(append)。
  • 但是open函数并不会显示文件的内容,比如看下面的这个例子:

当你运行这段代码将会得到

<_io.TextIOWrapper name='taijian.txt' mode='r' encoding='UTF-8'>

根据输出可见,f变量并不是文本内容,其类型是TextIOWrapper,内容包含文件名name,打开方式mode和编码格式encoding三个参数。这里我们只指定了前两个参数,所以encoding就是默认值UTF-8,如果想要得到文件的内容,还有进一步工作要做。

2.read函数

为了得到文本内容,我们需要调用.read()函数,就像这样。

novel = f.read() 同时运用len函数可以统计文件内的字数

二、函数

函数就是一系列语句的集合封装,这样每次就不需要重复写出所有语句,只需要通过函数的名称调用就方便多了。其实我们已经多次用到函数了,比如?type()函数,我们给它一个“输入”,比如一个数字?1,函数会返回这个数字对应的类型(type)给你。这里会介绍如何定义自己的函数,来实现更加灵活的功能。

我们以口袋妖怪威为例,数据来源于Kaggle。

  • #:口袋妖怪编号
  • Name:你的名字
  • Type1:第一属性,决定防御抗性
  • Type2:第二属性
  • Total:基本属性值之和
  • HP:血
  • Attack:攻
  • Defense:受
  • SP Atk:特攻
  • SP Def:特受
  • Speed:速度
  • Generation:登场的作品代数
  • Legendary:是否为传说精灵

为了便于读取,我们将所有的数据存为csv文件。Pokemon.csv

csv(comma separated values)是结构化数据,同一行的值之间以逗号(,)分隔,行之间用换行符(?)分隔。(注意n之前的转移符

练习题一

为便于处理,我们将数据集转换为二维数组(嵌套列表),这也是对之前“循环”、“列表”等内容的回顾。当然,如果有Pandas等数据科学库的帮助,这些过程可以更加简洁,这里主要是为了加强编程练习。

文件pokemon.csv已经打开并存为变量f

  • 读取文件内容,赋值给data
  • data按行分割成列表,赋值给mons
  • 遍历mons的每一行,按逗号分割,添加到mons_data
  • mons_data应是二维嵌套列表,每个元素都是一只口袋妖怪的属性列表。

答案:

data = f.read()
mons = data.split('
')
for i in mons:
 mons_data.append(i.split(','))

如果有一个函数,只要指定目标csv文件,就可以直接生成二维数组,岂不美哉?但是Python并没有内置这样的功能,那就需要定义自己的函数。函数定义的关键字是def,也就是"define"的缩写。定义语句格式与for循环有些类似,同样包括语句头和语句体,需要特别注意的仍然是语句头结尾的冒号(:)和语句体的缩进:

我们希望能够有一个函数,读取指定的csv文件,返回经过切分的二维数组,那么这个函数应该是这样的:

  • 函数名:tokenize,想要调用这个自定义函数的时候,直接写tokenize()即可,就像我们使用print(),?type()一样。
  • 参数:想要处理的数据文件名,对于Dota2的例子,就是dota2_heroes.csv
  • 函数体:也就是上一节所写的代码段,为了函数更加通用,我修改了部分变量名称。
  • 返回值:关键字return之后是经过函数得到的结果。

三、类和对象

(class)描述和规范了某一类事物的特征和行为。比如有一个类,叫“车”。那么这个类就描述了一种物体的特征和行为,特征比如有轮子,行为比方说会移动。车这个类好比一张蓝图,各种各样的车都是根据车的基本特征设计制造出来的。

“类”的概念是抽象的,我们虽然修过了一辆辆车,但不会真的关注“车”作为类的本质等哲♂学命题。具体到某一辆车就是对象(object),对象是类的实例,如果说类是蓝图,对象就是把一张蓝图绘到底。

Python是一门面向对象的编程语言,可以说在Python中所有东西都是对象(你们有对象了吗?),比如int,?str,?bool这些我们已经见过的数据类型,甚至模块、函数,全都是对象。这个按照蓝图造车的过程,就叫类的实例化。你拥有的车就是类的实例,即对象。所以说,要有对象,首先要定义类。

如何定义一个类呢?

和定义函数一样,定义类也是一个“语句头+语句体”组成的复合语句,用到的关键字是class。定义一个名为?Creature?的类,其语法结构如图:

类的名称跟在class关键词之后,和冒号(:)之前。类用实例变量(instance variable)来存储数据,以及方法(method)来定义行为。关于超类的概念不必惊慌,下一章就会详细讲解,没有超类的情况下,类名之后的括号也可以省略。

为了使定义的过程看上去尽可能简单,语句体中只有一个 pass,也就是什么也不做的意思。

一般的类还会包含:

  • 方法:用来定义行为
  • 实例变量:存储数据

什么是方法?

方法描述了对象的行为,本质上它是定义在类中的函数。调用对象方法的过程,和我们之前在函数一章中调用函数是相似的,比如对于字符串对象,想要调用.split()方法来进行分割(#号后面的就是输出结果):

在之前的章节习题中,我们已经接触过了类的相关的用法。假设现有类Person,含有了一个方法,叫做?whoami,用于返回对象的名字。那我们调用这个方法的过程是这样的:

其实上面这个程序?Trevor = Person()?这一行,不管你把?kaiser?改成什么,输出的都是我的名字。显然,这个?whoami?方法是有问题的。

如果你把类语句体里的?'Trevor'?改成别的内容,那就会输出别的内容。但我们需要的是输出这个?Person?对象的名字,大家的名字都不相同,怎么做呢?这就需要类 Person 能够存储数据,也就是要有实例变量。

实例变量

介绍实例变量之前,先介绍一下初始化器initializerconstructor)。Python 的类都自带有一些特殊的方法,它就是其中之一。

初始化器的“初始化”,指的是对象的初始化,其实也就是类的实例化。如果我们要在实例化Person?的时候,给它一个名字,可以加在实例化时的括号里。

初始化器的方法名长这样:__init__。别怕下划线,这只是为了标明些方法的特殊性。

定义初始化器和平时定义方法是一样的,我们需要把这个人的名字传入到初始化器。那么初始化器应该这样定义:

哦,在这停顿!这里出现的?self.name,就是我们的实例变量。实例变量的用途(第三次提起)是存储数据,那么这里我们是存储了名字。这样实现过初始化器之后,就可以实例化Person?,并赋予它一个名字了。

Python的所有方法,其第一个参数都是self,这个参数指代的是调用该方法的对象。调用方法时,不需要传入self参数,Python解释器会自动完成这一步。对象的实例变量可以在生成后修改,但是并不推荐这样做,所以实践当中最好隐藏变量对外的接口。在实际的开发中经常会遇到这种情况:我们不希望对象的某些实例变量被访问和修改。为此需要隐藏这些实例变量,即定义私有实例变量。在Python中,以两条下划线(__)开头的变量,就是私有实例变量。方法同样可以定义为私有,也是以两条下划线(__)开头。

四、继承与派生

继承(inheritance)使得开发者可以先创建一个较为宽泛的类,再逐步拓展细化成为更具体的类,就好比先定义“动物”,再继承得出“哺乳动物”。

通过继承,我们可以访问所有的数据域(实例变量)和方法,此外还可以加入我们自己的变量和方法。继承提供了一种组织代码的方式,这样就不用每次都从零重写,极大地提高了编码效率,也是一种更好的代码风格。如果类Y继承了类X,那么X叫作“超类”(super class)或“基类”(base class),Y叫作“子类”(subclass)或“派生类”(derived class)。其实就是父子关系:

创建子类的语法:

之前我们定义过的类如Person,类名之后都是没有括号的,因为他们并没有继承其他超类。

与C#,Java这些语言不同,Python允许多重继承,也就是可以认好几个爹:

最后,今天来一波毒鸡汤

小编在此谢谢大家的观看!Python很容易学!所以小编有弄一个交流,互问互答,资源共享的交流学习基地,如果你也是Python的学习者或者大牛都欢迎你来!?:548+377+875!一起 学习共同进步!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读