Python

Python

sf2gis@163.com

2014年8月18日

2014年9月8日添加发布功能

2015年4月27日添加PyQt

1  概述

Python是由标准C语言构建的解释性语言。所以与C、C++具有原生支持的特性。Python具有API参考手册,可以支持与C进行交互。

Python是面向对象的弱类型语言,其开发目的就是为了简化C、C++的使用,用于测试或小型工程,或用于不同C++库之间的交互。因此,Python的设计原则就是简单,统一。

Python开发效率高而运行效率低,与C,C++互补,是大型工程中用于集成(效率模块要用C、C++开发)的良好工具。

参考:主要参考python help文档

1.1 why python?

目标:使用一种工具,在需求变动时,能够灵活的处理,减少代码量,简单发布,减少改动数量位置,增加重用性,易于扩展。

方法:C++、Java:只要有更改MVC任何部分,需要重新发布。扩展时也要重新发布。

Python、Perl、Ruby:MVC完全独立,可单独发布,单独修改。扩展时只需加入扩展模块,修改影响的模块,不需重新编译。代码量相对少。都使用OO,重用性强。

Python:易于理解。流行。

Perl、Ruby:流行程度不如Python(参考51job,猎聘)。

1.2 目标:使用python开发gui,cmd等工程

1.3 方法:pyCharm作为IDE进行调试和工程组织

2 解释器

python是一种解释性语言,需要调用解释器实时链编,其名称为python。

使用quit()或ctrl+z退出程序。

python是一个命令行程序,可以使用很多的参数,详见python –h使用说明。

python的main()函数由sys模块处理。但要注意,-c 命令。 –m 执行模块。

3 语言

3.1 语法

参见:python-语法.docx

3.2 工程组织

3.2.1模块内书写组织

A. Uinx起始行

B. 文档注释

C. 模块导入

D. 变量定义

E. 类定义

F. 函数定义

G. 判断入口主函数

由于需要先声明后使用,所以应该将需要声明的内容放在最前面,然后是使用声明内容的放在后面。最后是判断当前的执行方法(调用或者导入)来执行相应的函数。

由于所有的Python都具有执行能力(不是c中只有main才能作为入口),所以应该将能够执行的代码放入函数中,并由主函数进行统一调用。

参考:http://www.pythondoc.com/pythontutorial27/index.html

4 库

参见:python-库.docx

5 常用操作

5.1 字符串->list转换

list(String)

5.2 list->String转换

split.join(list)

参考:http://piziyin.blog.51cto.com/2391349/568426

5.3 定义二维数组

将一维数组作为二维数组的元素。

lstTileCode = [[ppTileCode[i][j] for j in range(2)] for i in range(codecount)]
其中[ppTileCode[i][j] for j in range(2)]为一维数组,将为二维数组的元素。
for i in range(codecount) 则使用一维数组初始化二维数组。

参考:http://stackoverflow.com/questions/6667201/how-to-define-two-dimensional-array-in-python

5.4 函数返回多个值

返回一个list、tuple,并解析。

def test():
    ...
    return (a,b)
a, b = test()

参考:http://stackoverflow.com/questions/9752958/how-can-i-return-two-values-from-a-function-in-python

5.5 创建和使用GUID、UUID

使用UUID模块。

一般使用UUID1()。

使用str(uuid)转化为字符串。

参考:https://docs.python.org/2/library/uuid.html

http://stackoverflow.com/questions/534839/how-to-create-a-guid-in-python

5.6 文件换行符:在windows下使用wb+模式,用\n

如:file(fn,'wb+').write('test\ntest2')

参考:http://www.zhihu.com/question/19751023

6  文件与目录

6.1 文件操作

参考:http://sebug.net/paper/python/ch12.html

http://zhou123.blog.51cto.com/4355617/1281393

6.1.1创建

可以使用file()(一般用于类型检测)或open()(推荐)生成file对象。

参见:open():打开文件。

6.1.2写入

1)   使用w模式打开文件

2)   写入数据。

3)   关闭文件

示例:

def save2File(strFileName, strText):
    """
    save txt to file.
    :param strFileName: 
    :param strText: 
    :return: no return
    :author sf2gis@163.com
    :date 2014-10-11 17:02:27
    """
    fp = open(strFileName, "w")
    fp.write(strText)
    fp.close()

6.1.3读取

1)   循环读取读取数据

2)   如果返回空值,则到达尾部

示例:

def readFile(strFileName):
    """
    read file.
    :param strFileName: 
    :return:
    :author sf2gis@163.com
    :date 2014-10-11 17:11:32
   """
    fp = open(strFileName, "r")
    while True:
        line = fp.readline()
        if 0 == len(line):
            break
        print line
    fp.close()

6.1.4删除

os.remove():删除文件。

os.rmdir():删除空文件夹。

shutil.rmtree():删除文件夹及内容。

参考:

http://stackoverflow.com/questions/6996603/how-do-i-delete-a-file-or-folder-in-python

6.2 Python文件所在的目录

__file__将返回文件的实际路径,但有时是绝对路径,有时是相对路径。

os.path.realpath(__file__):将返回文件的绝对路径。

os.path.split(path):将把文件路径和文件名分开。

os.path.split(os.path.realpath(__file__))[0] 将返回文件所有目录。

参考:http://www.elias.cn/Python/GetPythonPath?from=Develop.GetPythonPath

7 用户接口-CMD,GUI-TK、PySide,PyQt

7.1 命令行

目标:分析输入的命令行参数。据此执行不同的功能。

方法:sys.argv提供所有输入的参数列表list。然后逐个判断输入参数。一般采用-a来标识参数name,其后跟value。

    lstArgv = sys.argv
    iLen = len(lstArgv)
    for i in range(iLen):
        strArg = lstArgv[i]
        if "-f" == strArg:
            if i+1 <= iLen - 1:
                strFileName = lstArgv[i+1]

7.1.1示例:

"""
parse input argv into different parameters.
:author sf2gis@163.com
:date 2014-10-09 15:12:02
"""
import os
import sys
from getlogger import *
 
def parseCmd():
    """
    parse input argv into different parameters.
    :return: no return.
    :author sf2gis@163.com
    :date 2014-10-09 15:12:02
    """
    strFileName = None
    iMaxBytes = None
    iCount = None
    lstArgv = sys.argv
    iLen = len(lstArgv)
    for i in range(iLen):
        strArg = lstArgv[i]
        if "-f" == strArg:
            if i+1 <= iLen - 1:
                strFileName = lstArgv[i+1]
        elif "-max" == strArg:
            if i+1 <= iLen - 1:
                iMaxBytes = int(lstArgv[i+1])
        elif "-c" == strArg:
            if i+1 <= iLen - 1:
                iCount = int(lstArgv[i+1])
    print strFileName
    print iMaxBytes
    print iCount
    logger = getLogger(strFileName, iMaxBytes, iCount)
    for i in range(100):
        logger.debug("test")
 
if __name__ == "__main__":
    """
    test.passed.2014-10-09 17:12:07.sf2gis@163.com.
    """
    parseCmd()

7.2 GUI

参见:pythonGUI-TK_Pyside.docxPyQt.docx

8 C/C++交互库-Python调用C/C++:ctypes

参见:Python调用CC++库.docx

9 C/C++交互库-C/C++调用Python:Python.h

Python提供了一个C/C++的API,包含绝大多数的Python Runtime功能。所有接口定义都在python.h中。

注意:头文件中包含许多与平台有关的设定,所以在使用任何python功能之前必须要包含此头文件。

所有与Python有关的对象、功能都有Py、PY前缀。

PyObject:表示一个不透明对象。所有类型都可以转化为PyObject。只能以指针的形式出现,不可构造对象,不可析构。

PyArg_ParseTuple

PyArg_ParseTuple(pythonobject,format,cobject):将python类型转换为C类型。

PyObject *Py_BuildValue(format,cobject):将c类型转换为python类型。

Python对象:PyObject.

Python函数:参见Python C APIhttps://docs.python.org/2/c-api/sys.html#system-functions

 

参考:https://docs.python.org/2/extending/extending.html

 

9.1C++调用Python

 

//pro
#-------------------------------------------------
#
# Project created by QtCreator 2014-08-19T10:56:00
#
#-------------------------------------------------
 
QT       += core
 
QT       -= gui
 
TARGET = console
CONFIG   += console
CONFIG   -= app_bundle
 
TEMPLATE = app
 
 
SOURCES += main.cpp
 
INCLUDEPATH += C:/python27/include
 
LIBS += -LC:/python27/libs python27.lib
 
//main.cpp
#include <QCoreApplication>
#include <Python.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    PyObject * pModule = NULL;//声明变量
    PyObject * pFunc = NULL;// 声明变量
    pModule =PyImport_ImportModule("helloworld");//这里是要调用的文件名
    if(NULL == pModule){
        qFatal ("load file error\n");
        return 0;
    }
    pFunc= PyObject_GetAttrString(pModule, "hello");//这里是要调用的函数名
    PyEval_CallObject(pFunc, NULL);//调用函数
    Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
    return a.exec();
}

参考:

http://www.vimer.cn/2010/11/cc%E4%BB%A3%E7%A0%81%E4%B8%AD%E8%B0%83%E7%94%A8python%E8%84%9A%E6%9C%AC.html

 

10    Python与其它语言的交互

java、.net

11    Python程序发布

将python程序发布为可以直接运行,不需要依赖Python解释器的程序。

python可以发布为各种格式的程序,一般不需要生成dll/so库,因为各种语言都有与python的接口,可以直接调用脚本,而生成库则需要将脚本封装,再在调用方进行解析,反而更加复杂。

py2exe可以将python程序转换为exe文件,并将所有依赖的dll等程序放置于同一个发布目录。

1)   Py2exe需要一个脚本来配置,主要说明为哪些文件进行发布。

2)   然后以py2exe为参数运行发布脚本。

3)   可以将发布文件以NSIS等打包工具进行打包为单文件发布。

示例:

from distutils.core import setup
import py2exe
 
# Set options
options ={ 'py2exe':
    {
        'dll_excludes':['w9xpopen.exe'] #This file is for win9x platform
    }
}
 
# Setup
setup ( options  = options,
    windows = [{
        'script': 'hello.py'}]
    )
 
#开始发布
python setup.py py2exe

参考:http://our2848884.blog.163.com/blog/static/146854834201371112428923/

12    Python作为程序架构的方法

1)   根据需求生成相应的设计及文档

2)   使用QTDesigner生成界面

3)   生成界面逻辑

参见:用户接口-CMD,GUI-TK、PySide,PyQt

4)   使用Python生成原型

5)   使用QT生成核心逻辑

6)   由Python装配核心及界面

参见:C/C++交互库-Python调用C/C++:ctypes

7)   打包发布

参见:Python程序发布

13    Python日志模块

参见:python日志库logging.docx

14    Python测试框架

15    应用

15.1 SHELL功能:跨平台的批处理功能

15.1.1批量重名称

15.1.2文件移动

15.2 网络爬虫:Scrapy

参见:scrapy.docx

15.3 网络框架:Django

参见:Django.docx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弗里曼的小伙伴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值