

`short.sequ.txt`から`>YP`で始まる行をそのままprintし、その次の行から空白を認識するまでの文字数をカウントする。  
この作業を繰り返し行い、最大の文字数と最大の文字数の時の`>YP`の行を最終的にprintしたいと思ってます。  
最大値が見つかるたびにmax_lenとmax_proteinを更新したいです。（最小値も同じく）

global変数を用いて作成したのですが、できればglobal変数を使わずにこのようなコードを書きたいと思ってます。  
その場合、global変数をどういったものに変えたらいいのかわからないので教えていただきたいです。  
宜しくお願い致します。

[code]

    with open("short.sequ.txt") as f:
    
        max_len = 0
        max_protein = ""
    
        min_len = 10000000000000
        min_protein = ""
    
        def change(protein, seq):
            global max_len,max_protein,min_len,min_protein
            seq_len = len(seq)
            if seq_len == 0:
                return
    
            else:
                print([seq_len])
    
            if seq_len > max_len:
                max_len,max_protein,min_len,min_protein = seq_len,protein,seq_len,protein
    
            if seq_len < min_len:
                min_len,min_protein = seq_len,protein
    
    
        a_line = ""
        a_seq = ""
    
        for line in f:
            strip_line = line.rstrip()
            if strip_line.startswith(">"):
                a_line = strip_line
                change(a_line, a_seq)
                a_seq = ""
                print(strip_line+'\n')
            else:
                #A = [len(a_seq+strip_line)]
                a_seq += strip_line
    msg1 = "最大アミノ酸エントリ："
    msg2 = "長さ："
    msg3 = "最小アミノ酸エントリ："
    print(msg1,max_protein,msg2,max_len)
    print(msg3,min_protein,msg2,min_len)
    
[/code]

**short.sequ.txt**

[code]

    >YP_009518834.1 putative uncharacterized protein YjiT [Escherichia coli str. K-12 substr. MG1655]
    MGQSEYISWVKCTSWLSNFVNLRGLRQPDGRPLYEYHATNDEYTQLTQLLRAVGQSQSNICNRDFAACFV
    LFCSEWYRRDYERQCGWTWDPIYKKIGISFTATELGTIVPKGMEDYWLRPIRFYESERRNFLGTLFSEGG
    LPFRLLKESDSRFLAVFSRILGQYEQAKQSGFSALSLARAVIEKSALPTVFSEDTSVELISHMADNLNSL
    VLTHNLINHKEPVQQLEKVHPTWRSEFPIPLDDETGTHFLNGLLCAASVEAKPRLQKNKSTRCQFYWSEK
    HPDELRVIVSLPDEVSFPVTSEPSTTRFELAICEDGEEVSGLGPAYASLENRQATVRLRKSEVRFGRQNP
    SAGLSLVARAGGMIVGSIKLDDSEIAIGEVPLTFIVDADQWLLQGQASCSVRSSDVLIVLPRDNSNVAGF
    DGQSRAVNVLGLKALPVKGCQDVTVTANETYRIRTGREQISIGRFALNGKRASWVCHPDETFIGVPKVIS
    TLPDIQSIDVTRYTC
    
    >YP_009518833.1 uncharacterized protein YtiA [Escherichia coli str. K-12 substr. MG1655]
    MKEFLFLFHSTVGVIQTRKALQAAGMTFRVSDIPRDLRGGCGLCIWLTCPPGEEIQWVIPGLTESIYCQQ
    DGVWRCIAHYGVSPR
    
    >YP_009518832.1 iraD leader peptide [Escherichia coli str. K-12 substr. MG1655]
    MENEHQYSGARCSGQAAYVAKRQECAK
    
    >YP_009518831.1 protein YtiD [Escherichia coli str. K-12 substr. MG1655]
    MADYAEINNFPPELSSSGDKYFHLRNYSEYSEYTSGFFLSLMIFIKS
    
    >YP_009518830.1 protein YtiC [Escherichia coli str. K-12 substr. MG1655]
    MPVNGIFDVFDMLSIYIIYKLIVSNNTWLIMRK
    
    >YP_009518829.1 putative YjfA [Escherichia coli str. K-12 substr. MG1655]
    MHMVTYPCLTSRRFQLALIHRRVVDKRTSMHSRTASESTGARIHRPWCARHQVRPAWRCQYDKLHRVPFR
    SPELRLDSGPGYTTGSYRY
    
[/code]


CC BY-SA 4.0
2019-01-06T09:25:42.580
51754
2019-01-06T13:02:19.733
2019-01-06T13:02:19.733
3060
31682
question
python
global変数を使わずにコードを機能させたい


以下では、`short.sequ.txt` の内容を空行(`\n\n`)で分割して、個々の protein sequence の長さでソートしています。

[code]

    import re
    
    msg1 = "最大アミノ酸エントリ："
    msg2 = "長さ："
    msg3 = "最小アミノ酸エントリ："
    
    with open("short.sequ.txt") as f:
      assoc = {}
      for p in f.read().split("\n\n"):
        if not re.match('^>YP_', p): continue
        arr = p.split("\n")
        assoc[arr[0]] = sum(map(len, arr[1:]))
      sa = sorted(assoc.items(), key=lambda x: x[1])
    
      print('{} {}\n{} {}'.format(msg1, sa[-1][0], msg2, sa[-1][1]))
      print('{} {}\n{} {}'.format(msg3, sa[0][0], msg2, sa[0][1]))
    
    =>
    最大アミノ酸エントリ： >YP_009518834.1 putative uncharacterized protein YjiT [Escherichia coli str. K-12 substr. MG1655]
    長さ： 505
    最小アミノ酸エントリ： >YP_009518832.1 iraD leader peptide [Escherichia coli str. K-12 substr. MG1655]
    長さ： 27
    
[/code]


CC BY-SA 4.0
2019-01-06T12:06:15.737
51758
2019-01-06T12:39:13.063
2019-01-06T12:39:13.063
51754
answer