Вопреки другим ответам здесь, я думаю, вы должны использовать модуль csv
. Если ваши файлы содержат заголовки или поля в кавычках, вы будете намного счастливее, чем если бы вы попытались изменить свое решение после того, как факт:
with open('filename') as infile:
r = csv.reader(infile, delimiter=' ', skipinitialspace=True)
for row in r:
print(row)
Ваш файл выглядит так, как будто на вашем компьютере он разделен табуляцией. В этом случае вы измените delimiter=' '
на delimiter='\t'
в приведенном выше.
Вы также можете использовать панд , который имеет более общий режим пробелов
df = pd.read_csv("filename", header=None, delim_whitespace=True)
Когда Вы вызываете функцию, она должна сделать то, что Вы ожидаете, что это сделает с аргументами, которые Вы даете ей. Если Вы вызовете функцию дважды точно таким же образом, то необходимо ожидать что функция давать Вам те же результаты или делать то же самое.
Вероятно, лучше переместить этот вызов однажды зависимость к логике, которая много раз вызывает Вашу функцию. Если только необходимо вызвать функцию, после того как затем только называют его однажды. С другой стороны, передайте различные аргументы функции, чтобы указать на выполнение чего-то другого.
Это действительно зависит от точно, что Вы имеете в виду. Если Ваш код будет вызван больше чем от одного потока, то у Вас есть состояние состязания, которое могло означать это doMyFunction
мог много раз называться. Это вызвано тем, что больше чем один поток мог проверить myStatus
, посмотрите, что это - ложь, затем вызовите doMyFunction
. Можно улучшить ситуацию немного путем установки переменной сначала:
if (!myStatus) {
myStatus = true;
doMyFunction();
}
но это только сужает окно для проблем, не устраняет его.
Для устранения состояния состязания Вам нужна блокировка.
Я не вижу никакой другой путь. Единственная вещь, которая приходит на ум о том, как улучшить это, - потокобезопасность. Но это только необходимо, если у Вас есть несколько потоков, вызывающих функцию.
В C/C++ можно обычно сохранять то, что doMyFunction () называют только когда-то инкапсулировавшим при помощи статической переменной как так:
void doMyFunction() {
// gets called only once.
// side effects go here.
}
void functionThatGetsCalledALot() {
static bool called = false;
if (!called) {
doMyFunction();
called = true;
}
// do more stuff
}
Это избегает использования globals, но имеет тот же эффект, и статический var объявляется правом, где это релевантно, таким образом, ясно, что продолжается. Обратите внимание, что это не ориентировано на многопотоковое исполнение, таким образом, Вам будет нужна блокировка, если у Вас будут потоки.
Это не ориентировано на многопотоковое исполнение. Это не могло бы иметь значения для Вас, но Вы действительно говорили "агностика языка": Вы, вероятно, не хотели бы использовать этот шаблон в библиотеке общего назначения для Java.
Это - трудный вопрос ответить агностическим языком способом, потому что доступные альтернативы очень зависят от языка. Например, на POSIX у Вас есть pthread_once при необходимости в потокобезопасности. В C у Вас есть статические локальные переменные для вытаскивания той булевской переменной из глобальной области видимости. На любом языке OO при взятии снимка "чего-то" для более позднего использования, затем мог бы быть подходящий объект, соответствующий "чему-то" (или к снимку), который мог сохранить флаг.
Я ничего не вижу неправильно с Вашим подходом здесь. Следует иметь в виду, что существует не всегда "Правильная" вещь... существуют определенно неправильные вещи, но что является правильным, может быть субъективным, и может также зависеть существенно на основе требований системы.
В Perl 5.10 или позже, Вы использовали бы a state
переменная.
use 5.010;
sub test{
state $once = 1;
if( $once ){
$once = undef;
say 'first';
} else {
say 'not first';
}
}
test for 1..5;
выводы
first not first not first not first not first