使用python常用的一些技巧(持续更新)

最近在看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 : 把车给我

参考文章:

  1. Python的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

参考文章:

  1. stackoverflow: How to initialize a SimpleNamespace from a dict [duplicate]
  2. 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']

在这里插入图片描述

持续更新…

猜你喜欢

转载自blog.csdn.net/alxe_made/article/details/84800331