python

常用模块/API - 标准库

API 说明
sys.argv argv 是参数数组,argv[0] 为脚本名
os.walk 遍历文件夹下面所有目录
os.path 文件路径处理: 绝对路径、文件名、是否是文件(夹)…
os.path.join os.path.join('/home/zk', 'Desktop', 'aaa.pdf') 拼接路径
os.listdir('./output') 列举文件夹下面所有目录/文件
print('Hello') 打印
print('*' * 20) 打印一行 * 号

4 个帮助函数

  • dir()
1
2
>>> dir(os.path.isdir)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
  • help()
1
2
3
4
5
6
>>> help(os.path.isdir)
Help on function isdir in module genericpath:

isdir(s)
Return true if the pathname refers to an existing directory.
(END)
  • type()
1
2
>>> type(os.path.isdir)
<class 'function'>
  • __doc__
1
2
>>> os.path.isdir.__doc__
'Return true if the pathname refers to an existing directory.'

文件的头部

1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-

字符串、列表翻转

1
2
3
4
5
6
7
8
9
a = [1,2,3,4]
c = 'abcdef'

print a[::-1]
print c[::-1]

# 这种写法其实要相对更好一些
print list(reversed(a))
print list(reversed(c))

字符串占位符

1
2
# 这种写法优于 %
print '{greet} from {language}.'.format(greet = 'Hello World', language = 'Python')

代码质量比较高的 Pythonic 风格的代码库

  • Flask
  • gevent
  • requests

Python 的三元形式

1
X if C else Y

Pythonswitch

1
2
3
4
5
6
if n == 0
print "0"
elif n == 1
print "1"
else
print "default"

PythonLazy evaluation

1
2
3
4
5
6
7
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a+b
from itertools import islice
print list(islice(fib(), 5))

枚举

1
2
3
4
5
6
7
def enum(*posarg, **keysarg):
return type("Enum", (object,), dict(zip(posarg, xrange(len(posarg))), **keysarg))

Seasons = enum("Spring", "Summer", "Autumn", "Winter")

# 0
print Seasons.Spring

type

按照 Python 理念,为了充分利用其动态性的特征是不推荐进行类型检查的。 不刻意进行类型检查,而是在出错的情况下通过抛出异常来进行处理,这是较为常见的方式。实际应用中如果为了提高应用程序的健壮性,会使用 type() 来检查类型。

1
if type(a) is types.ListType:

序列迭代

1
2
3
li = ['a', 'b', 'c', 'd', 'e']
for i,e in enumerate(li):
print "index:", i, "element:", e

1
2
3
4
# enumerate 返回的是一个迭代器
e = enumerate(li)
e.next()
e.next()

自己实现反序 enumerate:

1
2
3
4
5
6
7
8
9
def myenumerate(sequence):
n = -1
for elem in reversed(sequence):
yield len(sequence) + n, elem
n = n - 1

li = ['a', 'b', 'c', 'd', 'e']
for i,e in myenumerate(li):
print "index:", i, "element:", e

迭代字典

1
2
3
4
5
6
7
8
personinfo = {
'name': 'Jon',
'age': 20,
'hobby': 'football'
}

for k,v in personinfo.iteritems():
print k,":",v

is==

  • is 用来比较两个对象在内存中是否拥有同一块内存地址,相当于 id(x) == id(y) 操作
  • == 表示 equal,是用来检查两个对象的值是否相等,实际上调用 a.__eq__(b)

Unicode

1
2
3
strUnicode = u"unicode 字符串"
# unicode
type(strUnicode)

Unicode 编码分为编码方式实现方式两个层次。编码方式分为 UCS-2 (两个字节编码) 和 UCS-4 (四个字节编码),目前使用的是 UCS-2,占用 16 位的编码空间。Unicode 的实现方式称为 Unicode 转换格式 (Unicode Transformation Format),简称为 UTF,较为常见的是 UTF-8,其特点是对不同范围的字符使用不同长度的编码

  • decode() 将其他编码对应的字符解码为 Unicode
  • encode()Unicode 编码转换为另一种编码, Unicode 作为转换过程中的中间编码

1
2
3
fileHandle = open("test.txt", r)
print filehandle.read()
filehandle.close()

左边是中文字符串,类型为 str,右边为 Unicode 字符串。当两种类型的字符串连接的时候,Python 将左边的中文字符转为 Unicode 再与右边的 Unicode 字符串做连接。而将 str 转为 Unicode 使用系统默认的 ASCII 编码对字符串进行解码, 字的编码 \xd6 对应的值为 216,超出了 ASCII 的编码范围 0 ~ 127, 因此会抛出 UnicodeDecodeError 异常。

使用如下两种方式将编码统一就可以解决问题:

1
2
In [80]: s = "中文测试".decode('utf-8') + u"Chinese Test"
In [81]: s = '中文测试' + u"Chinese Test".encode('utf-8')

默认编码:

1
2
3
In [68]: import sys
In [69]: sys.getdefaultencoding()
Out[69]: 'ascii'

Python 无自增

1
2
# 会被解释为 +(+i), + 被解释为正号
++i

Zen of Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#
# some behaviour that I want to implement -> write some __function__
#
# Python -i xxx.py
# >>> p1
# <__main__.Polynomial instance at 0x7fdca8101e18>
# >>> repr(p1)
# '<__main__.Polynomial instance at 0x7fdca8101e18>'
#
# ====after add method __repr__====
# >>> p1
# Polynomial(*(1, 2, 3))
#
# ====after add method __add__===
# >>> p1 + p2
#
class Polynomial:
def __init__(self, *coeffs):
self.coeffs = coeffs

def __repr__(self):
'''
give me the principal representation of this class
'''
return 'Polynomial(*{!r})'.format(self.coeffs)

def __add__(self, other):
return Polynomial(*(x + y for x, y in zip(self.coeffs, other.coeffs)))

def __len__(self):
return len(self.coeffs)

p1 = Polynomial(1, 2, 3) # x^2 + 2x + 3
p2 = Polynomial(3, 4, 3) # 3x^2 + 4x + 3

格式化 List

1
2
3
mylist = ['x', 3, 'b']
# 返回字符串形式的 [x, 3, b]
print '[%s]' % ', '.join(map(str, mylist))

pip 升级到 10 问题

1
2
from pip import main
ImportError: cannot import name 'main'

解决办法:

修改文件 /usr/bin/pip, 将内容改为:

1
2
3
from pip._internal import main
if __name__ == '__main__':
sys.exit(main())

pip 安装文件失败

Could not find a version that satisfies the requirement paddlepaddle

三个原因:

  • pip 版本太低
  • paddlepaddle 只能通过 pip2 来安装
  • paddlepaddlewhl 文件只支持 64 位操作系统

pip 安装库到不同的 Python 版本

1
2
3
4
5
6
7
8
9
# 升级 Python2 的 pip
sudo python -m pip install -U pip
# 安装 matplotlib 到 Python2
sudo python -m pip install -U matplotlib

# 升级 Python 3 的 pip
sudo python3 -m pip install -U pip
# 安装 matplotlib 到 Python3
sudo python3 -m pip install -U matplotlib

pip 卸载

1
pip uninstall <package>

pip 查看自身版本号

1
2
pip -V
pip --version

pip 强制重新安装包的指定版本

1
2
3
4
5
6
# 最终并没有执行成功, 最后提示 matplotlib 3.0 必须 python >= 3.5
sudo python -m pip install -U 'paddlepaddle==0.11.0' --force-reinstall

# 按照这种办法, 执行成功了
sudo pip uninstall paddlepaddle
sudo pip install 'paddlepaddle==0.11.0'

pip 查看已经安装的包的版本

1
pip show paddlepadle

Python 搜索路径

  • built-in module
  • sys.path

推荐文章