美文网首页Python基础笨办法学PythonPython
《Head First Python》学习笔记 Chapter6

《Head First Python》学习笔记 Chapter6

作者: hoxis | 来源:发表于2015-12-31 13:28 被阅读132次

    本文将涉及到字典。字典可以有效地组织数据,可以将数据与名称关联(类似于Map),从而实现快速查找。另外,也可以自定义类来处理一些功能,通过为对象增加一些属性和方法完成所需的功能。

    所需文件获取地址:http://python.itcarlow.ie/chapter6/hfpy_ch6_data.zip

    字典dictionary

    字典是一个内置的数据结构,允许将数据与键进行关联,这样可以使内存中的数据与实际数据的结构保持一致。也可以称之为“映射”、“散列”、“关联数组”等。

    创建字典dict

    可以使用两种方式进行创建空字典,一种是使用大括号创建,一种是使用工厂函数dict()创建。

    >>> cheese = {}
    >>> palin = dict()
    
    >>> type(cheese)
    <class 'dict'>
    
    >>> type(palin)
    <class 'dict'>
    

    添加数据

    通过将值与键关联,向这两个字典中添加一些数据。注意两种添加方式的不同。

    >>> cheese['Name'] = 'John Cheese'
    >>> cheese['Occupations'] = ['actor', 'comedian', 'writer', 'file producer']
    
    >>> palin = {'Name' : 'John Cheese', 'Occupations' : ['actor', 'comedian', 'writer', 'file producer']}
    

    访问数据

    通过字典名称加上[key]就可以访问到对应的值。

    >>> palin['Name']
    'John Cheese'
    >>> cheese['Occupations']
    ['actor', 'comedian', 'writer', 'file producer']
    >>> cheese['Occupations'][2]
    'writer'
    

    与列表不同的是,字典并不会维持插入的顺序,只是保持key-value之间的关联关系。

    完成上篇文章中的需求,现在运动员的数据变成了Sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55,2:22,2-21,2.22这种形式,其中不仅包含运动员数据,还有其他一些信息,需要进行特殊处理。

    def sanitize(time_str):
        if '-' in time_str:
            spliter = '-'
        elif ':' in time_str:
            spliter = ':'
        else:
            return time_str
        (mins, secs) = time_str.split(spliter)
        return(mins + '.' + secs)
    
    def get_coach_data(filename):
        try:
            with open(filename) as file:
                data = file.readline();
            dataList = data.strip().split(',')
            return {'Name' : dataList.pop(0), 'DOB' : dataList.pop(0), 'Times' : sorted(set([sanitize(str) for str in dataList]))[0:3]}
        except IOError as err:
            print('File error:' + str(err))
            return None
    
    sarah = get_coach_data('sarah2.txt')
    
    print(sarah['Name'] + "'s fastest times are: " + str(sarah['Times']))
    

    方法、属性、实例

    定义类

    使用class关键字来定义类,同时可以使用__init__()方法来完成类的初始化构造(类似于Java中的构造方法)。

    class Athlete:
        def __init__(self):
            # 完成对象'Athlete'的初始化工作
            ...
    

    创建对象实例

    在创建类的实例时,实际上调用了__init()__方法对类的实例进行了初始化。

    a = Athlete()
    b = Athlete()
    c = Athlete()
    d = Athlete()
    

    self的重要性

    self类似于Java中的this,用于指向当前对象实例。

    定义一个类时,实际上实在定义一个定制工厂函数,任何可以在代码中使用这个工厂函数来创建实例:

    Python在处理a = Athlete()这行代码时,会把工厂函数调用转化为以下调用,可以明确类(Athlete)、方法(__init__())和所处理对象实例(a):
    Athlete().__init__(a)

    如果没有self参数这个赋值,Python解释器将无法得出方法调用要应用到哪个实例,self参数可以帮助标识要处理哪个对象实例的数据。

    每个方法的第一个参数都是self
    下面对Athlete对象进行扩展,在一个名为thing的属性中存储一个值,同时增加一个how_big()方法返回thing的长度。

    class Athlete:
        def __init__(self, value=0):
            self.thing = value
        def how_big(self):
            return(len(self.thing))
    

    在一个对象实例调用类方法时,Python要求第一个参数是调用对象实例,这往往赋至各方法的self参数。

    你写的代码 Python执行的代码
    d = Athlete("Xiaoming") Athlete.__init__(d, "Xiaoming")
    d.how_big() Athlete.how_big(d)

    利用类存储数据改写之前的代码

    def get_coach_data(filename):
        try:
            with open(filename) as file:
                data = file.readline();
            dataList = data.strip().split(',')
            # 此处返回一个Athlete对象
            return Athlete(dataList.pop(0), dataList.pop(0), dataList)
        except IOError as err:
            print('File error:' + str(err))
            return None
    
    class Athlete:
        def __init__(self, name, dob=None, times=[]):
            self.name = name
            self.dob = dob
            self.times = times
        def getTop3(self):
            # sanitize方法没有变化,不再列出
            return sorted(set(sanitize(str) for str in self.times))[0:3]
    
    sarah = get_coach_data('sarah2.txt')
    print(sarah.name + "'s fastest times are: " + str(sarah.getTop3()))
    

    添加新的方法

    当需要额外新的功能时,可以向类中添加新的方法来实现所需的功能。

    class Athlete:
        def __init__(self, name, dob=None, times=[]):
            self.name = name
            self.dob = dob
            self.times = times
        # 获取时间前3的数据列表
        def getTop3(self):
            return sorted(set(sanitize(str) for str in self.times))[0:3]
        # 添加一条新的时间数据
        def add_time(self, time):
            self.times.append(time)
        # 添加多条新的数据
        def add_times(self,times):
            self.times.extend(times)
    

    类的继承

    Python允许通过继承来创建一个类,包括用list、set、dict提供的内部数据结构类。
    下面定义了一个NameList类,()中的list就表示它继承自list,因此它就具有了list的相关属性和方法。

    class NameList(list):
        def __init__(self, name):
            list.__init__([])
            self.name = name
    >>> nameList = NameList('a')
    >>> type(nameList)
    <class '__main__.NameList'>
    
    >>> nameList.append(2)
    >>> nameList.append('b')
    >>> nameList
    [2, 'b']
    
    >>> nameList.name
    'a'
    

    利用继承重写Athlete类:

    # 继承自list类
    class AthleteList(list): 
        def __init__(self, name, dob=None, times=[]):
            list.__init__([])
            self.name = name
            self.dob = dob
            self.extend(times) # 不再吸引times属性,数据本身就是
        # 获取时间前3的数据列表
        def getTop3(self):
            return sorted(set(sanitize(str) for str in self))[0:3]
    

    其他知识点

    array.pop(i)

    pop()属于array的方法,可以删除索引i处的数值,并返回该数值。默认参数为-1,因此默认会删除并返回数组中的最后一个元素。

    >>> array = [1, 2, 3, 4]
    >>> array.pop() # 弹出最后一个元素
    4
    >>> array.pop(2) # 弹出索引2处的元素
    3
    >>> array 
    [1, 2]
    >>> 
    

    list set dict

    名称 特点
    list 列表,数据有序,可重复
    set 集合,数据无序,不可重复
    dict 键值对,若把key-value看作一个整体,那么dictset类似

    相关文章

      网友评论

        本文标题:《Head First Python》学习笔记 Chapter6

        本文链接:https://www.haomeiwen.com/subject/bboihttx.html