Почему цикл while(print()) в питоне не бесконечен?
В C++ например можно написать while(std::cout<<"");, и он будет бесконечным
В питоне же while(print(" ")): pass выполняется только 1 раз
Ответы (3 шт):
Просто потому, что питоновская функция print(), вызванная с любыми аргументами, всегда возвращает None, а значение None расценивается while как false.
Но, что забавно, вы можете обернуть print в кортеж и вот он то уже не будет восприниматься как false, поскольку он не совсем пустой - в нём есть None (т.е. получится кортеж (None,), спасибо gil9red за уточнение):
while (print(" "),): pass
Я всего лишь добавил к вашему коду запятую в нужном месте, благо скобки (вообще-то не нужные для условия while в питоне) вы уже написали вокруг print сами.
Если Вам нужен бесконечный цикл то это просто -
while True:
print(" ")
И как бы всё ¯\_(ツ)_/¯
while работает с типом bool, для этого он вызывает магический метод __bool__. Это можно проверить так:
class MyClass:
def __bool__(self):
print("Bool")
return False
while MyClass():
pass
напечатается один раз bool и цикл прекратится т.к. мы вернули False. Если вернуть True то получится бесконечный цикл и вывод Bool
Если у класса отсутствует метод __bool__ то будет использоваться метод __len__
class MyClass:
def __len__(self):
print("Len")
return False
while MyClass():
pass
Если у функции отсутствует return или после него ничего не написано, то возвращается None. Функции print всегда возвращает None, а при превращении его в bool он всегда будет False
print(bool(None)) # False
и поэтому в while попадает False и он сразу заканчивается
Есть такой тип данных как кортеж, он создаётся также и список но место квадратных нужно использовать круглые
a = (0, 1)
print(type(a)) # <class 'tuple'>
но чтобы создать кортеж из одного элемента надо писать так:
a = (0, )
print(type(a)) # <class 'tuple'>
т.е. надо добавить в запятую в конец, если его не записать то получится не кортеж:
a = (0)
print(type(a)) # <class 'int'>
в вашем случае скобки в while лишние, но если добавить запятую то мы получим кортеж длиной в один элемент
a = (print(" "), )
print(type(a)) # <class 'tuple'>
в цикле while у кортежа вызывается метод __len__. В вашем случае в кортеже лежит один элемент, и поэтому __len__ возвращает 1, которой при превращении в bool возвращает True и цикл становится бесконечным