20170605初学笔记之python

来源:互联网 发布:sql server 权限管理 编辑:程序博客网 时间:2024/06/10 02:35

0x00.前言(罗里吧嗦)

今天python cookbook一书拿到手,边参考边码代码的时候一直在心中惊呼——居然有这种操作!居然还可以这样!随手翻了一翻就翻到了之前面试时被问到的几个问题,瞬间感觉自己的代码水平还真的很低级(以前知道自己代码水平低,但不知道低到了此等地步)。这其实是个好消息,每天都能像海绵一样吸收大量的知识,这种学习的快感真的想一直拥有啊!(但是不费力的无效的懒惰快感经常会让我忘记这种深度投入的爽感。需要不断提醒自己。)
为了防止面试仍然输出不了体系,记录每天的笔记,后续每周进行一次相关整理,之后形成一个类型的博文放到公众号。(挖坑2)

0x01.项目说明

对csv格式的文本内容进行读取并解析,解析出的数据作为参数传递给.so文件中暴露出的C接口函数进行调用执行。
本文涉及到的知识包括:

  1. csv文本格式的读写
  2. 对元组中的数据进行集体处理
  3. ctypes库的使用
  4. python函数的性能分析
  5. *操作符的使用

0x02.知识笔记

1.csv文本格式的读写

读写函数由python自带库csv提供,无论读写,均需要创建读写对象。以下为代码

import csvclass csvAPI(object):    def __init__(self,file):        self._file = file    def write(self,headers,rows,mode='w'):        with open(self._file,mode) as f:            f_csv = csv.writer(f) #创建写对象            f_csv.writerow(headers) #将头部信息写入            for i in range(len(rows)):                f_csv.writerow(rows[i])#将内容列表写入    def read(self,mode='r'):        rows = []        with open(self._file,mode) as f:            f_csv = csv.reader(f)#创建读对象,该对象为可迭代的生成器            headers = next(f_csv)#读取第一行,即头            for row in f_csv:                rows.append(row)#依次读取行并添加到列表中        return headers,rows#返回列头和数据if __name__ == '__main__':    headers = ["id","name","age"]    rows = [(1,'xiaoming',19),(2,'xiaohong',20)]    csvobj = csvAPI('data.csv')#创建对象    csvobj.write(headers,rows)#写入数据    headers_1,rows_1 = csvobj.read()#读出数据    print headers_1,rows_1#输出的结果:["id","name","age"],[('1','xiaoming','19'),('2','xiaohong','20')]

以上代码基本可以处理大部分csv文件,具体对数据的处理只需再添加方法即可。同时如果需要将数据读取成字典格式,直接将csv.reader改为csv.DictReader即可。如需将字典写入csv格式,需使用如下代码

f_csv = csv.DictWriter(f,headers)f_csv.writeheader()f_csv.writerows(rows)

2.对元组中的数据进行集体处理

从1中的执行结果中看到,读取出的数据均变成了字符串格式。挨个处理显然很麻烦,我们可以根据python中万物皆对象的特性,生成函数列表对元组数据进行处理。代码如下:

field_type = [int,str,int]row = [convert(value) for convert,value in zip(field_type,row)]#zip将两个列表一一对应打包成元组field_types = dict(zip(headers,field_type))#将元组转为字典row.update((key,convert(row[key]))for key,convert in field_types)

此处代码中的field_type即将工厂函数形成列表,对元组中的数据进行依次处理。如果需要对元组中的数据进行不同的处理,可构造函数列表,使用for循环进行处理。

3.ctypes库的使用

此库的使用在网上找到了很多说明,但最终发现真正还是python官方文档比较全面。所以在使用一个新库的时候,尽量去看官方文档。
该项目的使用主要是结构体数组的使用。c结构体在python中使用如下代码所示,其中POINT为指针类型

class RECT(Structure):    _fields_ = [("upperleft", POINT),                ("lowerright", POINT)]

结构体数组为RectArrayType = RECT*Length,其中Length为数组长度。生成数据放入到C接口调用函数中。

4.python函数的性能分析

最简单最有效虽然看起来有点麻烦的方法,在执行时使用以下命令执行

python -m cProfile xxxx.py

此处会获取所有调用信息,并输出所有调用信息的时间消耗。测试c接口的性能可直接查看调用函数所消耗的时间即可。因不太了解内部构造,暂作为可行方案,待后续学习

5.*操作符的使用

在函数调用过程中遇到了要将一个元组的内容依次作为函数的参数,使用*操作符可将元组内容依次传入,类似*args和**kwargs(需要去学习一下这俩参数是啥玩意)。代码栗子如下

def func(id,name,age):    passa = (1,'xiaoming',19)func(*a) #使用*操作符取出元组中的数据作为参数依次传入

0x03 总结

每条知识笔记都是一个坑需要填。
加油吧少女!