2015-01-26 2 views
-1

У меня возникают проблемы с перекосом по списку переменных. В частности, я хочу написать функцию, которая возвращает информацию о текущей системе. Ниже приведен пример для цикла я попытался:Python: Итерация над списком переменных

def sysInfo(): 
    cpu = psutil.cpu_count() 
    memory = psutil.virtual_memory() 
    disk = psutil.disk_usage('/') 

    specs = [cpu, memory, disk] 

    for c in specs: 
     return c 

print sysInfo() 

Функция работает без ошибок, но возвращает только первый элемент в списке, что приводит меня к выводу, что цикл выполняется только один раз. Однако, если я переключу оператор return с печатью (и вызовет функцию вместо ее печати), тогда все элементы списка будут напечатаны.

Мой вопрос тогда будет: Почему цикл возвращает только первый элемент в списке с возвратом, но печать дает все из них?

+0

Взгляните на [доходность] (http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python). Или верните список. Не уверен, что вы пытаетесь сделать. –

ответ

0

Как только вы вызываете return один раз, вы не можете «вернуться» к функции - она ​​заканчивается.

Просто верните весь список и распечатайте каждый элемент отдельно, если это необходимо.

+0

Я не знал (новичок в программировании и python). Вы знаете какое-либо решение, которое вернет все элементы списка? – Sifu

+0

Если вы удалите цикл 'for' и просто' return c', функция 'sysInfo' вернет список, содержащий переменные cpu, memory и disk. Затем вы можете поместить этот список в переменную: 'x = sysInfo()', а затем распечатать содержимое в совокупности: 'print x' или индивидуально:' для elt в x: print elt'. – FuzzyDuck

+0

Это было очень полезно, спасибо! – Sifu

0

Ключевое слово return сделает вашу функцию законченной немедленно. В первой итерации цикла, когда оператор return достигнут, ваша функция закончится и будет возвращена c.

Что вы можете сделать, это вернуть весь список вместо этого, без использования какого-либо цикла:

return specs 
0

Они функция и метода. В python мы определяем их одинаково, но это не так. Когда вы используете оператор return, вы прерываете цикл и возвращаете значение. Если вы хотите вернуть весь список, вы можете просто ввести:

return specs 

, а затем вы называете переменным:

sysInfo()[some_index] 

Хорошей идеей является изменение возвращения в Словарь:

return {"cpu": cpu, "memory":memory, "disk":disk} 

, а затем вы можете Переменная вызова на

sysInfo()["cpu"] 
0

Когда вы вызываете return в функцию, функция завершает свое выполнение и возвращает заданное значение или None, если return вызывается без возвращаемого значения.

Но зачем вообще использовать петлю for. вы можете просто написать:

def sysInfo(): 
    cpu = psutil.cpu_count() 
    memory = psutil.virtual_memory() 
    disk = psutil.disk_usage('/') 

    return cpu, memory, disk 

print sysInfo() 
0

Как вы думаете об этой проблеме называется yield. Однако в этом случае просто return specs для вашего же блага.

Смежные вопросы