Python踩坑记录

2019-10-30  本文已影响0人  yumiii_

发现上一篇Python记录写到后面像是我的学习笔记了,还是单开一个记录一下踩坑吧。

1.字典
python3中,使用dict.keys()返回的是<class 'dict_keys'> 这个类型了,可以用list()转换成列表的形式

  1. ValueError: invalid literal for int() with base 10:
>>> int('5')
5
>>> float('5.0')
5.0
>>> float('5')
5.0
>>> int(5.0)
5
>>> float(5)
5.0
>>> int('5.0')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5.0'
>>> int(float('5.0'))
5

3.pandas读取的dataframe转列表:

pd_data = pd.read_csv(filename)
diseases = pd_data['DiseaseName'].tolist()
symptom = pd_data["symptom"].tolist()
disease_dict = dict(zip(diseases,symptom))

1⃣️df['a'].values.tolist()或者df['a'].tolist()都可,可以不要再傻了吧唧的知道长度之后再去遍历一个一个append到列表里了吗?
2⃣️已知有俩列表,可以用dict(zip())的形式把这转换成字典。

  1. 读取文件的时候,按照":"split,然后取data[1]报数组越界,可以检查一下是不是文件有问题吗??比如说可以打印一下是不是哪里切开之后长度不等于2,直接定位到有问题的那一行

5.三目运算

for i in range(query_length):
    found = process.extractOne(query[i], choices=disease_dict.keys(), score_cutoff=90)
    print(found)
    step1_dise.append(found[0] if found  else None)

我这里的found输出的有两种形式,一种是None,一种是(‘词’,数字)
step1_dise.append(found[0] if found else None) 这种是Python中的三目运算。

6.列表生成式
里面的if要和for一起用啊。。操。。基础不得行

7.关于执行顺序
这是在学习单元测试的时候发现的问题,关于if elif中判断子句的排序问题。下面这个类,是预期在分数>80时返回A,60<分数<80时返回B,60以下返回C,但在执行单元测试时,需要对<0和>100范围内的分数进行一个RaiseError的操作。

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def get_grade(self):
        if self.score >= 80:
            return 'A'
        elif self.score >= 60:
            return 'B'
        elif self.score <0 or self.score >100:
            raise ValueError("score error")
        else:
            return 'C'

单元测试代码如下:

class TestStudent(unittest.TestCase):

    def test_80_to_100(self):
        s1 = Student('Bart', 80)
        s2 = Student('Lisa', 100)
        self.assertEqual(s1.get_grade(), 'A')
        self.assertEqual(s2.get_grade(), 'A')

    def test_60_to_80(self):
        s1 = Student('Bart', 60)
        s2 = Student('Lisa', 79)
        self.assertEqual(s1.get_grade(), 'B')
        self.assertEqual(s2.get_grade(), 'B')

    def test_0_to_60(self):
        s1 = Student('Bart', 0)
        s2 = Student('Lisa', 59)
        self.assertEqual(s1.get_grade(), 'C')
        self.assertEqual(s2.get_grade(), 'C')

    def test_invalid(self):
        s1 = Student('Bart', -1)
        s2 = Student('Lisa', 101)
        with self.assertRaises(ValueError):
            s1.get_grade()
        with self.assertRaises(ValueError):
            s2.get_grade()

if __name__ == '__main__':
    unittest.main()

但始终过不了 test_invalid方法中的s2.get_grade(),其实考虑一下就知道在分数为101的时候走的是分数>80所以返回A的分支,所以RaiseError的操作应该放在分数判断的一开始,即:

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def get_grade(self):
        if self.score <0 or self.score >100:
            raise ValueError("score error")
        elif self.score >= 80:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'
上一篇 下一篇

猜你喜欢

热点阅读