0%

[python]常用API记录

这篇文章用来记录工作和学习过程中遇到的一些python常用api方法。

os模块#

os.walk()#

1
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

参数 top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。 - root 所指的是当前正在遍历的这个文件夹的本身的地址 - dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录) - files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)

topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。

onerror -- 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。 followlinks -- 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。

os.getenv(key, default = None)#

返回环境变量键的值(如果存在),否则返回默认值。

os.path.abspath(file)#

  • 获取的当前执行脚本的完整路径
  • 只有当在脚本中执行的时候,os.path.abspath(file)才会起作用,因为该命令是获取的当前执行脚本的完整路径,如果在交互模式或者terminate 终端中运行会报没有__file__这个错误

os.path.dirname(path)#

去掉文件名,返回目录

os.environ.get()#

是python中os模块获取环境变量的一个方法

getattr(object, name[, default])#

getattr() 函数用于返回一个对象属性值。 - object -- 对象。 - name -- 字符串,对象属性。 - default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。

shutil.copyfile(src, dst)#

复制文件内容(不包含元数据)从src到dstdst必须是完整的目标文件名; 如果src和dst是 同一文件,就会引发错误shutil.Errordst必须是可写的,否则将引发异常IOError。如果dst已经存在,它会被替换。

@property#

Python内置的@property装饰器就是负责把一个方法变成属性调用的.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Student(object):

@property
def score(self):
return self._score

@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
@property的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:
1
2
3
4
5
6
7
8
>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 100!

还可以定义只读属性只定义getter方法,不定义setter方法就是一个只读属性

1
2
3
4
5
6
7
8
9
10
11
12
class Student(object):
@property
def birth(self):
return self._birth

@birth.setter
def birth(self, value):
self._birth = value

@property
def age(self):
return 2014 - self._birth
上面的birth是可读可写的,而age就是一个只读属性

python中函数前添加*以及**的用法#

转自:http://blog.csdn.net/delphiwcdj/article/details/5746560 当要使函数接收元组或字典形式的参数 的时候,有一种特殊的方法,它分别使用*和**前缀 。这种方法在函数需要获取可变数量的参数 的时候特别有用。

[注意] [1] 由于在args变量前有*前缀 ,所有多余的函数参数都会作为一个元组存储在args中 。如果使用的是前缀 ,多余的参数则会被认为是一个字典的健/值对 。 [2] 对于def func(args):,args表示把传进来的位置参数存储在 tuple(元组)args里面。例如,调用func(1, 2, 3) ,args就表示(1, 2, 3)这个元组 。 [3] 对于 def func(args):,args表示把参数 作为字典的健-值对存储在dict(字典)args里面**。例如,调用func(a='I', b='am', c='wcdj') ,args就表示{'a':'I', 'b':'am', 'c':'wcdj'}这个字典 。 [4] 注意普通参数与*和**参数公用的情况,一般将*和**参数放在参数列表最后。

globals()#

以字典类型返回当前位置的全部全局变量

locals() 函数#

locals() 函数会 以字典类型返回当前位置的全部局部变量。 对于函数, 方法, lambda 函式, 类, 以及实现了 call 方法的类实例, 它都返回 True。

lambad函数用法#

####(1)直接赋给一个变量,然后再像一般函数那样调用

1
2
3
4
c=lambda x,y,z:x*y*z
c(2,3,4)

24
当然,也可以在函数后面直接传递实参
1
2
(lambda x:x**2)(3)
9
####(2)将lambda函数作为参数传递给其他函数比如说结合map、filter、sorted、reduce等一些Python内置函数使用,下面举例说明。
1
2
3
4
5
6
7
8
fliter(lambda x:x%3==0,[1,2,3,4,5,6])

[3,6]


squares = map(lambda x:x**2,range(5)
print(lsit(squares))
[0,1,4,9,16]
与sorted函数结合使用,比如:创建由元组构成的列表:
1
a=[('b',3),('a',2),('d',4),('c',1)]
按照第一个元素排序
1
2
sorted(a,key=lambda x:x[0])
[('a',2),('b',3),('c',1),('d',4)]
按照第二个元素排序
1
2
sorted(a,key=lambda x:x[1])
[('c',1),('a',2),('b',3),('d',4)]
与reduce函数结合使用
1
2
3
4
from functools import reduce
print(reduce(lambda a,b:'{},{}'.format(a,b),[1,2,3,4,5,6,7,8,9]))

1,2,3,4,5,6,7,8,9
####(3)嵌套使用将lambda函数嵌套到普通函数中,lambda函数本身做为return的值
1
2
3
4
5
6
def increment(n):
return lambda x:x+n

f=increment(4)
f(2)
6
####(4)字符串联合,有默认值,也可以用x=(lambda...)这种格式
1
2
3
4
x=(lambda x='Boo',y='Too',z='Z00':x+y+z)
print(x('Foo'))

'FooTooZoo'
####(5)在tkinter中定义内联的callback函数
1
2
3
4
5
6
import sys
from tkinter import Button,mainloop

x=Button(text='Press me',command=(lambda :sys.stdout.write('Hello,World\n')))
x.pack()
x.mainloop()
这段代码还是挺有意思的,希望小伙伴们可以复制粘贴运行一下哈。 ####(6)判断字符串是否以某个字母开头有
1
2
3
4
5
Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
B_Name= filter(lambda x: x.startswith('B'),Names)
print(B_Name)

['Bob', 'Barbara']
####(7)求两个列表元素的和
1
2
3
4
5
a = [1,2,3,4]
b = [5,6,7,8]
print(list(map(lambda x,y:x+y, a,b)))

[6,8,10,12]
####(8)求字符串每个单词的长度
1
2
3
4
5
sentence = "Welcome To Beijing!"
words = sentence.split()
lengths = map(lambda x:len(x),words)
print(list(lengths))
[7,2,8]

for else结构#

for else 结构还是第一次见,于是记录一下。如果for循环 正常结束,else中语句执行。如果是 break的,则 不执行

简单使用场景:寻找100以内的素数之和 (这个应该是较暴力算法,这里不讨论算法问题)

1
2
3
4
5
6
7
8
sum=0
for n in range(2,100):
for i in range(2,n):
if n%i==0: # 不是素数
break
else:
sum+=n # 加上素数
print(sum)

善用三目运算#

1
num = 3 if res > 3 else 1

接受动态参数sys.argv#

1
2
3
4
5
6
7
8
# test.py

import sys
def main(argv)
print(argv)

if __name__ == '__main__':
main(sys.argv)
1
python test.py 1 2 3 4 5

binascii --- 二进制和 ASCII 码互转#

binascii介绍 ### 返回二进制数据 data 的十六进制表示形式

1
2
binascii.b2a_hex(data[, sep[, bytes_per_sep=1]])
binascii.hexlify(data[, sep[, bytes_per_sep=1]])
data 的每个字节都被转换为相应的2位十六进制表示形式。因此返回的字节对象的长度是 data 的两倍。

返回由十六进制字符串 hexstr 表示的二进制数据#

1
2
binascii.a2b_hex(hexstr)
binascii.unhexlify(hexstr)

此函数功能与 b2a_hex() 相反。 hexstr 必须包含 偶数个十六进制数字(可以是大写或小写),否则会引发 Error 异常。

zlip#

  • 字符串:使用 zlib.compress可以压缩字符串。使用 zlib.decompress可以解压字符串。

  • 数据流:压缩:compressobj,解压:decompressobj

cPickle#

cPickle.dump#

将python对象序列化

1
cPickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)

cPickle.load#

载入本地文件,恢复python对象

1
>>> data = cPickle.load(open("test\\data.pkl","rb"))

cPickle.dumps#

将python对象序列化保存到一个字符串变量中

1
>>> data_string = cPickle.dumps(data)

cPickle.loads#

从字符串变量中载入python对象

1
>>> data = cPickle.loads(data_string)

pyflakes#

检查加载字符串代码是否有错

1
2
3
from pyflakes.api import checkCode
a = f.read()
checkCode(a, my_Reporter(sys.stdout, sys.stderr)) # my_Reporter是pyflakes.reporter的拓展