碰到很多变量名时。
尤其是在处理数据的时候,会面临着数据名多而导致的代码冗杂问题。
比如说在读取数据的时候,如果目录、路径比较多,代码会比较冗杂。
但同时,绝对路径往往可以分割成主目录,文件序号,文件前缀名,文件后缀名等部分。
通过处理字符串,将字符串转化为变量,类内属性的赋值等方法可以简化代码。
当然,首先我们都知道使用数组(列表)来存储变量名,要把被重复调用的代码封装成函数或者类,然后将输入数据以参数的形式给它们,这是最基本的。
那如果不使用数组(列表)呢?
一、生成具有一定规律的字符串
利用Python 的 f
关键字,例子如下:
for i in range(5):str1 = f'{i**2}_question_{i+1}'print(str1)
输出:
0_question_1
1_question_2
4_question_3
9_question_4
16_question_5
二、对象属性赋值函数 setattr
利用 Python 内置的 为对象的属性赋值的函数 setattr 可以完成对象级别的具有规律性属性变量的赋值。
注意:需要取到该属性的值时,要用 getattr 内置函数。
例子
class Big:def __init__(self):passbig = Big()
for i in range(5):setattr(big, f'small{i+1}', np.random.rand(3))
for i in range(5):tmp_value = getattr(big, f'small{i+1}')print(tmp_value)
输出:
[0.14843873 0.54310117 0.22508172]
[0.6554616 0.49570728 0.41131248]
[0.93567319 0.24442312 0.17684138]
[0.2707888 0.11886321 0.87704171]
[0.32423134 0.81861119 0.89903461]
三、将字符串转换为变量
globals()
locals()
两个内置函数 能达到将字符串转换为变量的目的。
例子如下
例1
str = "list_path"
path1 = '/mnt/data3/home/data1/file1'
path2 = '/mnt/data3/home/data1/file2'
locals()[str] = [path1,path2]
print('\nlist_path type: ',type(list_path))
print('list_path value: ',list_path)
输出:
list_path type: <class 'list'>
list_path value: ['/mnt/data3/home/data1/file1', '/mnt/data3/home/data1/file2']
例2
dir_OnlyRGB = 'D:/Desktop/OnlyRGB/'
dir_DepthMSE = 'D:/Desktop/DepthMSE/'file_name_loss = 'save_list_loss_depth.npy'
file_name_psnr = 'save_list_psnr.npy'list_path_OnlyRGB = []
list_path_OnlyRGB.append(dir_OnlyRGB+file_name_loss)
list_path_OnlyRGB.append(dir_OnlyRGB+file_name_psnr)list_path_DepthMSE = []
list_path_DepthMSE.append(dir_DepthMSE+file_name_loss)
list_path_DepthMSE.append(dir_DepthMSE+file_name_psnr)list_loss_type = ['list_path_OnlyRGB','list_path_DepthMSE']for loss_type in list_loss_type:for path in globals()[loss_type]:print(path)
输出:
D:/Desktop/OnlyRGB/save_list_loss_depth.npy
D:/Desktop/OnlyRGB/save_list_psnr.npy
D:/Desktop/DepthMSE/save_list_loss_depth.npy
D:/Desktop/DepthMSE/save_list_psnr.npy
globals() :返回当前作用域内全局变量的字典
locals() 函数功能返回当前作用域内的局部变量的字典
四、glob函数 获取文件的全路径
self.color_paths = sorted(glob.glob(os.path.join(self.input_folder, 'colour', '*.png')))
参考
-
3 Ways to Convert String to Variable Name in Python
-
关键字local、global和内置函数【locals、globals】