У меня есть эта функция в моей программе.
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
должно быть передано и так далее.
Я, конечно, сделал это неправильно здесь, я вижу, но не могу понять, как это сделать правильно. Также, я думаю, слишком много происходит внутри одной функции. Лучше разбить его? Но все это связано с открытием того же файла.
Если вы хотите номер строки, вы должны сделать
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
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
во время каждой итерации цикла, но оно возвращается к следующему номеру в диапазоне в начале каждой итерации.
i
находится только в пределах области for. Добавьте перед ним декларацию, чтобы потом получить доступ к ней.
<snip>
for line in tFile :
lines += 1
i = 0
for i in range(lines) :
i = i * frame
<snip>
... и да, я голосую за более функциональное программирование; немного сломайте его, чтобы сделать его более читаемым.