Antkillerfarm Hacking V7.0

Python(一)

2018-02-18

Python

教程

https://www.liaoxuefeng.com/wiki/1016959663602400

国人写的一个中文教程。

https://perso.limsi.fr/pointal/_media/python:cours:mementopython3-english.pdf

python语言的一个速查表

REPL

Read–Eval–Print Loop算的上是脚本语言的标配了,python也不例外。

PyPI

PyPI是一个Python语言的软件库管理软件,它的官网是:

https://pypi.python.org/pypi

用户可以在这里查找自己需要的Python包。

Ubuntu下的安装方法是:

sudo apt install python-pip

使用方法是:

pip install <package name>

有的python包因为包含不可移植的二进制文件,使用pip安装的时候会出错。这时,可在ubuntu官网搜索安装相应的python包。

对于可移植的python包,直接使用pip安装即可,在ubuntu官网搜也搜不到的。

ubuntu官方支持2.x和3.x的共存,用pip2和pip3加以区分,默认的pip实际上是pip2。

pip的cache路径:

win7:

c:\用户(你的用户名)\AppData\Local\pip\cache\

linux:

~/.cache/pip

离线安装法:

在有网络的机器上安装好相关包之后,使用如下命令可以导出相关安装包(包括依赖包):

pip download <package name>

和apt不同,pip没有自动更新的功能,但可以手动更新:

pip install --upgrade <package name>

更换源:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple <package name>

其他源还有:

https://mirrors.aliyun.com/pypi/simple/

https://pypi.mirrors.ustc.edu.cn/simple/

http://pypi.douban.com/simple/

对于Tensorflow这样的大包,有的时候即使是国内镜像也不能顺利安装。这时,可以使用断点续传工具下载相应的whl文件:

pip install xxx.whl

pip安装缓存目录:~/.cache/pip

指定版本:

pip install -v pycrypto==2.3

查看可用的版本:

随便输一个不可能出现的版本号,出错信息里有所有可用的版本信息。

列出已安装的包:

pip list

离线下载pip包进行安装:

下载:pip install <package> --download /tmp/offline_packages

安装:pip install --no-index --find-links="/tmp/tranferred_packages" <package>

参考:

https://mp.weixin.qq.com/s/8U44tyW84nVzSykownc2yw

最全的pip使用指南

https://www.jianshu.com/p/ce85f5bd900f

pip解决ImportError: cannot import name ‘main’


问题:

SSL: CERTIFICATE_VERIFY_FAILED

解决:

pip3 --trusted-host pypi.python.org install numpy

当然最根本的办法还是安装相关的SSL证书,只是有点麻烦。


requirements:

pip install -r requirements.txt

参考:

https://www.jianshu.com/p/b183b464a611

python requirements文件生成与使用


https://mp.weixin.qq.com/s/9q0bLHTpzS-SvzfzHtZBXg

Python依赖库管理哪家强?pip、pipreqs、pigar、pip-tools、pipdeptree任君挑选

IDE

官方自带的IDLE,以现代IDE的观点来看,只是个精致的小玩具而已。

在Anaconda出现之前,ActivePython曾是Windows平台最好的python发行版,它自带的PythonWin是个不错的IDE,但界面还是差了些,比VC6还差的远。

除此之外,我还用过UliPad(2007年前后)。它是国内python的元老级人物limodou(一个70后程序员)的作品。官网:

https://github.com/limodou/ulipad

UliPad的界面就和其他现代IDE差不多了。

最近比较流行的IDE,当属pycharm。官网:

https://www.jetbrains.com/pycharm/

相信熟悉Android Studio和IDEA的同学一定会觉得很亲切。没错,他们都是同一家公司的产品。

IntelliJ IDEA的雏形是JBuilder编辑器的插件IntelliJ Renamer。IntelliJ IDEA本身启动于2000年。

安装:

sudo snap install pycharm-community --classic

参考:

https://mp.weixin.qq.com/s?__biz=MzIwOTc2MTUyMg==&mid=2247492214&idx=2&sn=31b7b25246ac0db7f54e24af35e4e2ce

PyCharm中一些不为人知的技巧

软件发布工具

distutils

distutils是python自带的软件发布工具。它的安装脚本一般叫做setup.py,对应的配置文件叫做setup.cfg。

它的文档参见:

https://docs.python.org/2/distutils/index.html

distutils-extra

distutils-extra在distutils的基础上做了扩展,提供诸如i18n之类的支持。如果没有安装,会报如下错误:

error: error in setup.cfg: command 'build' has no such option 'i18n'

安装方法:

sudo apt install python-distutils-extra

setuptools

setuptools是一个更强大的distutils扩展,它也是PyPI的基础。它的安装脚本通常以ez_setup.py的形式出现。

它的文档参见:

https://pythonhosted.org/setuptools/setuptools.html

安装方法:

sudo apt install python-setuptools

Easy Install

setuptools提供的一个工具,可从网络下载安装外部依赖文件。

它的文档参见:

https://pythonhosted.org/setuptools/easy_install.html

参考:

https://mp.weixin.qq.com/s/w6ln1VCtOye-f21BShCNqg

花了两天,终于把Python的setup.py给整明白了

PyGObject

谈起Python调用GTK+的话题,在GTK+ 2的时代可以使用PyGTK库。它的官网是:

http://www.pygtk.org/

但由于PyGTK库本质上来说,使用了和一般的Python调用C库一样的方法,因此每导入一个库,都需要编写大量的接口文件。GNOME工程有那么多项目,采用这种办法显然是不太可行的。

于是,GNOME工程发起了GObject Introspection项目。众所周知,GNOME工程诸多项目的基石是GObject。这是一个很成功的类型系统,使用该系统可以获得远比普通C库更强的支持。GObject Introspection项目的目标就是创建一个用于跨语言绑定的中间层。

这也是GTK相对Qt的重大优势:几乎所有语言都有GTK绑定,但只有少数语言能绑定到Qt上,而且除了原生C++语言之外,其他的都是功能阉割版。

这个项目的官网是:

https://wiki.gnome.org/Projects/GObjectIntrospection

文档:

https://gi.readthedocs.io/en/latest/

PyGObject项目就是这种方法的成果,目前它已经取代了PyGTK库,成为GTK+ 3时代Python调用GTK+的官方方案。

它的官网是:

https://wiki.gnome.org/Projects/PyGObject

相关的API参考文档可参见:

http://lazka.github.io/pgi-docs/

指南文档可参见:

http://python-gtk-3-tutorial.readthedocs.org/en/latest/

安装方法:

Ubuntu下,可以执行:

sudo apt install python-gi python3-gi

Windows下,有个PyGObject for Windows项目,该项目的官网是:

http://sourceforge.net/projects/pygobjectwin32/files/

PyGObject的helloworld程序可参见:

https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/python/pygtk-helloworld.py

这里必须指出的是,PyGObject依赖的接口文件只有在dev包中才有。安装相关Glib项目时,一定要选择名称以-dev结尾的包。

相关资源

http://www.lfd.uci.edu/~gohlke/pythonlibs/

Unofficial Windows Binaries for Python Extension Packages

参数传递

基本数据类型:数值型,字符串,布尔,是值传递;其他的是引用传递,包括类类型,列表,字典。

list操作

L.append(var)   #追加元素
L.extend(list)  #追加list,即合并list到L上

Python中的括号

Python主要有三种数据类型:字典Dictionary(Key/Value对)、列表List(变长数组)、元组Tuple(定长数组)。其分别由花括号,中括号,小括号表示。如:

字典:dic={'a':12,'b':34}

列表:list=[1,2,3,4]

元组:tup=(1,2,3,4)

由于小括号在python中已有定义,所以当Tuple只有一个元素时,需要在元素后面加上逗号,而Dict和List则没有这个规定。

tup=(1,)

python中的下划线

1.在解释器中,‘_’代表交互式解释器会话中上一条执行的语句的结果。

2.‘_’ 作为临时性的名称使用。这样,当其他人阅读你的代码时将会知道,你分配了一个特定的名称,但是并不会在后面再次用到该名称。例如:

for _ in range(n):

3.用于实现国际化和本地化字符串之间翻译查找的函数名称。例如:

_("Hello")

4._xxx:protected变量。

5.__xxx:private变量。

6.__xxx__:系统内置变量。

python中的星号(*)

运算时

**:乘方

//:商取整

定义方法时

python的参数分为两类:位置参数关键字参数

例子:

def func(x,y,z=10)

上例中,x和y是位置参数,它们没有默认值,是必选项。

z是关键字参数,它有默认值,可以不传。

传参也有两种方式:

value:这种方式下,传参顺序必须要和定义的顺序一致。

key=value:这种方式下,传参顺序可以和定义顺序不同。

一个星号:收集位置参数放到一个元组中。例子:

def prints(*arg):
    print(arg)
prints(1,2,3,4,5,6,7)
#result: (1,2,3,4,5,6,7)

两个星号:收集关键字参数,并将其放到一个字典中。例子:

def prints(**arg):
    print(arg)
prints(a=1,b=2,c=3,d=4,e=5,f=6,g=7)
#result: {‘a’: 1, ‘c’: 3, ‘b’: 2, ‘e’: 5, ‘d’: 4, ‘g’: 7, ‘f’: 6}

分隔不同类型参数

def mix(a,b,*,x,y):
  """位置参数与关键字参数混合"""
  return a,b,x,y

print(mix(1,2,x=3,y=4))

星号前面的a和b是位置参数,星号后面的x和y是关键字参数,调用mix()函数并传入参数时,关键字参数一定要使用”变量名=值”的形式传入数据,如果同位置参数一样传入数据,就会引发一个TypeError异常

调用方法时

def add(x,y):
    print x+y

para = (1,2)
add(*para)
#result: 3

kkwd = {'x' :1,'y':2}
add(**kkwd)
#result: 3

参考:

http://blog.csdn.net/yzj99848873/article/details/48025593

Python星号( * )操作符的用法

运算符重载

class Poke:
    def __init__(self):
        self.number = 0
    def __call__(self, *args, **kwargs):
        print("zzm")
    def __getitem__(self, item): # item就是[]内的值
        return self.number
    def __setitem__(self, key, value): # key是[]内的值,value是 = 后的值
        self.number = value

poke = Poke() # 创建对象poke
poke() # 调用__call__函数
print(poke[0]) # 调用__getitem__函数
poke[0] = 3 # 调用__setitem__函数
Fork me on GitHub