Hetian lab day 5 Python 编程进阶(下)

22 篇文章 0 订阅
8 篇文章 0 订阅

Part 1 Python 编程进阶(下)课后题

在这里插入图片描述
【解析】Python内置类属性

  __dict__ : 类的属性(包含一个字典,由类的数据属性组成)

  __doc__ :类的文档字符串

  __name__: 类名

  __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块   mymod中,那么className.__module__ 等于 mymod)

  __bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

在这里插入图片描述
【解析】 正则表达式特殊字符类

字符含义
.匹配除“\n”外的任何单个字符。如果要匹配包括“\n”在内的任何字符则使用[.\n]模式
\d匹配一个数字字符,等价于[0-9]
\D匹配一个非数字字符,等价于[^0-9]
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]
\S匹配任何非空白字符,等价于[^\f\n\r\t\v]
\w匹配包括下划线的任何单词字符,等价于[A-Za-z0-9]
\W匹配任何非单词字符。等价于[^A-Za-z0-9]

在这里插入图片描述
【解析】XML是指可扩展标记语言eXtensible Markup Language。它被设计用于存储和传输数据。
python有三种方法解析XML,SAX,DOM,以及ElementTree。

1.SAX (simple API for XML )

  python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

2.DOM(Document Object Model)

  将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

3.ElementTree(元素树)

  ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

Part 2 Python 编程进阶(下)实验操作

实验步骤一 Python面向对象

实验代码 类的创建

#!/usr/bin/python
#coding=utf-8
class Employee:
    empCount=0
    def __init__(self,name,salary):# 一种特殊的方法,类的构造函数,一旦创建类的实例便会调用这种方法。
        self.name=name
        self.salary=salary
        Employee.empCount+=1
    def disCount(self):
        print "total employee:" % Employee
    def disEmployee(self):
        print "name:",self.name,"salary:",self.salary
emp1=Employee("Zara",2000)#创建了一个类的实例
emp2=Employee("Liza",4000)#又创建了一个类的实例
emp1.disEmployee()
emp2.disEmployee()#用于访问对象的属性、方法
print "total Employee:",Employee.empCount
# Python内置类的属性
print "Employee.__doc__",Employee.__doc__#类的文档字符串
print "Employee.__name__",Employee.__name__#类的名字
print "Employee.__module__",Employee.__module__#类定义所在的模块
print "Employee.__bases__",Employee.__bases__#类的所有父类构成元素,包含一个由父类构成的元组
print "Employee.__dict__",Employee.__dict__#类的属性,由类的数据属性构成

实验结果

在这里插入图片描述

实验代码 对象销毁(垃圾回收)

# Python对象销毁(垃圾回收)
#当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时,
#也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。
# 但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。
class Point:
    def __init__(self,x=0,y=0):
        self.x=x
        self.y=y
    def __del__(self):
        class_name=self.__class__.__name__
        print class_name,"destroyed"
pt1=Point()
pt2=pt1
pt3=pt1
print id(pt1),id(pt2),id(pt3)
del pt1
del pt2
del pt3

实验结果

在这里插入图片描述

实验代码 类的继承

#类的继承
#面向对象编程可以通过继承实现代码的重用
class Parent:
    parentAttr=100
    def __init__(self):
        print "call the baseclass constructor."
    def parentMethod(self):
        print "call the baseclass method."
    def setAttr(self,attr):
        Parent.parentAttr=attr
    def getAttr(self):
        print "parent attribute:",Parent.parentAttr
class Child(Parent):
    def  __init__(self):
        print "call the subclass constructor."
    def childMethod(self):
        print "call the subclass method."
c=Child()
c.childMethod()
c.parentMethod()
c.setAttr(200)
c.getAttr()

实验结果

在这里插入图片描述

实验代码 方法重写

class Parent1:
    def myMethod(self):
        print "call the baseclass method."
class Child1(Parent1):
    def myMethod(self):
        print "call the subclass method."
c1=Child1()
c1.myMethod()

实验结果

在这里插入图片描述

实验代码 运算符重载

# 运算符重载
class Vector:
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def __str__(self):
        return 'Vector (%d,%d)'%(self.a,self.b)
    def __add__(self,other):
        return Vector(self.a+other.a,self.b+other.b)
v1=Vector(2,10)
v2=Vector(5,-2)
print v1+v2

实验结果

在这里插入图片描述

实验代码 类属性与方法

# 类属性与方法
#1.类的私有属性  __private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
# 2.类的方法 在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数
# 3.类的私有方法  __private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods
class JustCounter:
    __secretCount=0 #private
    publicCount=0 #public
    def count(self):
        self.__secretCount+=1
        self.publicCount+=1
        print self.__secretCount
counter=JustCounter()
counter.count()
counter.count()
print counter.publicCount
# print counter.__secretCount#error如果执行这句话会报错,因为不能直接访问私有变量
print counter._JustCounter__secretCount

实验结果

在这里插入图片描述

实验步骤二 正则表达式

#!/usr/bin/python
#coding=utf-8
#re.math(pattern, string, flags=0) 
# 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
#patter, 匹配的正则表达式
#string,要匹配的字符串
#Flags,标志位,用于控制正则表达式的匹配方式,如是否区分大小写、多行匹配等
import re
print "match 匹配的表达式"
print(re.match('www','www.runoob.com').span())
print(re.match('com','www.runoob.com'))
line="Cats are very cute and I love them,I want to be their friend."
matchObj=re.match(r'(.*)are(.*?).*',line,re.M|re.I)
if matchObj:
    print "group(num)匹配的表达式"
    print "matchObj.group():",matchObj.group()
    print "matchObj.group(1):",matchObj.group(1)
    print "matchObj.group(2):",matchObj.group(2)
else:
    print "No match!!"
# re.search(pattern,string,flags=0)
#  扫描整个字符串并返回第一个成功的匹配。
print "search 扫描匹配的表达式"
print(re.search('www','www.runoob.com').span())
print(re.search('com','www.runoob.com').span())
# 检索和替换
# re.sub(pattern, rep1, string, max=0)
# 返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。
# 如果模式没有发现,字符将被没有改变地返回。
# 可选参数 count 是模式匹配后替换的最大次数;
# count 必须是非负整数。缺省值是 0 表示替换所有的匹配。
phone="2004-959-5559#This is a phone number"
num=re.sub(r'#.*$',"",phone)
print "phoneNumber:",num
num=re.sub(r'\D',"",phone)
print "phoneNumber",num
#特殊字符类
# \s匹配一个数字字符等价于[0-9]
# \D匹配一个数字字符等价于[^0-9]
# \s匹配任何空白字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v]
# \S匹配任何非空白字符,等价于[^\f\n\r\t\v]
# \w匹配包括下划线的任何单词字符,等价于[A-Za-z0-9]
# \W匹配任何非单词字符,等价于[^A-Za-z0-9]

实验结果

在这里插入图片描述

实验步骤三 XML解析

#!/usr/bin/python
#coding=utf-8
from xml.dom.minidom import parse
import xml.dom.minidom

DOMTree=xml.dom.minidom.parse("movie.xml")
collection=DOMTree.documentElement
if collection.hasAttribute("shelf"):
    print "Root element:%s"%collection.getAttribute("shelf")

movies=collection.getElementsByTagName("movie")

for movie in movies:
    print "****Movie*****"
    if movie.hasAttribute("title"):
        print "Title:%s"%movie.getAttribute("title")
    type=movie.getElementsByTagName('type')[0]
    print "Type:%s"% type.childNodes[0].data
    format=movie.getElementsByTagName('rating')[0]
    print "Format:%s"%format.childNodes[0].data
    rating=movie.getElementsByTagName('rating')[0]
    print "Rating:%s"%rating.childNodes[0].data
    description=movie.getElementsByTagName('description')[0]
    print "Description:%s"%description.childNodes[0].data

实验结果

在这里插入图片描述

Part 3 分析与思考

1) Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语 言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如 C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

2)re.match与re.search的区别?
match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值