目录
前言
就我个人而言,Python对于日常生活的影响之深已经涉及到了几乎所有方方面面.在这个系列课程中,我将带领各位一起走进Python的世界,体验数字世界.
教学安排
在此系列课程中,我将不定期持续更新Python相关的文章.同时,为了节省时间,省去了一些过于基础的内容,如变量/函数等,若有需要可以留言询问.本课程教学安排已发布在 目录展示 中,有需要可以前去查看.
第1章 Python入门
1.1文本文件IO处理
1.1.1 with函数
在Python启蒙是时候,我们知道Python中的变量可以用系统内存来临时地存储数据,也大致知道了可以将一些数字放在一个text.txt
文本文件中来长期储存.我们一般用的都是:
r=open("text.txt","r",enconding="utf-8")
doSome()
r.close()
但这样操作会凭空多出一句r.close()
,有时忘记了还有可能造成栈溢出,因此我们可以使用如下内容:
with open("text.txt","r",encoding="utf-8") as r:
doSome()
这样在with
下缩进的代码执行结束后就会自动腾出r
的空间,此时变量r
仍然以读取器形式存在,但其相关命令不可再调用,否则报错:
ValueError: I/O operation on closed file.
这意味着text.txt
已经不再消耗内存.
而with
函数也可以作用在一些其他变量中,但这里先不提及,在第二章中我们自会提到.
1.1.2 read模式命令复习
虽说read模式的三大命令read
,readline
, readlines
在Python启蒙中一定已经被提到,但它们确实极其容易记混.So,让我们再来回顾回顾…
载入text.txt
:
The first line
The second line
读取:
with open("text.txt","r",encoding="utf-8") as r:
a=r.read()
b=r.readlines()
c=r.readline()
结果:
a:"The first line\nThe second line"
b:["The first line\n","The second line"]
c:"The first line"
read
和readlines
方法没啥好讲的,一个返回单str
,一个返回以\n
结尾的str
列表.那readline
呢?好好回忆回忆,readline
可以读取单行/单字符,也可以读取从头开始的__hint
个字符.
1.2面向对象编程
1.2.1 什么是面向对象
从第一次学Python一来,我们就知道Python有很多变量的类型,如int
float
complex
str
bool
list
dict
tuple
_io.TextIOWrapper
Stack
Queue
等等.我们来看一个例子:
i=[{"1":"a","2":"b"},{1:"c",2:"d"},"e",3]
这个列表中包含了两个Group
和两个Simple
变量,我们需要一个特定的容器来储存这些信息,所以我们有了 类(class) 这个概念.一个类包含了一些固有属性和一些自身属性.
再举个例子.我们要存储三个人的信息:
名称 | 年龄 | 工作岗位 | 工作时长·小时/天 | 性别 |
---|---|---|---|---|
A | 10 | student | 8 | F |
B | 20 | worker | 9 | M |
C | 30 | teacher | 12 | F |
如果我们按照之前的方法,那个么应该是:
A=[10,{"student":8},"F"]
B=[20,{"worker":9},"M"]
C=[30,{"teacher":12},"F"]
虽说也没啥大问题,但不总觉得有些代码浪费吗?要多套很多层字典才能放下他们.但我们会发现打代码的时候费时费力,而且当数据量大时很难完成每个人的信息记录.但我们会发现他们都有共同的属性:年龄 职业 工作时间 性别.
所以我们可以创建一个类来快捷的保存他们.
class People(object):
#类名为People 继承(后面提到)Object类,即People为新式类
def __init__(self,age,job,work_time,sex):
#__init__函数为初始化函数,必须有该函数才能创建类和对象
#这里四个变量即为他们的固有属性
self.age=age
self.job=job
self.work_time=work_time
self.sex=sex
#将类People下的对象(也就是每一个个体)的属性赋值
def ppr(self):
#定义People类下的独有函数,self即为一个People类下的对象,有age,job等四个属性
print(self.age)
A=People(10,"student",8,"F")
B=People(20,"worker",9,"M")
C=People(30,"teacher",12,"F")
这样一来,我们虽看起来多写了很多东西,但当数据量较大时非常有利于储存.当我们在类内(也就是缩进块内)时可以直接用self
调用People
类下的对象及其属性.在外部调用方法时,需要加入类名.
In[0]: People.ppr(A)
Out[0]:10
1.2.2 类的继承
如果我们已经创建了类People
,且创建好了其下对象的四个固有属性age
,job
,work_time
,sex
,那要是现在有两个人D/E,还有一个新的属性friend
呢?如果要单独为D和E新创建一个类,那么前四个属性和方法也要重写,费时费力.我们可以直接去继承People
类的属性,然后新建类.
class DE(People):
#新建类,但是继承People
def __init__(self,age,job,work_time,sex,friend):
super().__init__(age,job,work_time,sex)
#用super方法直接调用父类People的属性
#如果没有这一步还要手动打一遍self.age=age...
self.friend=friend
#创建DE类的特有属性friend
def pr(self):
print(self.friend)
D=DE(40,"none",0,"M",3)
E=DE(50,"player",5,"M",5)
这样就创建了D和E两个有属性friend
的对象.然后我们调用:
In[1]: DE.pr(D)
Out[1]:3
1.2.3 多继承
上一节我们讲了一个类可以继承另外一个类的属性,那可不可以继承两个呢?重复呢?
先例看看同时继承两个类的情况.
class cA(object):
def __init__(self,a):
self.a=a
def AA(self):
print(self.a)
class cB():
def __init__(self,b):
self.b=b
def BB(self):
print(self.b)
这两个类cA
和cB
一个是新式类,一个是老式类,分别有属性a
和属性b
.那多继承…
class cC(cA,cB):
def __init__(self, a,b):
super().__init__(a,b)
def cp(self):
print(self.b)
F=cC(1,2)
是这样吧?哎,不对!报错如下:
TypeError: __init__() takes 2 positional arguments but 3 were given
这是由于super
方法只能调用第一个父类中的属性a
,因此这样改就不会报错:
class cC(cA,cB):
def __init__(self, a,b):
super().__init__(a)
self.b=b
def cp(self):
print(self.b)
F=cC(1,2)
那这个继承下来的cB
有何作用呢?可别忘了在这个类下定义的方法,这个方法任然是可以调用的:
In[2]: cB.BB(F)
Out[2]:2
1.2.4 常用继承类:Exception
在抛出错误时(还不知道什么是错误?没关系,马上讲!在2.1中我们就会讲到.)我们会用到如下代码:
raise ValueError("错误了")
这样可以自定义错误内容.但如何自定一个错误呢?换句话说,我想有一个自己的错误MyValueError
呢?这里就要用到错误类Exception
了.
class MyValueError(Exception):
def __init__(self):pass
#错误类没有属性,但必须进行__init__初始化.因此直接pass即可
def __str__(self):
print("我的一个错误")
#错误内容
此时直接抛出即可.
raise MyValueError
报错:
Traceback (most recent call last):
File "s:/cl2.py", line 27, in <module>
raise MyValueError
我的一个错误
__main__.MyValueError: <exception str() failed>
到这里面向对象编程初步就学完了.下期再见~