首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >采访:药物分析器课程

采访:药物分析器课程
EN

Code Review用户
提问于 2021-07-30 17:55:51
回答 1查看 946关注 0票数 0

导言是:

你是一个生物技术编程小组的成员,该小组负责为实验室技术人员创建一个系统,该系统将协助他们进行药物分析。您的目标是创建一个应用程序,让他们将发现输入到系统中,提供有意义的分析,并验证他们发送的数据的正确性。任务:本部分的目标是实现app.drug_analyzer.DrugAnalyzer类。它将负责分析如下数据:+-----------+-------------+------------------+-------------+,pill_id,pill_weight,pill_weight,active_substance,active_substance,杂质+类的初始化可以从Python(或nothing)列表中完成,并存储在实例变量data中,如下所示:>>> my_drug_data =[....,.] >>> my_analyzer = DrugAnalyzer(my_drug_data) >>> my_analyzer.data [,,>,] >>> DrugAnalyzer().data []类还应该有一个选项将单个列表添加到对象中。向DrugAnalyzer对象添加一个列表应该会返回这个对象的一个新实例,其中包含一个额外的元素。添加不正确的类型或长度不正确的列表应该会引发ValueError。一个正确和错误的加法输出示例如下所示:>>> my_new_analyzer = my_analyzer + >>> my_new_analyzer.data [,,>,] >>> my_new_analyzer = my_analyzer + Traceback (最近的调用显示为最后一个):文件"",第1行,在 ValueError:添加列表的不正确长度中。第2部分在verify_series类中实现app.drug_analyzer.DrugAnalyzer方法。该方法的目标是接收参数列表,并使用它们来验证实例变量数据中描述的药丸是否符合给定的标准。因此,它应该返回一个布尔值。函数的调用方式如下: verify_series(series_id = 'L01',act_subst_wgt = 100,act_subst_rate = 0.05,allowed_imp = 0.001),其中:

  • series_id是一个3个字符长的字符串,出现在每个pill_id的开头,在符号之前;例如,L01pill_id = L01-12中的series_id
  • act_subst_wgt是一个药丸中给定系列中活性物质含量的预期重量(mg)。
  • act_subst_rate是活性物质重量与预期重量的允许差值。例如,对于100毫克,接受的数值将在95至105之间。
  • allowed_imppill_weight中允许的不纯物质的比率。例如,对于1000毫克pill_weight和0.001倍率,允许的杂质量是1毫克。

这个函数应该取所有属于L01系列的药丸,把它们的重量相加,并计算出active_substance的数量以及杂质是否与给定的速率相匹配。如果满足这两种条件,它应该返回True,如果没有满足条件,则返回FalseFalse结果表明,所有通过的参数都是适当的,但活性物质的数量或杂质的数量都不适当。如果数据中根本不存在series_id,或者参数不正确,则函数应该抛出一个ValueError。请想一想在这种情况下可能出现的边缘情况是什么。示例:>>> my_drug_data =[.,.] >>> my_analyzer = DrugAnalyzer(my_drug_data) >>> my_analyzer.verify_series(series_id = 'L01',act_subst_wgt = 100,act_subst_rate = 0.05,allowed_imp = 0.001)假>>> /总active_substances重量为198.88,在给定速率范围内为2 mg (2 * act_subst_wgt)。>>> //但杂质之和为3.00187,大于0.001*1999.92 (allowed_imp_rate * (1000.02±999.90) )。>>> my_analyzer.verify_series(series_id = 'L01',act_subst_wgt = 100,act_subst_rate =0.0001,allowed_imp = 0.0001) True >>> my_analyzer.verify_series(series_id = ' B03 ',act_subst_wgt = 100,act_subst_rate = 0.05,allowed_imp = 0.001)追溯(最近的调用显示为最后一个):文件"",第1行,在 ValueError: B03系列中不在数据集中。

my代码通过了所有的测试

在我第一次失败后,我试图使代码尽可能紧凑和轻巧,使用列表理解和消除不必要的变量,尽管它只给我的分数增加了5%。有人能告诉我我的代码出了什么问题吗?我怎样才能写出更好的代码?

我的最新代码

(得分: 58%)

代码语言:javascript
复制
  class DrugAnalyzer:
    def __init__(self, data):
        self.data = data

    def __add__(self, data):
        if len(data) == 4:
            if all(isinstance(i, float) for i in data[1:]) and isinstance(data[0], str):
                self.data = self.data + [data]
                return self
            else:
                raise ValueError('Improper type on list added')
        else:
            raise ValueError('improper length on list added')

    def verify_series(
        self,
        series_id: str,
        act_subst_wgt: float,
        act_subst_rate: float,
        allowed_imp: float,
    ) -> bool:
        pills = [pill for pill in self.data if series_id in pill[0]]
        if pills:
            return act_subst_wgt*len(pills)-(act_subst_wgt * len(pills) * act_subst_rate) < sum([i[2] for i in pills]) < act_subst_wgt*len(pills)+(act_subst_wgt * len(pills) * act_subst_rate) and sum([i[3] for i in pills]) < allowed_imp*sum([i[1] for i in pills])
        else:
            raise ValueError(f'There is no {series_id} series in database')

上一版

(得分: 55%)

代码语言:javascript
复制
class DrugAnalyzer():
    def __init__(self,data):
        self.data = data

    def __add__(self,data1):
        if len(data1) < 4:
            raise ValueError('improper lenght of list added')
        if type(data1[0]) == str:
            if type(data1[1]) and type(data1[2]) and type(data1[3]) == float:
                self.data = self.data + [data1]
                return self
            else:
                raise ValueError('Improper type on list added')
        else: raise ValueError('Improper type on list added')


    def verify_series(
        self,
        series_id: str,
        act_subst_wgt: float,
        act_subst_rate: float,
        allowed_imp: float,
    ) -> bool:
        serie = []
        for pill in self.data:
            if series_id in pill[0]:
                serie.append(pill)
                active = []
                imp = []
                weight = []
                print(serie)
                for pill in serie:
                    weight.append(pill[1])
                    active.append(pill[2])
                    imp.append(pill[3])

        if serie == 0:
            raise ValueError('the serie isnt in list')

        dif = (act_subst_wgt*len(serie))*act_subst_rate
        if  act_subst_wgt*len(serie)-dif < sum(active) < act_subst_wgt*len(serie)+dif and sum(imp) < allowed_imp*sum(weight):
            return True

        else:
            return False
EN

回答 1

Code Review用户

发布于 2021-07-31 05:16:55

我不知道代码是如何得分的,但是平坦比嵌套要好。如果您想要引发异常,请尽早进行。考虑一下

代码语言:javascript
复制
def __add__(self, data):
    if len(data) != 4:
        raise ValueError('improper length on list added')
    if not all(isinstance(i, float) for i in data[1:]) or not isinstance(data[0], str):
        raise ValueError('Improper type on list added')
    self.data = self.data + [data]
    return self

我也不清楚为什么你坚持data[1:]float。只要定义了Fraction<+D5就会正常工作,就像许多其他类型一样。

series_id是一个3个字符长的字符串,出现在每个pill_id的开头,在-符号之前。

我看不出这个需求是如何实现的。

代码语言:javascript
复制
        act_subst_wgt*len(pills)-(act_subst_wgt * len(pills) * act_subst_rate) < sum([i[2] for i in pills]) < act_subst_wgt*len(pills)+(act_subst_wgt * len(pills) * act_subst_rate) and sum([i[3] for i in pills]) < allowed_imp*sum([i[1] for i in pills])

是完全不可读的。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/265563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档