用Python也一年多了,但是发现自己依然总是在一些很简单但是容易出错的地方反复出错和纠结,耽误时间,于是决定把自己遇到的问题总结一下~
1、删除列表元素
这个应该是很常见的问题了
这样写的问题在于当一边遍历一边删除时,当删除一个元素时(比如1),下一次遍历的元素不再是2而是3。并没有对所有元素进行遍历。
这样写的问题在于,一开始a的元素个数为7,随着遍历过程中的元素删除,总的元素个数减少,而i依然会从0遍历到6,这就导致了index out of range error。
一种正确的写法:反向遍历
2、修改列表元素
!好几次没注意在这个地方出了问题。注意在循环中需要修改变量时,需要采用for in range()的形式,直接for x in a是无法修改a中的元素的。
3、赋值与复制
4、函数传参
写了这么久代码刚刚才知道传入list作为函数的参数,其原本的值是会被函数内相应的操作改变的。汗颜
原来python里有可变对象和不可变对象之分。只有传入的是不可变对象时,值才不发生改变,若是可变对象,充当函数参数时要注意了。
不可变对象:Number ,String , Tuple,bool
可变对象: List , Set , Dictionary是可以改变内部的元素
5、random.randint()
random.randint(a,b)随机返回[a,b]内的整数
6、整数除法
7、namedtuple
namedtuple作为一个很有用的工具,能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代,更能够方便的通过属性名来访问数据。
需要注意的namedtuple拥有和tuple一样的性质:不能修改,可以通过_replace()来实现修改数据。
8、exec
exec(source, globals=None, locals=None, /)
在全局变量和局部变量的上下文下执行source对应的字符串
最近的遇到的一个bug,折腾了好久:
exec命令在主函数下执行没有问题,但是在class类中,使用exec无法直接使用变量。
一种解决方法如下:
# encoding: utf-8
class tess(object):
def __init__(self):
self.__globals__ = {}
self.__locals__ = self.__globals__
def ex(self):
sa = 'a=1'
exec(sa, self.__globals__, self.__locals__)
print(self.__globals__['a'])
s = tess()
s.ex()
9、保存list
训练模型时有时候需要保存各个epoch的损失,这里记录一下将list形式的loss保存为csv的方法
import numpy as np
train_a_loss = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3]
eval_a_loss = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3]
train_b_loss = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3]
eval_b_loss = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3]
data_array = np.array([train_a_loss, eval_a_loss, train_b_loss, eval_b_loss])
np.savetxt('loss.csv', data_array, delimiter=",")
data = np.loadtxt('loss.csv', delimiter=",")