最近在看EDSR的pytorch代码,不得不佩服作者强大的代码的能力,这里列举一些个人觉得以后学习工作可能会用到的python函数,只是大概介绍一下使用。
1. 如何像linux命令行那样跑demo
argparse模块
现在一般跑深度学习都是使用命令行参数跑的,他会给我们的程序传递很多外部参数,这个可以参考我之前的文章Python命令行解析工具:Argparse简单使用
2. 如何利用python获取我们当前的时间
datetime.datetime.now()
可以参考PYTHON-基础-时间日期处理小结, 个人感觉这个还是比较详细的,常见的几种使用相互转换的方法都列举了。
3. 如何创建文件夹
os.mkdir()与os.makedirs()
参考文章os.mkdir()与os.makedirs()的区别.
简单来说,假如我们有多个路径的话,比如/home/xuchao/test1/test2/test3
,如果使用os.mkdir
那么它只是创建最后一个文件夹,这里是test3
,那么假如前面的文件夹不存在的话,那么就会出错啦。而os.makedirs
是可以将中间的文件夹都会创建的。
4. 如何扩展一幅图像的维度
numpy.expand_dims()
由于深度学习很多时候往往需要将一幅图像扩展成3维或者4维的tensor,所以这个函数就十分有用了。
5. 如何使用最简单的代码让一个list逆序输出
::-1
假如我们定义a=[1,2,3]
,那么我们如何将其逆序输出哩?使用a[::-1]
就OK了。这个::-1可以作用2、3维的array而实现flip操作。
6. 如何获取一个路径下的文件名
os.path.splitext() + os.path.basename()
假如我们有以下路径dir = /home/xuchao/pictures/test/hua.jpg
,那么我们使用代码os.path.splitext(os.path.basename(dir))[0]
就可以将'hua'
这个字符串分割出来了。具体用到的函数大家可以自己百度。
7. 如何匹配字符串
glob.glob()
很多时候我们需要搜索出某个路径下的所有的文件,这个时候我们使用glob.glob()
函数,比如这样使用sorted(glob.glob(os.path.join(dir, '*.png'))
可以匹配dir
目录下所有的png文件。
8 提取特定的字符串到列表中
split()
比如我们这样的字符串'1-800/801-810'
我们利用split()
函数可以达到切割字符串作用,
[r.split('-') for r in '1-800/801-810'.split('/')]
9.如何将list中的字符变成int类型
map
比如上面我们提取是['1','800']
那么我们怎样变成[1,800],使用list(map(lambda x: int(x), ['1','800']))
10 from import 和 import 不同
from import : 从车里把矿泉水拿出来,给我
import : 把车给我
参考文章:
11. 动态调用python的包
importlib.import_module
比如一下代码片段,细节不要太注意。
from importlib import import_module
...
for d in args.data_train:
module_name = d if d.find('DIV2K-Q') < 0 else 'DIV2KJPEG'
m = import_module('data.' + module_name.lower())
datasets.append(getattr(m, module_name)(args, name=d))
我们可以利用import_module实现动态导入包。 另外这里的getattr
也是一个超级强大的函数。通过 getattr 获取对象引用, What is getattr() exactly and how do I use it?
12. 如何快速判断一个数是否为2的整数幂
if (scale & (scale - 1)) == 0:
print(“ok!”)
由于2这个数在计算机中是一个比较特殊的数。计算机是以二进位制进行运算的。于是有了按位与,或,异或和非的运算。2的整数次幂都有一个共同的特点,就是以二进制表示后,首位为1其他位全为0(例如:4 二进制表示为100,8二进制表示1000)我们沿着这一思路进行分析,比2的整数次幂数小1的数,二进制表示都为首位为0其余位均为1(例如:7二进制表示0111)。这样,我们将n与n-1做按位与运算。判断一个数是否是2的整数次幂,python实现。
13. 如何使用.运算符访问字典
types.SimpleNamespace()
今天看到代码使用了SimpleNamespace, 他是和argparse模块一起出现的,很好奇这个是什么东西。经过一般摸索,大概掌握了基本的用法。 我们知道了argparse使用,他是最后返回来了个Namespace,而其实我们这个SimpleNamespace也是返回一个命名空间了。他可以接受命名关键字参数,然后我们就可以使用.运算符。
>> from types import SimpleNamespace
>>> d = {'a': 1, 'b':2}
>>> sn = SimpleNamespace(**d) # 这里的**不可以少,表示命名关键字参数
>>> sn
namespace(a=1, b=2)
>>> sn.a
1
参考文章:
- stackoverflow: How to initialize a SimpleNamespace from a dict [duplicate]
- class types.SimpleNamespace
14. 为什么只有一个元素的tuple要加逗号
这是为了区分tuple和普通()运算符
举例:
>> tup1 = ("all")
>> tup2 = ("all",)
>>print(tup1)
>>print(tup2)
all
("all",)
也就是说, 括号( )既可以表示tuple,又可以表示数学公式中的小括号。所以,如果元组只有1个元素,就必须加一个逗号,防止被当作括号运算。
15. 如何快速的访问一个目录
使用os.scandir()函数即可
从python3.5版本后有os.scandir(),能更快的遍历目录。更多介绍:os.scandir() function
# python 3.6
>>> for f in os.scandir():
... print(f)
...
<DirEntry 'Makefile.Debug'>
<DirEntry 'Makefile.Release'>
<DirEntry '.qmake.stash'>
<DirEntry 'Makefile'>
<DirEntry 'debug'>
<DirEntry 'release'>
可以看到返回的是DirEntry对象,下面列一些简单的属性与方法。
仅打印出名字(name属性):
# python 3.6.1
>>> [f.name for f in os.scandir()]
['Makefile.Debug', 'Makefile.Release', '.qmake.stash', 'Makefile', 'debug', 'release']
判断是否为文件:
# python 3.6.1
>>> [f.name for f in os.scandir() if f.is_file()]
['Makefile.Debug', 'Makefile.Release', '.qmake.stash', 'Makefile']
判断是否为文件夹:
# python 3.6.1
>>> [f.name for f in os.scandir() if f.is_dir()]
['debug', 'release']