цикл for печатает все значения, но возвращает только одно значение - PullRequest
0 голосов
/ 09 января 2019

Итак, у меня есть функция, которая перебирает все имена файлов в каталоге, открывает файлы yaml и получает два свойства: имя базы данных и имя коллекции. Когда я использую оператор print вместо return в моей функции, это выведет все имена файлов. Однако при использовании оператора return возвращается только одно значение. Я действительно не уверен, почему я получаю этот вывод и пытался много раз, чтобы выяснить, почему он это делает. Моя функция заключается в следующем:

def return_yml_file_names():
    """return file names from the yaml directory"""
    collections = os.listdir('yaml/')
    collections.remove('export_config.yaml')

    for file in collections :
        with open('yaml/' + file, 'r') as f:
            doc = yaml.load(f)
            collection_name = doc["config"]["collection"]+".json"
            return collection_name

print(return_yml_file_names())

1 Ответ

0 голосов
/ 09 января 2019

То есть, когда вы заменяете return collection_name на print(collection_name), функция работает правильно?

Причина этого в том, что return является оператором потока управления. Когда код достигает оператора return, он немедленно останавливает свою работу и выходит из функции. Обратите внимание, что это означает, что он не переходит к следующей итерации цикла for.

print() не меняет поток программы; таким образом, код попадает в него, выполняет его и затем переходит к следующей итерации цикла for.

Для этой проблемы я рекомендую

  1. Сделать пустой список в начале функции
  2. Вместо return ing collection_name, добавьте его в список вместо
  3. После цикла for вернуть полный список.

Код будет выглядеть так:

def return_yml_file_names():
    """return file names from the yaml directory"""
    collections = os.listdir('yaml/')
    collections.remove('export_config.yaml')
    collection_name_list = []

    for file in collections :
        with open('yaml/' + file, 'r') as f:
            doc = yaml.load(f)
            collection_name = doc["config"]["collection"]+".json"
            collection_name_list.append(collection_name)
    return collection_name_list
...