task5 python类、对象、正则表达式等

1)类和对象:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。https://www.liaoxuefeng.com/wiki/897692888725344/923030500932512

a)类的创建,class 和 大写字母开头的类的名称,紧接着(object),也可以单独一个(),表示类继承于(object),其中类中,方法之外定义的属性,为类属性。

b)实例的创建则是类名+()实现,同时,通过构造方法可再给实例添加属性,如范例一。

c)关于类的访问权限问题,范例二-A、B、C。另外,还有类的特性,静态方法,类方法等,可以参考这个链接的内容:https://www.cnblogs.com/wangyongsong/p/6750454.html

d)继承和多态:范例四

2)正则表达式:用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,可以认为其匹配该规则,https://www.liaoxuefeng.com/wiki/897692888725344/923056128128864

3)re模块:Python中对正则表达式的操作库,在字符串前加上r可以避免Python本身对字符串转义的问题,(注意积累经验,例如python中replace是对字符串的操作,而不支持正则表达式,需要用到re模块中的sub)
范例五

4)http请求:在python中主要借助的是requests模块进行网页内容的获取,想以关于网站的构建的相关内容,可以参考:http://www.w3school.com.cn/

范例一:类的属性访问权限

#对于类的使用,包括实例属性,类属性
class Calculator:
    def __init__(self):#使用self这个单词是习惯,init(构造方法)只能用一次
        self.name = 'Good calculator'#实例属性,外部可调用
    def add(self,x,y):#实例方法
        result = x + y
        print(result)
    def minus(self,x,y):
        result = x - y
        self.mm = 14#外部无法调用
        print(result)
    def times(self,x,y):
        print(x * y)
    def divide(self,x,y):
        print(x / y)
#创建实例
cal = Calculator()
cal.choice = '-minus_operation'#实例属性
print(cal.name,cal.choice)
# print(Calculator().minus(21,5).mm)#mm无法调用
cal.minus(21,5)#实例名称.实例方法进行方法调用

运行

Good calculator -minus_operation
16

范例二-A:类的访问权限,单下划线开头的类的属性,类本身和子类可以访问

#类的访问权限
class Swan:
    '''
    天鹅类
    '''
    _neck_swan = '天鹅的脖子很长'  #受保护类的属性
    def __init__(self):
        print("__init__():",Swan._neck_swan)    #访问受保护类型的属性

swan = Swan()   #创建Swan类的实例
print("直接访问:",swan._neck_swan)    #通过实例名访问受保护类型的属性

运行

__init__(): 天鹅的脖子很长
直接访问: 天鹅的脖子很长

范例二-B:双下划线开头的类的属性,类本身可以访问,实例名无法访问,但是可以用 类的实例名.类名 访问

#类的访问权限
class Swan:
    '''
    天鹅类
    '''
    __neck_swan = '天鹅的脖子很长' #私有类型的属性
    def __init__(self):
        print("__init__():",Swan.__neck_swan)   #访问私有类型的属性
    def my(self):
        print("my方法:", Swan.__neck_swan)

swan = Swan()   #创建Swan类的实例
# print("直接访问:",swan.__neck_swan)    #通过实例名访问私有类型的属性,无法访问
print("添加类名后访问:",swan._Swan__neck_swan)
swan._Swan__neck_swan = '脖子不长'    #修改私有类型的属性,但不建议该操作
swan.my()   #私有类型的属性不变
print("修改后:",swan._Swan__neck_swan)    #通过实例名添加类名后访问私有类型的属性

运行

__init__(): 天鹅的脖子很长
添加类名后访问: 天鹅的脖子很长
my方法: 天鹅的脖子很长
修改后: 脖子不长

范例二-C:创建只读的私有属性

#创建只读的私有属性
class TVShow:
    def __init__(self,show):
        self.__show = show
    @property
    def show(self):
        return self.__show  #返回私有属性
tvshow = TVShow("正在播放")  #创建类的实例
print("默认:",tvshow.show)    #获取属性值,且属性值不能修改

运行

默认: 正在播放

范例三:

#创建用于计算的属性
class Rect:
    def __init__(self,width,height): #构造方法
        self.width = width
        self.height = height
    @property
    def area(self):
        return self.width*self.height #计算矩形面积
rect = Rect(800,600) #创建类的实例
print("面积为:",rect.area) #输出面积
# rect.area = 100 #无法进行赋值操作
# print("面积为:",rect.area)

运行

面积为: 480000

范例四:继承和多态(范例转自:https://www.runoob.com/python3/python3-class.html)
关于继承父类的调用方法:https://www.runoob.com/w3cnote/python-extends-init.html

# 类的定义
class People:
    # 定义的基本属性
    name = ''
    age = 0
    __weight = 0 # 定义私有属性,在类外部无法直接进行访问
    def __init__(self, n, a, w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" % (self.name, self.age))
# 单继承示例
class Student(People):
    grade = ''
    def __init__(self, n, a, w, g):
        People.__init__(self, n, a, w)  #调用父类的构造方法
        self.grade = g
    # 覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))

s = Student('ken',10,60,3)
s.speak()
# print(s._People__weight)
# print(s.name)

运行

ken 说: 我 10 岁了,我在读 3 年级

范例五:正则表达式的匹配

import re
text = ''
file = open('C:/untitled/python-attempt path/poem.txt')
for line in file:
    text = text + line
file.close()

result = re.findall(' (a[a-z][a-z]) |(A[a-z][a-z]) ',text)#正则表达式的匹配

final_result = set()#利用集合删掉重复元素
for pair in result:
    if pair[0] not in final_result:
        final_result.add(pair[0])
    if pair[1] not in final_result:
        final_result.add(pair[1])
final_result.remove('')
print(final_result)
print(len(final_result))

运行

{'All', 'ash', 'air', 'all', 'and', 'are', 'And'}
7

范例六:正则表达式匹配特性

import re
ans = re.split(r'\s+', 'a b   c')
print(ans)
ans = re.split(r'[\s\,\;\.]+', 'a,.; b  ,.; c')#斜杠加标点即可把所有符号删除
print(ans)
ans = re.match(r'^(\d+)(0*)$', '102300').groups()#贪婪匹配
print(ans)
ans = re.match(r'^(\d+?)(0*)$', '102300').groups()#非贪婪匹配
print(ans)

运行

['a', 'b', 'c']
['a', 'b', 'c']
('102300', '')
('1023', '00')

范例七:根据网页信息进行爬虫开发

# 爬虫开发
#分析数据加载流程:分析目标数据对应的url
#下载数据:清洗,处理数据;数据持久化
import requests
import re
#目标数据:网站和页面
url = 'http://book.zongheng.com/showchapter/84061.html'#网址,end加eight
#模拟浏览器发送http请求
response = requests.get(url)
#编码方式
response.encoding = 'utf-8'
#目标小说主页的网页源码
html = response.text
# print(html) #观察网页内容
#获取小说的名字
title = re.findall(r'<h1>(.*?)</h1>',html)[0]
#新建一个文件
my_text = open('C:/untitled/python-attempt path/%s.txt' % title, 'w', encoding = 'utf-8')
#获取每一个章节的信息(章节,url)
dl = re.findall(r'<li class=" col-4">(.*?)</li>',html,re.S)
chapter_info = []
#循环每个章节,分别下载
for i in range(len(dl)):
    chapter_info.append(re.findall(r'<a  href="(.*?)" target="_blank" title="(.*?) 字数:(.*?)</a>',dl[i]))
    chapter_url,chapter_title = chapter_info[i][0][0:2]    #注意不包括chapter_info[i][0][2]这个元素
    chapter_response = requests.get(chapter_url)
    chapter_response.encoding = 'utf-8'
    chapter_html = chapter_response.text

    #提取章节内容-方法一
    chapter_content = re.findall('<div class="content" itemprop="acticleBody">(.*?)</div>', chapter_html, re.S)  #不是很好的选择,中间会多出很多<p></p>,空格等,需要数据清洗
    print(chapter_content)#清洗之前
    chapter_content[0] = chapter_content[0].replace(' ','')    #数据清洗
    chapter_content[0] = chapter_content[0].replace('\r\n', '')
    chapter_content[0] = chapter_content[0].replace('<p>', '')
    chapter_content[0] = chapter_content[0].replace('</p>', '\n')#根据文段的分布,将末尾的符号变成换行
    print(chapter_content)#清洗之后
    my_text.write(chapter_title + '\n')
    my_text.write(chapter_content[0]+'\n')

    #提取章节内容-方法二
    # chapter_content = re.findall(r'<p>(.*?)</p>',chapter_html, re.S)  #会多出来两行汉字,这段话下面的部分,需要删除掉,但避免了清洗
    # my_text.write(chapter_title+'\n')
    # for j in range((len(chapter_content)-2)):
    #     my_text.write(chapter_content[j]+'\n')
my_text.close()

运行

loading
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值