передача переменной из цикла в условный оператор

1

У меня есть эта функция в моей программе.

def time(transcriptionFile) :
    ''' This function changes the time values in secs from the transcription file and keeps a list of start time and duration for each phoneme.'''
    with open("transcriptions.txt", "r") as tFile :
        timeList = []
        parameterList = []
        frame = 0.04
        lines = 0
        for line in tFile :
            lines += 1
            for i in range(lines) : 
                i = i * frame
            timeList.append(i)
            li = line.split()
            if li :
                start_time = (int(li[0]) / 10000000.)
                end_time = (int(li[1]) / 10000000.) 
                duration = ((int(li[1]) -int(li[0]))/10000000.)

                poly = poly_coeff(start_time, end_time, i)
                Newton(poly, parameterList) 

Я хочу использовать i в качестве аргумента в poly_coeff. Количество вызовов этой функции - это количество строк в файле. И i увеличиваю каждую строку. Поэтому, когда функция вызывается в первый раз, первое значение i должно быть передано как аргумент, а затем второй раз второе значение i должно быть передано и так далее.

Я, конечно, сделал это неправильно здесь, я вижу, но не могу понять, как это сделать правильно. Также, я думаю, слишком много происходит внутри одной функции. Лучше разбить его? Но все это связано с открытием того же файла.

Теги:

3 ответа

1
Лучший ответ

Если вы хотите номер строки, вы должны сделать

poly = poly_coeff(start_time, end_time, lines)

Если вы хотите использовать рамку номера строки *, то сделайте

poly = poly_coeff(start_time, end_time, lines * frame)

Я не знаю, что вы пытаетесь сделать с

for i in range(lines) : 
    i = i * frame
  • 0
    да, я мог бы сделать это У меня должен быть список строк * frame, чтобы я использовал цикл for. Спасибо
0

edit: Похоже, что у вас может быть ошибка с отступом, вы намеревались иметь все, начиная с timelist.append(i) внутри цикла с i? Это имеет смысл.

        ...
        for i in range(lines): 
            i = i * frame
            timeList.append(i)
            li = line.split()
            if li :
                start_time = (int(li[0]) / 10000000.)
                end_time = (int(li[1]) / 10000000.) 
                duration = ((int(li[1]) -int(li[0]))/10000000.)

                poly = poly_coeff(start_time, end_time, i)
                Newton(poly, parameterList) 

Если отступ правилен, то я не думаю, что для цикла с i выполняется то, что вы думаете, вот пример того, что происходит:

>>> for i in range(3):
...   print "before", i
...   i = i * 0.04
...   print "after", i
... 
before 0
after 0.0
before 1
after 0.04
before 2
after 0.08
>>> print i
0.08

Таким образом, в принципе, после того, как цикл i эквивалентен (lines-1)*frame. Вы меняете i во время каждой итерации цикла, но оно возвращается к следующему номеру в диапазоне в начале каждой итерации.

  • 0
    Мне нужно составить список увеличивающихся значений i, поэтому я использовал его, и он давал мне правильные значения. Спасибо
0

i находится только в пределах области for. Добавьте перед ним декларацию, чтобы потом получить доступ к ней.

<snip>
for line in tFile :
            lines += 1
            i = 0
            for i in range(lines) : 
                i = i * frame
<snip>

... и да, я голосую за более функциональное программирование; немного сломайте его, чтобы сделать его более читаемым.

  • 0
    Это на самом деле неверно, циклы не создают новую область, и любые имена, созданные в цикле, могут использоваться после.
  • 0
    @FJ Я тоже так думал, пока не попробовал урезанную версию его кода, и он потерпел неудачу с переменной неинициализированной ошибкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню