首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于L立方体的情感反映分类

基于L立方体的情感反映分类
EN

Code Review用户
提问于 2014-12-29 21:18:40
回答 1查看 441关注 0票数 5

背景

我创建了一个简单的类来反映基于L的立方体的情感分类。这段代码一点也不科学,我只是为了好玩才这么做的,但我希望我编写的所有代码都尽可能地具有Pythonic和效率,所以我希望能得到一些帮助来重构它。

编码目的

Emoter类摄取5-羟色胺、多巴胺和去甲肾上腺素水平,通过set_levels功能决定情绪者的情绪。每个神经递质的“高”、“低”和“正常”水平的阈值取决于过去的经验,而超出可接受范围的值会杀死Emoter

回顾目标

我希望使我的代码尽可能高效和可读性,因此欢迎任何建议。

代码语言:javascript
复制
class Emoter:
    """
    Create an instance of the class with a name.
    Use set_levels to set neurotransmitter levels for dopamine, serotonin, and noradrenaline.
    Check current emotion with emotion attribute.
    """
    def __init__(self, name):
        self.name = name
        self.status = "alive"
        self.thresholds = {}
        self.level = {}
        self.count = {}
        self.thresholds["dopamine"] = [0, 25, 75, 100]
        self.thresholds["noradrenaline"] = [0, 25, 75, 100]
        self.thresholds["serotonin"] = [0, 25, 75, 100]
        self.level["dopamine"] = "normal"
        self.level["noradrenaline"] = "normal"
        self.level["serotonin"] = "normal"
        self.count["dopamine"] = 1
        self.count["noradrenaline"] = 1
        self.count["serotonin"] = 1
        self.emotion = "NEUTRAL"

    def __adjust_thresholds(self, neurotransmitter):
        """
        Adjusts thresholds for neurotransmitter level evaluations.
        A very rudimentary function meant to reflect the effects of LTP and LTD.
        Sort of.
        """
        if self.count[neurotransmitter] > 3:
            if self.level[neurotransmitter] is "low":
                print(self.name + "'s " + neurotransmitter + " levels have " +
                      "been " + self.level[neurotransmitter] + " lately, " +
                      "resulting in decreased sensitivity.")
                self.thresholds[neurotransmitter][1] = self.thresholds[neurotransmitter][1] + 1
                if self.thresholds[neurotransmitter][1] >= self.thresholds[neurotransmitter][2] - 1:
                    self.thresholds[neurotransmitter][2] = self.thresholds[neurotransmitter][2] + 1
            elif self.level[neurotransmitter] is "high":
                print(self.name + "'s " + neurotransmitter + " levels have " +
                      "been " + self.level[neurotransmitter] + " lately, " +
                      "resulting in increased sensitivity.")
                self.thresholds[neurotransmitter][2] = self.thresholds[neurotransmitter][2] - 1
                if self.thresholds[neurotransmitter][2] <= self.thresholds[neurotransmitter][1] - 1:
                    self.thresholds[neurotransmitter][1] = self.thresholds[neurotransmitter][1] - 1
        if self.count[neurotransmitter] > 5:
            if (self.level[neurotransmitter] is "normal" and
                self.thresholds[neurotransmitter][2] < self.thresholds[neurotransmitter][3] - 1 and
                self.thresholds[neurotransmitter][1] > self.thresholds[neurotransmitter][0] + 1):
                print(self.name + "'s " + neurotransmitter + " levels have " +
                      "been " + self.level[neurotransmitter] + " lately, " +
                      "resulting in increased resilience.")
                self.thresholds[neurotransmitter][2] = self.thresholds[neurotransmitter][2] + 1
                self.thresholds[neurotransmitter][1] = self.thresholds[neurotransmitter][1] - 1

    def __add_count(self, neurotransmitter, level):
        """
        Counts the number of times a subject has been recorded at a given
        neurotransmitter level.
        """
        if self.level[neurotransmitter] is level:
            self.count[neurotransmitter] = self.count[neurotransmitter] + 1
        else:
            self.count[neurotransmitter] = 1

    def __adjust_levels(self, neurotransmitter, level):
        """
        Changes neurotransmitter level evaluations based on exact levels.
        Also counts the number of times the subject has recorded being at that
        level and what, if any, changes should be made to their thresholds.
        """
        if self.status is "alive":
            if level in range(self.thresholds[neurotransmitter][0],
                              self.thresholds[neurotransmitter][1]):
                self.__add_count(neurotransmitter, "low")
                self.level[neurotransmitter] = "low"
                self.__adjust_thresholds(neurotransmitter)
            elif level in range(self.thresholds[neurotransmitter][1],
                                self.thresholds[neurotransmitter][2]):
                self.__add_count(neurotransmitter, "normal")
                self.level[neurotransmitter] = "normal"
                self.__adjust_thresholds(neurotransmitter)
            elif level in range(self.thresholds[neurotransmitter][2],
                                self.thresholds[neurotransmitter][3]):
                self.__add_count(neurotransmitter, "high")
                self.level[neurotransmitter] = "high"
                self.__adjust_thresholds(neurotransmitter)
            else:
                print("BOOM! " + self.name + " is dead!")
                self.status = "dead"

    def set_levels(self, dopamine, noradrenaline, serotonin):
        """
        Set neurotransmitter levels. Different levels result in different
        emotions. Consistently high or low levels can lead to increased or
        decreased sensitivity to the neurotransmitter. 
        """
        self.__adjust_levels("dopamine", dopamine)
        self.__adjust_levels("noradrenaline", noradrenaline)
        self.__adjust_levels("serotonin", serotonin)
        self.__determine_emotion()

    def __determine_emotion(self):
        """
        This needs emotions for when one or more neurotransmitters are within
        normal ranges.
        """
        if (self.level["dopamine"] is "high" and
            self.level["noradrenaline"] is "high" and
            self.level["serotonin"] is "high"):
            self.emotion = "INTEREST/EXCITEMENT"
        elif (self.level["dopamine"] is "high" and
              self.level["noradrenaline"] is "high" and
              self.level["serotonin"] is "low"):
            self.emotion = "ANGER/RAGE"
        elif (self.level["dopamine"] is "high" and
              self.level["noradrenaline"] is "low" and
              self.level["serotonin"] is "high"):
            self.emotion = "ENJOYMENT/JOY"
        elif (self.level["dopamine"] is "low" and
              self.level["noradrenaline"] is "high" and
              self.level["serotonin"] is "high"):
            self.emotion = "SURPRISE"
        elif (self.level["dopamine"] is "high" and
              self.level["noradrenaline"] is "low" and
              self.level["serotonin"] is "low"):
            self.emotion = "FEAR/TERROR"
        elif (self.level["dopamine"] is "low" and
              self.level["noradrenaline"] is "high" and
              self.level["serotonin"] is "low"):
            self.emotion = "CONTEMPT/DISGUST"
        elif (self.level["dopamine"] is "low" and
              self.level["noradrenaline"] is "low" and
              self.level["serotonin"] is "high"):
            self.emotion = "DISTRESS/ANGUISH"
        elif (self.level["dopamine"] is "low" and
              self.level["noradrenaline"] is "low" and
              self.level["serotonin"] is "low"):
            self.emotion = "SHAME/HUMILIATION"
        else:
            self.emotion = "NEUTRAL"

subject = Emoter("Subject 001")
subject.set_levels(20, 80, 20)
print(subject.emotion)
subject.set_levels(20, 20, 20)
print(subject.emotion)
subject.set_levels(20, 80, 80)
print(subject.emotion)
subject.set_levels(20, 20, 80)
print(subject.emotion)
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-12-29 22:19:17

is比较实例标识。

==比较等式。

不能保证将两个等效字符串嵌入到同一个实例中。

代码语言:javascript
复制
>>> a = 'x'*30
>>> b = 'x'*30
>>> a is b
False
>>> a == b
True
>>> 

即使有保证,仍然应该使用与代码实际意图相匹配的比较运算符。

下面的操作很难读懂:

代码语言:javascript
复制
self.thresholds[neurotransmitter][1] = self.thresholds[neurotransmitter][1] + 1
if self.thresholds[neurotransmitter][1] >= self.thresholds[neurotransmitter][2] - 1:
    self.thresholds[neurotransmitter][2] = self.thresholds[neurotransmitter][2] + 1

由于这三行中的大多数字符是相同的,它需要读者工作,以找到差异。这是不好的,因为差异是最重要的部分。代码应该使这些方面脱颖而出。

一旦您认识到了这些差异,仍然不清楚代码意味着做什么。将这些代码的全部或部分提取到描述性命名的子方法中,将极大地提高代码的可读性。

代码语言:javascript
复制
print(self.name + "'s " + neurotransmitter + " levels have " +
      "been " + self.level[neurotransmitter] + " lately, " +
      "resulting in decreased sensitivity.")

Python有一个很好的字符串格式API,您应该使用它。

代码语言:javascript
复制
print("{}'s {} levels have been {} lately, resulting in decreased sensitivity.".format(self.name, neurotransmitter, self.level[neurotransmitter]))

幻数:把他们从你的代码中拿出来。为什么数到3是有意义的?它与5有什么关系?如果我需要增加3,这是否意味着5也要增加?代码中的所有3s都意味着相同的东西吗?给常量命名并给它们上下文。

最重要的是,将索引显式地添加到列表中意味着每个索引都有重要意义。如果self.thresholds[neurotransmitter][1]self.thresholds[neurotransmitter][2]不同,它们应该有表明这一点的名称。简单的数据类或命名的元组将更好地替代具有重要索引的列表。如果我不正确地解释这个列表,那是因为代码没有清楚地说明这个列表是用来做什么的。

有许多情况下,您访问self.levelself.thresholdsself.count的特定神经递质。这样就可以删除不同的字典,然后用一个字典来替换,该字典将神经递质映射到包含levelthresholdscounts的数据类。

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

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

复制
相关文章

相似问题

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