百度领航团-零基础Python速成--学习笔记
cookcookier123 发布于2021-02 浏览:737 回复:0
0
收藏
最后编辑于2022-04

课程链接: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']
'''

# python,一句话搞定数据标准化,排序和去重
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

# 创建Athlete对象
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)

收藏
点赞
0
个赞
TOP
切换版块