2

私は現在、定義関数をカバーする演習に取り組んでおり、すべてのサポート関数をメインに配置することに関して問題が発生しました。

これが元のコードの外観です..

fn = input('Enter filename: ')
f = open(fn)
f.readline()  # Skip the first two lines
f.readline()
line = f.readline()  # Line containing site info
stuff = line.split(',')
print('\nSite: {}.\n(lat, long) = ({}, {})'.format(stuff[0], stuff[3], stuff[4]))

# Now process body of file, accumulating monthly rainfalls.

f.readline()
f.readline()
f.readline()
f.readline()
f.readline()
f.readline()

line = f.readline()
stuff = line.split(',')
rfs = 12 * [0]  # Rainfall totals for months
while len(stuff) > 1:
    date = stuff[1]
    m = int(date[4:6])   # Month
    rainfall = float(stuff[2])
    rfs[m - 1] += rainfall
    line = f.readline()
    stuff = line.split(',')

# Print results

months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
print('\nMonth  Rainfall')
for i in range(12):
    print(' {} {:6.1f}'.format(months[i], rfs[i]))

print('\nTotal rainfall = {:.1f}'.format(sum(rfs)))
f.close()

これは出力されます..

Enter filename:
Site: Christchurch Aero.
(lat, long) = (-43.493, 172.537)

Month  Rainfall
 Jan   58.0
 Feb   35.4
 Mar   54.2
 Apr   50.8
 May   52.6
 Jun   41.0
 Jul   29.4
 Aug   62.6
 Sep   21.4
 Oct   90.8
 Nov   63.6
 Dec   60.8

Total rainfall = 620.6

このコードを個別の関数に分割しようとしましたが、コードを実行しようとするとフリーズするだけで、根本的な問題が何であるかわかりません。これが私が持っているものです..

def main():
    '''Main function, opens the text file, reads and then prints the
    relevant info'''
    file_input = input('Enter filename: ')
    file = open(file_input)

    file.readline()
    file.readline()

    site_line = file.readline()  # Line containing site info
    site_info = site_line.split(',')
    print('\nSite: {}.\n(lat, long) = ({}, {})'.
          format(site_info[0], site_info[3], site_info[4]))

    rfs = rainfall_function(file)

    print_rainfall(rfs)

def rainfall_function(file):
    '''Read text file for the required data and process the information'''   
    file.readline()
    file.readline()
    file.readline()
    file.readline()
    file.readline()
    file.readline()  

    rain_line = file.readline()
    rain_info = rain_line.split(',')
    rfs = 12 * [0]  # Rainfall totals for months
    while len(rain_info) > 1:
        date = rain_info[1]
        month = int(date[4:6])   # Month
        rainfall = float(rain_info[2])
        rfs[month - 1] += rainfall
    return rfs


def print_rainfall(rfs):
    '''Months to print rainfall statistics for'''
    months = ['Jan', 'Feb', 'Mar', 'Apr', ' May', 'Jun', 
              'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    print('\nMonth  Rainfall')

    for i in range(12):
        print(' {} {:6.1f}'.format(months[i], rfs[i]))

    print('\nTotal rainfall = {:.1f}'.format(sum(rfs)))     

main()

助けてくれてありがとう!!

4

1 に答える 1

5

私はあなたのコードを実行しようとはしていませんが、明らかな無限ループがあります:

while len(rain_info) > 1:
        date = rain_info[1]
        month = int(date[4:6])   # Month
        rainfall = float(rain_info[2])
        rfs[month - 1] += rainfall

len(rain_info) > 1これは、ループ内で の長さを変更しない限りループしますrain_info。したがって、このループに入ると、二度と出ることはありません。

print()ステートメントを挿入して、コードが何を行っているかを確認すると便利なことがよくあります。このループの前後にプリントがある場合、前のプリントが表示され、後は表示されません。ループ内にプリントがあれば、繰り返し表示されます。

コードをシングルステップ化することも役に立ちます。Python で使用できるデバッガーはいくつかあります。私が使用したのは、Wingware IDE のものです。学生向けの無料版があります。

編集:元のコードを見ると、無限ループがなかった理由がわかります。次の行が含まれます。

while len(stuff) > 1:
    # ...lines omitted...
    line = f.readline()
    stuff = line.split(',')

したがって、ループが実行されるたびに、別の入力行を読み取ろうとし、取得した行を分割します。元の while ループは に依存してlen(stuff)いるため、ループ内のコードの結果としてループが終了する可能性があります。

于 2013-05-10T02:33:05.843 に答える