Head First Python 学习札记 2016-04-09

    • Python术语和常识
    • 25Python的排序方法
      • 原地排序In-place sorting按照你指定的顺序排列数据用排序后的数据替代原来的数据原数据会丢失对于列表sort方法会提供原地排序
      • 复制排序Copied sorting按照你指定的顺序排列数据返回原数据的一个有序副本源数据会保留sortedBIF支持复制排序
      • 自定义一个能够处理时间数据的函数
    • 26推导列表
      • 1将一个列表转化成另外一个列表需要做四件事
      • 2在DILE中测试推导列表
      • 3修改之前的代码
    • 28使用字典来关联数据
      • 1创建一个字典的方法
      • 2给字典赋值的方法

Python术语和常识:

14、方法串链:julie = data.strip().split(‘,’) 第一个方法strip()除去data中的空白,之后,除去空白符的结果由第二个方法split(‘,’)处理,会得到一个列表,再将所得到的列表应用到以上代码的目标标示符,也就是julie。方法串链是从左往右读。

15、函数串链:允许数据应用一系列的函数,每个函数会取得数据,对它完成某个操作,然后把转换后的数据继续向下传递到下一个函数。函数串链是从右往左读。

16、Python集合中的数据是无序的,且不允许重复,如果试图向一个集合中增加一个已经存在的数据项,Python会忽略这个添加请求。

17、工厂函数:工厂函数用于创建某种类型的新的数据项,例如:set()就是一个工厂函数,因为它会创建一个新的集合。

distance = set()
distance = {10.6,11,8,10.6,'two'}

18、列表推导:在一行上指定一个转换

19、分片:从一个列表访问多个列表项

#打印第3项、第4项、第5项
print(my_list[3:6])

20、集合:一组无序的数据项,其中不包含重复项。distance[] = set()

21、字典:一个内置的数据结构(置于Python中),允许将数据与键而不是数字相关联。这样可以使得内存中的数据与实际数据的结构保持一致。详见28。

25、Python的排序方法

原地排序(In-place sorting)按照你指定的顺序排列数据,用排序后的数据替代原来的数据,原数据会丢失,对于列表,sort()方法会提供原地排序。

复制排序(Copied sorting)按照你指定的顺序排列数据,返回原数据的一个有序副本,源数据会保留,sorted()BIF支持复制排序。

默认的sort方法和sorted BIF是按照升序来排列的,也可以按降序来排列。设置这两个函数的参数reverse=True,就能按照降序来排序。

在DILE中输入以下数据,来测试:

>>> data = [6,8,6,9,4,10,2,3]
>>> data
>>> [6,8,6,9,4,10,2,3]
>>> data.sort() #原地排序,源数据丢失。
>>> data
>>> [2,3,4,6,6,8,9,10]
>>> data = [6,8,6,9,4,10,2,3]
>>> data2 = data.sorted()#复制排序,源数据还在。
>>> data2
>>> [2,3,4,6,6,8,9,10]
>>> data
>>> [6,8,6,9,4,10,2,3]

自定义一个能够处理时间数据的函数

待处理的数据:m-ss或者是m:ss
目标数据:m.ss

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)

改进之后的时间排序Python程序

import pickle
import Test
james = []
julie = []
mikey = []
sarah = []
data = []

try:
    #先将数据读出来到james_data、julie_data、mikey_data、sarah_data
    with open('james.txt','r')  as james_data, open('julie.txt','r') as julie_data, open('mikey.txt','r') as mikey_data, open('sarah.txt','r') as sarah_data:
        #然后调用readline方法存到data里面
        data = james_data.readline()
        #再利用strip方法去空格,split方法按照,分行存进列表里
        james = data.strip().split(',')

        data = julie_data.readline()
        julie = data.strip().split(',')

        data = mikey_data.readline()
        mikey = data.strip().split(',')

        data = sarah_data.readline()
        sarah = data.strip().split(',')

        clean_james = []
        clean_julie = []
        clean_mikey = []
        clean_sarah = []

        #设置一个for循环,利用sanitize来格式化时间数据
        for each_t in james:
            clean_james.append(Test.sanitize(each_t))

        for each_t in julie:
            clean_julie.append(Test.sanitize(each_t))

        for each_t in mikey:
            clean_mikey.append(Test.sanitize(each_t))

        for each_t in sarah:
            clean_sarah.append(Test.sanitize(each_t))


        # Test.print_lol(sorted(clean_james))
        print(sorted(clean_james))
        print(sorted(clean_julie))
        # Test.print_lol(sorted(clean_julie))
        print(sorted(clean_mikey))
        # Test.print_lol(sorted(clean_mikey))
        print(sorted(clean_sarah))
        # Test.print_lol(sorted(clean_sarah))

except IOError as err:
    print('IOError is '+str(err))
except pickle.PickleError as perr:
    print('PickleError is '+str(perr))

26、推导列表

1、将一个列表转化成另外一个列表,需要做四件事:

1)、创建一个新的列表来存放转换后的数据
2)、迭代处理原列表中的各个数据项
3)、每次迭代时完成转换
4)、将转换后的数据追加到新的列表中

2、在DILE中测试推导列表

>>> mins = [1,2,3]
>>> secs = [m*10 for m in mins]
>>> sece
>>> [10,20,30]

3、修改之前的代码

#列表迭代 初始代码:
clean_mikey = []#创建

for each_t in mikey:#迭代
    clean_mikey.append(sanitize(each_t))#append负责追加 sanitize负责转换

#列表推导 用推导列表重构之后的代码:
clean_mikey = [sanitize(each_t) for each_t in mikey]
# 创建 | 转换 | 开始循环迭代(追加会自动完成)

4、辨析:当列表中的每一项都必须完成一个转换的时候,建议使用列表推导。但是列表迭代更为灵活。

28、使用字典来关联数据

一个内置的数据结构(置于Python中),允许将数据与键而不是数字相关联。这样可以使得内存中的数据与实际数据的结构保持一致。

1、创建一个字典的方法:

>>> cleese = {}
#或者使用工厂函数
>>> palin = dict()

2、给字典赋值的方法

#通过键与值的关联,想这两个字典分别添加数据
#键值分开的情况
>>> cleese['Name'] = 'John Cleese'
>>> cleese['Occupation'] = ['actor','writer']
#键值一起的情况,最外面用的是{}
palin = {'Name':'Michael Palin','Occupation':['comedian','tv']}

#在DILE中调用查看
>>> palin['Name']
>>> 'Michael Palin'
#0前面的那个就是-1,也就是最后一个
>>> cleese['Occupation'][-1]
>>> 'writer'

#追加数据,添加额外的键值数据
>>> palin['Birthplace'] = 'Broomhill, Sheffield, England'
>>> cleese['Birthplace'] = 'Weston-super-Mare, North Somerset, England'

与列表不同,Python字典是不会维持插入顺序的,这会导致一些意外,关于字典,重点是维护关联关系,而不是顺序

import pickle
from Test import sanitize
from Test import ReadData
james = []
julie = []
mikey = []
sarah = []
data = []
try:
    #先使用ReadData函数读入数据,在ReadData函数内部直接调用字典函数DataDictionary来完成字典创建
    james = ReadData('james2.txt')
    julie = ReadData('julie2.txt')
    mikey = ReadData('mikey2.txt')
    sarah = ReadData('sarah2.txt')
    print(james['Name']+'\'s fastest times are:'+str(sorted(set([sanitize(each_t) for each_t in james['Times']]))[0:3]))
    print(julie['Name']+'\'s fastest times are:'+str(sorted(set([sanitize(each_t) for each_t in julie['Times']]))[0:3]))
    print(mikey['Name']+'\'s fastest times are:'+str(sorted(set([sanitize(each_t) for each_t in mikey['Times']]))[0:3]))
    print(sarah['Name']+'\'s fastest times are:'+str(sorted(set([sanitize(each_t) for each_t in sarah['Times']]))[0:3]))

except IOError as err:
    print('IOError is '+str(err))
except pickle.PickleError as perr:
    print('PickleError is '+str(perr))

你可能感兴趣的:(Head First Python 学习札记 2016-04-09)