【问题标题】:I couldn't understand the cause of that name error我无法理解该名称错误的原因
【发布时间】:2019-08-10 16:16:52
【问题描述】:

我正在尝试解决http://rosalind.info/problems/list-view/ 的问题,其中有一个称为 IPRB 的问题。简而言之,我们有 3 种不同的生物体 k(纯合子显性)、m(杂合子)和 n(纯合子隐性)。它要求您计算两个随机选择的个体的后代具有显性等位基因的概率。您可以从这里查看 (http://rosalind.info/problems/iprb/)。

我的问题是;我用示例输入(2、2、2 表示 k、m、n)编写了一个工作代码,并得到了估计的输出。但是,当输入值彼此不同(即 25、20、18)时,我收到如下错误消息:

Traceback(最近一次调用最后一次): 文件“C:/Users/mNm/PycharmProjects/PySummer/venv/Scripts/IPRB.py”,第 43 行,在 pr3 = 浮动(pr31 + pr32 + pr33) NameError: 名称 'pr31' 未定义

我已经在网上研究了该代码的原因。似乎此错误与名称定义有关,例如使用后定义或功能外定义等。但是我检查时没有任何名称。总之,我不知道如何解决它,我决定在这里问。

k = 2
m = 2
n = 2

whole = k + m + n
org = [k, m, n]

我有 3 个变量和一个保存它们的列表。输入工作正常,但是......

例如当它是这样的:

k = 25
m = 25
n = 19

whole = k + m + n
org = [k, m, n]

我得到错误:

Traceback(最近一次调用最后一次): 文件“C:/Users/mNm/PycharmProjects/PySummer/venv/Scripts/IPRB.py”,第 43 行,在 pr3 = 浮动(pr31 + pr32 + pr33) NameError: 名称 'pr31' 未定义

第 43 行在这里:

    if i == n:
        n_start = float(n / whole)
        for j in org:
            if j == k:
                pr31 = float(n_start * (k / (whole - 1)))
            if j == m:
                pr32 = float(n_start * (m / (whole - 1)) * 0.5)
            if j == n:
                pr33 = float(n_start * ((n - 1) / (whole - 1)) * 0)

43 --> pr3 = float(pr31 + pr32 + pr33)

如果您想查看整个内容并进行检查,我也想粘贴我的完整代码。

k = 2
m = 2
n = 2

whole = k + m + n
org = [k, m, n]

for i in org:
    if i == k:
        k_start = float(k/whole)
        for j in org:
            if j == k:
                pr11 = float(k_start * ((k - 1) / (whole - 1)))
            if j == m:
                pr12 = float(k_start * (m / (whole - 1)))
            if j == n:
                pr13 = float(k_start * (n / (whole - 1)))

    pr1 = float(pr11 + pr12 + pr13)

    if i == m:
        m_start = float(m/whole)
        for j in org:
            if j == k:
                pr21 = float(m_start * (k / (whole - 1)))
            if j == m:
                pr22 = float(m_start * ((m - 1) / (whole - 1)) * 0.75)
            if j == n:
                pr23 = float(m_start * (n / (whole - 1)) * 0.5)

    pr2 = float(pr21 + pr22 + pr23)

    if i == n:
        n_start = float(n / whole)
        for j in org:
            if j == k:
                pr31 = float(n_start * (k / (whole - 1)))
            if j == m:
                pr32 = float(n_start * (m / (whole - 1)) * 0.5)
            if j == n:
                pr33 = float(n_start * ((n - 1) / (whole - 1)) * 0)

    pr3 = float(pr31 + pr32 + pr33)

dom_pr = float(pr1 + pr2 + pr3)

print(dom_pr)

我希望输出介于 0-1 之间,因为这是一个概率,但更重要的是了解导致该错误的原因以及我做错了什么。

【问题讨论】:

  • 例如,p21p22p23 当且仅当 i == m 时才定义,对吗?然而,pr2 = float(pr21 + pr22 + pr23)在任何情况下都是计算出来的,即使在 i != m 时也是如此。那么,当您尝试添加一些...不存在的变量时会发生什么?一个`NameError`。
  • 这实际上是正确的。我是新手,所以我错过了这一点。非常感谢。如果您将其写为答案,我会检查它是否为正确答案。

标签: python-3.x bioinformatics nameerror rosalind


【解决方案1】:

这对我来说看起来不错,但如果您仍然遇到错误,请尝试覆盖 try catch 块内的 i 循环。

try:
    k = 25
    m = 20
    n = 19
    whole = k + m + n
    org = [k, m, n]
    for i in org:
        if i == k:
        k_start = float(k/whole)
        for j in org:
            if j == k:
                pr11 = float(k_start * ((k - 1) / (whole - 1)))
            if j == m:
                pr12 = float(k_start * (m / (whole - 1)))
            if j == n:
                pr13 = float(k_start * (n / (whole - 1)))

    pr1 = float(pr11 + pr12 + pr13)

    if i == m:
        m_start = float(m/whole)
        for j in org:
            if j == k:
                pr21 = float(m_start * (k / (whole - 1)))
            if j == m:
                pr22 = float(m_start * ((m - 1) / (whole - 1)) * 0.75)
            if j == n:
                pr23 = float(m_start * (n / (whole - 1)) * 0.5)

    pr2 = float(pr21 + pr22 + pr23)

    if i == n:
        n_start = float(n / whole)
        for j in org:
            if j == k:
                pr31 = float(n_start * (k / (whole - 1)))
            if j == m:
                pr32 = float(n_start * (m / (whole - 1)) * 0.5)
            if j == n:
                pr33 = float(n_start * ((n - 1) / (whole - 1)) * 0)

                pr3 = float(pr31 + pr32 + pr33)

                dom_pr = float(pr1 + pr2 + pr3)
except Exception as e:
    dom_pr=None
    print(e)
print(dom_pr)

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 2015-10-05
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多