课程链接:https://aistudio.baidu.com/aistudio/course/introduce/7073
一、Python面向对象
1.1、选手的最好三次成绩
处理文件中运动员的测试数据,并选出该运动员的最好的三次成绩
def get_coach_data(filename):
with open(filename) as f:
line = f.readline()
return line.strip().split(’,’)
times = get_coach_data(‘mywork/james.txt’)
print(‘读取文件james.txt后的结果:\n’)
print(times)
‘’’
读取文件james.txt后的结果:
[‘2-34’, ‘3:21’, ‘2’, ‘34’, ‘2.45’, ‘3.01’, ‘2:01’, ‘2:01’, ‘3:10’, ‘2-22’]
‘’’
get_coach_data函数说明
filename为文件路径
f表示文件对象
f.realine()表示读取文件的一行
line.strip().split(’,’)为链式函数写法意思是,先对这一行的数据进行strip(),就是去掉改行头尾空格和换行符。然后对strip()的结果进行split(’,’),对结果以逗号的进行切分形成一个数组。
def sanitize(time_string):
if ‘-’ in time_string:
splitter = ‘-’
elif ‘:’ in time_string:
splitter = ‘:’
else:
return (time_string)
(mins,secs) = time_string.split(splitter)
return (mins+’.’+secs)
sanitize函数说明
time_string为时间数组
splitter是根据原数据的格式来确实分钟和秒的分隔符
(mins,secs) = time_string.split(splitter)以splitter分隔符切分每个时间数据到两个变量中mins,secs
return (mins+’.’+secs)将分钟和秒以字符串点进行连接
james_times = get_coach_data(‘mywork/james.txt’)
clean_james = []
for each_t in james_times:
clean_james.append(sanitize(each_t))
print(‘输出james.txt标准化后的结果\n’)
print(clean_james)
‘’’
输出james.txt标准化后的结果
[‘2.34’, ‘3.21’, ‘2’, ‘34’, ‘2.45’, ‘3.01’, ‘2.01’, ‘2.01’, ‘3.10’, ‘2.22’]
‘’’
sorted_james=sorted(clean_james)
unique_james = []
for each_t in sorted_james:
if each_t not in unique_james:
unique_james.append(each_t)
print(‘输出排序并去重后的结果,并取前3个数据\n’)
print(unique_james[0:3])
‘’’
输出排序并去重后的结果,并取前3个数据
[‘2’, ‘2.01’, ‘2.22’]
‘’’
james_times = get_coach_data(‘mywork/james.txt’)
print(‘一句话搞定数据标准化、排序、去重\n’)
print(sorted(set([sanitize(t) for t in james_times]))[0:3])
‘’’
一句话搞定数据标准化、排序、去重
[‘2’, ‘2.01’, ‘2.22’]
‘’’
1.2、获取选手的数据
james_new = get_coach_data(‘mywork/james_new.txt’)
(james_name,james_dob) = james_new.pop(0),james_new.pop(0)
james_top3 = sorted(set([sanitize(t) for t in james_new]))[0:3]
print(‘姓名:%s,生日:%s,最快的3次成绩:%s’ %(james_name,james_dob,james_top3))
‘’’
姓名:james,生日:2006-11-11,最快的3次成绩:[‘2.01’, ‘2.22’, ‘2.34’]
‘’’
1.3、使用字典减少处理多个运动员的数据时的变量数
james_new = get_coach_data(‘mywork/james_new.txt’)
james_data={}
james_data[‘Name’] = james_new.pop(0)
james_data[‘Dob’] = james_new.pop(0)
james_data[‘top3’] = sorted(set([sanitize(t) for t in james_new]))[0:3]
print(‘姓名:%s,生日:%s,最快的3次成绩:%s’ %(james_data[‘Name’],james_data[‘Dob’],james_data[‘top3’]))
‘’’
姓名:james,生日:2006-11-11,最快的3次成绩:[‘2.01’, ‘2.22’, ‘2.34’]
‘’’
1.4、类
使用类的好处
降低复杂性 -> 更少的bug -> 提高可维护行
类可以将数据与函数绑定在一起,使代码模块化
调用数据和函数,使用对象名.的方式,使代码更加优雅
运动员数据处理
class Athlete:
#类属性
address = ‘中国足球协会训练基地xx街xx号’
def init(self,a_name,a_dob=None,a_times=[]):
self.name = a_name
self.dob = a_dob
self.times = a_times
def top3(self):
return sorted(set([sanitize(t) for t in self.times]))[0:3]
def sanitize(self,time_string):
if ‘-’ in time_string:
splitter = ‘-’
elif ‘:’ in time_string:
splitter = ‘:’
else:
return (time_string)
(mins,secs) = time_string.split(splitter)
return (mins+’.’+secs)
james_new = get_coach_data(‘mywork/james_new.txt’)
james_name = james_new.pop(0)
james_dob = james_new.pop(0)
james_times = james_new
james = Athlete(james_name,james_dob,james_times)
print(‘姓名:%s,生日:%s,最快的3次成绩:%s’ %(james.name,james.dob,james.top3()))
‘’’
姓名:james,生日:2006-11-11,最快的3次成绩:[‘2.01’, ‘2.22’, ‘2.34’]
‘’’
1.5、如何定义类
class Athlete
第一部分:class定义类的关键字,Athlete符合python标识符命名规则,:表示类内容的开始
def init(self,a_name,a_dob=None,a_times=[]):
第二部分:def定义函数的关键字,init 方法是一个特殊方法会在实例化对象时自动调用,我们会在这个方法中对数据进行赋值。self作为类中函数的第一个参数,方便该方法调用该类的其他属性和方法。
第三部分:自定义的属性和方法
1.6、如何使用类
1.创建对象
对象名 = 类名(参数)
2.使用:调用类的方法和属性
对象.属性名
对象.方法名()
1.7、类属性
所有对象共享的数据
如何使用:定义:在 init之上,或者说在类的范围内与方法同等级别,书写变量名=值
**调用:**类名.类属性
1.8、类方法
所有对象共享的方法
如何使用:
定义:方法定义时,使用@classmethod标记
调用:
类名.类方法
对象.类方法
1.9、私有属性和方法
外部不能访问的属性和方法
如何使用:
定义:在属性和方法名前加 __ 两个下划线调用:只能通过类中的方法来调用私有的属性和方法
例子:
例子:
class Athlete:
def init(self,a_name,a_dob=None,a_times=[]):
self.__name = a_name
self.dob = a_dob
self.times = a_times
def sayName(self):
print(self.__name)
def top3(self):
return sorted(set([self.__sanitize(t) for t in self.times]))[0:3]
def __sanitize(self,time_string):
if ‘-’ in time_string:
splitter = ‘-’
elif ‘:’ in time_string:
splitter = ‘:’
else:
return (time_string)
(mins,secs) = time_string.split(splitter)
return (mins+’.’+secs)