理解Python函数

时间:2015-06-01 22:05:48

标签: python function

我需要一些帮助来理解我想要使用的功能,但我不完全确定它的某些部分是做什么的。我知道该函数是从Fasta文件的读取创建字典。根据我的理解,这应该生成前缀和后缀词典,以最终扩展重叠群(重叠dna序列)。 代码:

def makeSuffixDict(reads, lenSuffix = 20, verbose = True):
    lenKeys = len(reads[0]) - lenSuffix
    dict = {}
    multipleKeys = []
    i = 1
    for read in reads:
        if read[0:lenKeys] in dict:
            multipleKeys.append(read[0:lenKeys])
        else:
            dict[read[0:lenKeys]] = read[lenKeys:]
        if verbose:
            print("\rChecking suffix", i, "of", len(reads), end = "", flush = True)
            i += 1
    for key in set(multipleKeys):
        del(dict[key])
    if verbose:
        print("\nCreated", len(dict), "suffixes with length", lenSuffix, \
            "from", len(reads), "Reads. (", len(reads) - len(dict), \
            "unambigous)")
    return(dict) 

其他信息:reads = readFasta("smallReads.fna", verbose = True)

这是函数的调用方式:

if __name__ == "__main__":
    reads = readFasta("smallReads.fna", verbose = True)
    suffixDicts = makeSuffixDicts(reads, 10)

smallReads.fna文件包含碱基字符串(Dna):

  

“>读取1

     

TTATGAATATTACGCAATGGACGTCCAAGGTACAGCGTATTTGTACGCTA

     

“>读取2

     

AACTGCTATCTTTCTTGTCCACTCGAAAATCCATAACGTAGCCCATAACG

     

“>阅读3

     

TCAGTTATCCTATATACTGGATCCCGACTTTAATCGGCGTCGGAATTACT

以下是我不理解的部分:

lenKeys = len(reads[0]) - lenSuffix

值[0]是什么意思?据我所知,“len”返回列表中的元素数量。 为什么“自动”读取列表?编辑:似乎Fasta文件可以声明为List。任何人都可以证实吗?

if read[0:lenKeys] in dict:

这是否意味着“从0到'lenKeys'”?仍然对价值感到困惑。 在另一个函数中有一个类似的行:if read[-lenKeys:] in dict: “ - ”做什么?

def makeSuffixDict(reads, lenSuffix = 20, verbose = True):

这里我不明白参数:reads如何成为参数?除了从lenSuffix = 20中减去的值之外,此函数上下文中的len(reads[0])是什么? 什么是冗长的?我已经阅读过关于“verbose-mode”忽略空格的内容,但我从未将其用作参数,后来又用作变量。

1 个答案:

答案 0 :(得分:3)

你问题的语气让我觉得你把程序功能(len,函数等)与原始程序员定义的东西(reads的类型混淆, verbose等。)

def some_function(these, are, arbitrary, parameters):
    pass

此函数定义了一堆参数。它们根本不是意味着任何东西,除了我隐含给它们的价值。例如,如果我这样做:

def reverse_string(s):
    pass

s可能是一个字符串,对吗?在您的示例中,我们有:

def makeSuffixDict(reads, lenSuffix = 20, verbose = True):
    lenKeys = len(reads[0]) - lenSuffix
    ...

从这两行我们可以推断出一些事情:

  • 该函数可能返回字典(来自其名称)
  • lenSuffixintverbosebool(来自默认参数)
  • reads可以编入索引(string?list?tuple?)
  • reads内的项目有长度(字符串?列表?元组?)

由于Python是动态类型的,因此到目前为止,这是关于该函数的所有我们都知道。其余的将通过其文档或其调用方式来解释。

那就是说:让我按顺序覆盖你所有的问题:

  1. 值[0]的含义是什么?
  2.   

    some_object[0]正在抓取容器中的第一项。 [1,2,3][0] == 1"Hello, World!"[0] == "H"。这称为索引,由__getitem__魔法

    管理
    1. 根据我的理解,“len”返回列表中元素的数量。
    2.   

      len是一个内置函数,它返回一个对象的长度。它由__len__魔法控制。 len('abc') == 3,也是len([1, 2, 3]) == 3。请注意len(['abc']) == 1,因为它正在测量列表的长度,而不是其中的字符串。

      1. 为什么“自动”读取列表?
      2.   

        reads是一个参数。它是调用范围传递给它的任何东西。它似乎确实期望一个列表,但这不是一个严格的规则!

        1. (关于切片的各种问题)
        2.   

          切片正在进行some_container[start_idx : end_idx [ : step_size]]。它完全符合您的期望:"0123456"[0:3] == "012"。切片索引被认为是零索引并且在元素之间放置,因此[0:1][0]相同,除了切片返回列表,不是单个对象(所以'abc'[0] == 'a'而是'abc'[0:1] == ['a'])。如果省略开始或结束索引,则将其分别视为字符串的开头或结尾。我不会在这里进步。

               

          负指数从后面开始计算,因此'0123456'[-3:] == '456'. Note that [ - 0] is not the last value, [ - 1] is. This is contrasted with [0]`是第一个值。

          1. 如何读取参数?
          2.   

            因为该函数定义为makeSuffixDict(reads, ...)。这就是参数

            1. 此函数的上下文中lenSuffix = 20是什么
            2.   

              看起来它是预期后缀的长度!

              1. 什么是verbose
              2.   

                verbose本身没有任何意义。这只是另一个参数。看起来作者包含了verbose标志,因此您可以在函数运行时获得输出。请注意,所有if verbose块似乎都没有,只是向用户提供反馈。