面向对象与正则表达式的学习(自动更正,和代数运算)

今天我来介绍一下最近在学习的一些内容:面向对象与正则表达式

对于我来说,前者相对于好理解并且比较好学习并掌握,但后者可能由于它的繁杂的表达式和浩如烟海的标识符令我有些难以掌握,但我依然有信心把它学习好了!

 

先来介绍一下我们的面向对象!!

先是有几个专有名词的理解:

面对对象编程(OOP:object oriented programming): 是一种程序设计范型,同时也是一种程序开发的方法,实现OOP的程序希望能够在程序中包含各种独立而又相互调用的对象,没一个对象又都应该能够接受数据、数据处理并将数据传达给其他对象,因此每一个对象都可以被看做一个小型的机器,而整个程序块系统就是由这些小的机器相互协助、组合构建起来的。

面对对象分析(OOA:objecet ariented analysis):即根据抽象关键的问题域来分解系统

面对对象设计(OOD:object oriented design):是一种提供符号设计系统的面向对象的实现过程,他用非常接近时机领域属于的方法吧系统构造成现实世界的对象。

类(class):告诉Python创建新类型的东西

对象(object):两个意思,即最基本的东西,或者某样东西的实例

实例(instance):这是让Python创建一个类时得到的东西

我们的python再玩法上其实有很多,当然想要编辑更多强大的代码实现更多的功能,我们必须学习OOP编程技能,这其中我们不仅需要知道他们各自的含义功能,还要明白语法以及各自的使用方式,情况!

下面我们来详解一波:

  • 对象(object):对象是数据和操作数据的方法的结合   

    对象之间的通信:对象之间进行通信的结构叫做消息,当一个消息发送给某个对象时。消息应该包含下面几种信息:

    ①接收消息的对象名(目的对象名)

    ② 接受对象去执行某种操作的信息(调用方法名)

    ③发送给该对象参数,参数可以使该对象有的变量名,或者是所有对象都知道搜的全局变量名

    ④发送给该对象的消息名(源消息名)

  • 类(class):对象的抽象是类,类的具体个性化就是对象    

    类的结构:在客观世界中有若干类,这些类之间有一定的结构关系,通常有下面两种主要结构关系:

    ①一般/具体结构称为分类结构,也可以说是is-a关系。用来描述在继承中子类与弗雷的关系,即一个派生类的实例化对象是其副类的一个例子,所以是is-a关系

    ②整体与部分结构称为组装结构,他们之间的关系是has a 关系。组合是是实现继承的方式之一,在组合继承中,一个子类可以有多个父类,即一个自类has a 一个父类

我们知道一个最主要的知识点就是:面向对象的三要素!!

面向对象的三要素:
1.封装:

概念:描述了对数据信息进行隐藏的观念,他对数据属性提供接口(接口函数)和访问方法。在类的设计时,微数据提供此相应的接口,一面客户程序通过不规范的操作来存取封装的属性。

我们一般用语法“def”定义封装内部的函数

意义:我们之前统一的认知是“程序=数据结构+算法”,现在加上简单的封装之后,我们可以理解为“程序=对象+消息”

2.继承:

概念:继承令不同类之间拥有了一定的结构与关系。

 

类之间的关系:①通过继承创建的新类称为“子类”或“派生类”

 

                         ②被继承的类称为“基类”、“父类”或“超类”

这里又有一些特有的名词概念需要消化:

泛化:表示所有子类与其父类及祖先类有着一样的特点
特化:描述所有得子类的自定义,也就是说,什么属性让它与其父类一同。
实现继承的方式:可以通过继承和组合来实现,其中继承又有实现继承和可视继承,组合又有接口继承和纯虚类
实现继承:子类的属性和方法完全继承于父类
可视继承:子类继承父类的外观方法
接口继承:子类的属性明和方法名继承于父类,但是具体的属性值和方法实现由子类重写
多重继承:即组合继承,在java和c#中使用接口概念来实现多重继承的效果,而Python中定义类的时候,可以直接继承多个弗雷来实现多重继承。在实现多重继承时,如果继承的多个父类中均有名称相同的方法时,需要注意继承的顺序。

 

3.多态:

概念:多态概念指出了不同对象如何通过他们共同的属性动作来操作以及访问,而不需要考虑他们的具体的类,多态表明了动态绑定(运行时)的存在,允许重载及运行时类型确定的验证。

多态的作用:实现接口的重用,保证了在类发生继承或派生时,我们仍然能正确调用这些相关类的实例化对象的属性和方法。

 

面向对象三要素:

 

 

python中以下划线开头的变量名特点:

公有属性:类内外都可以被访问

私有属性:只能被类内函数调用,以'__'开头

内置属性:系统在定义类时默认的添加,命名格式为'__X__'

让我们来看一些例子:

1. def __init__(self):       #此类定义是构造一个函数,在程序启动时自动调用,一般作为实例化对象的初始化

2. def __inaccessible(self):    #私有方法,不能在类外部被访问;方法名以'__'开头(只有一个“_”)

3. if __name__ == '__main__':    #运行的主函数下,这个是系统在定义类时默认的添加

这是我目前在学习的tkinter库时的一段学习代码(来源于网络),里面的形式就是运用了定义类并封装的方法,面向对象进行程序设计。

Ok!面向对象的内容基本上就是这样的啦~我们进入下一个板块!

 通过建立一个三维向量组,我们可以对他们进行一些数乘运算(有向量加法、减法、乘法和叉乘)

下面是代码:

class vector3:
 def __init__(self, x_ = 0, y_ = 0, z_ = 0): #构造函数
  self.x = x_
  self.y = y_
  self.z = z_
 def __add__(self, obj): #重载+作为加号
  return vector3(self.x+obj.x, self.y+obj.y, self.z+obj.z)
 def __sub__(self, obj): #重载-作为减号
  return vector3(self.x-obj.x, self.y-obj.y, self.z-obj.z)
 def __mul__(self, obj): #重载*作为点乘
  return vector3(self.x*obj.x, self.y*obj.y, self.z*obj.z)
 def __pow__(self, obj): #重载**作为叉乘。不好,偏离了常理上的意义,可以考虑重载其他符号,或者直接写函数。
  return vector3(self.y*obj.z-obj.y*self.z, self.z*obj.x-self.x*obj.z, self.x*obj.y-obj.x*self.y)
 def __str__(self): #供print打印的字符串
  return str(self.x)+','+str(self.y)+','+str(self.z)
v1 = vector3(1, 2, 3)
v2 = vector3(0, 1, 2)
print (v1 + v2)
print (v1 - v2)
print (v1 * v2)
print (v1 ** v2)

通过定义v1,v2可以对两个向量进行上述运算(详见课本)

结果:

 

正则表达式:

通过简单学习了正则表达式,我遇到了这样一道题:

编写一个程序(类),用户输入一段英文,然后输出这段英文中所有长度为3个字母的单词; 并且如果单词如果有连续重复了2次,只输出一个【例如:This is is a desk,程序输出 This is a desk】。(提示,有re,正则匹配来做)

怎么解决呢?

emmmm似乎用正则我还没办法有效解决,所以我利用了简单的语句结合之前的所学编写了以下代码:

import re
a=[]
words=input("Input the words:")
l=re.split('[\. ]+',words)  
i=0   
for i in l:
    if len(i)==3: 
        if i not in a:
            a.append(i)
    else:
        continue
for k in range(0,len(a)):
    print(a[k],end=' ')

结果:

结果还不赖!

虽然对于正则表达式的应用还是比较少,但是似乎可以解决就是有用的代码!

先酱!

posted @ 2019-04-16 23:42  黑棱镜  阅读(240)  评论(0编辑  收藏  举报