None python ошибка

def test ():
    print('test')

print( test() )

Есть вот такой код. Пытаюсь выполнить код и по идее на выходе должно быть слово «test», но тут почему-то ниже появляется «None». Что не так? Как фиксить?

Заранее спасибо.
введите сюда описание изображения

Viktorov's user avatar

Viktorov

7,1458 золотых знаков37 серебряных знаков65 бронзовых знаков

задан 23 мар 2019 в 14:53

Morean's user avatar

Ваш код:

def test ():
    print('test')

print( test() )

Когда вы вызываете строку print( test() ) происходит следующая последовательность действий:

  1. print вызывает ваша процедура test().
  2. Процедура test печатает вашу надпись 'test'
  3. Процедура test() не возвращает результата( нет инструкции return). По этому результатом работы этой процедуры будет None. Это значение и печатает команда print.

Для того, чтобы получить ожидаемый результат ваш код следует изменить например так:

def test ():
    print('test')

test()

ответ дан 23 мар 2019 в 15:10

Viktorov's user avatar

ViktorovViktorov

7,1458 золотых знаков37 серебряных знаков65 бронзовых знаков

none («ничего») выдаёт вторая команда print — она печатает резулат выполнния функции test. функция у вас ничего не возвращает — вот и none.

если не хотите, чтобы печаталось none, не печатайте результат выполнения фунции test, а просто её вызывайте. т.е. вместо:

print( test() )

напишите:

test()

ответ дан 23 мар 2019 в 15:08

aleksandr barakin's user avatar

aleksandr barakinaleksandr barakin

67.7k208 золотых знаков76 серебряных знаков218 бронзовых знаков

def test ():
    return 'test'

print( test() )

ответ дан 23 мар 2019 в 15:01

S. Nick's user avatar

S. NickS. Nick

70.3k96 золотых знаков36 серебряных знаков55 бронзовых знаков

In [4]:def test ():
   ...:     print('test')
   ...:test()
   ...:
test

Что бы понять, почему » ниже появляется «None»» набери
A=test ()
и посмотри, чему равно A.

ответ дан 23 мар 2019 в 14:59

passant's user avatar

passantpassant

11.5k2 золотых знака9 серебряных знаков16 бронзовых знаков

3

Достаточно часто возникают вопросы: «почему моя функция ничего не возвращает?!», «почему из функции возвращается None?», «не могу понять откуда появляется None…».

Для начала необходимо понимать и помнить, что любая функция в Python всегда что-то возвращает и если не используется оператор return для возврата значения (такие случаи бывают, но об этом позднее), то функция возвращает объект None. В случае если return используется, но после него ничего не указывается явно, то по умолчанию считается, что там стоит объект None.

# Не используем оператор return, поэтому результат не возвращается.
def func(x):
    x * x  

print(func(10))
#=> None

# Используем оператор return, но не задаем явное значение/используем некорректно
def func(x):
    x * x
    return

print(func(10))
#=> None

# Корректно возвращаем результат с использованием оператора return
def func(x):
    return x * x

print(func(10))
#=> 100

Порой бывает, что по ошибке указывается возврат вместе с функцией print(). Для информации функция print() в Python выводит переданные аргументы на стандартное устройство вывода (экран), но при этом не возвращает значений, т.е. можно считать, что возвращает None.

def func(x):
    return print(x * x)

a = 5
b = func(a)  # Присваиваем результат функции переменной b
# Результат работы функции выводится на экран, благодаря print() в теле функции.
#=> 25
# Но при этом данный результат не присваивается переменной b.
print(b)
#=> None

Если дальше по коду проводятся манипуляции с переменной b, например сложение, то возникнет ошибка TypeError:

c = b + 1  # Пытаемся сложить None и 1
print(c)
# => TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Возможен вариант, когда функция и не должна ничего возвращать, она производит какие-либо действия с объектами в глобальной зоне видимости и на этом ее функционал заканчивается. В таком случае return может и не использоваться, но необходимо помнить, что в этом случае функция возвращает None.

# Бесполезная функция необходимая только в качестве примера.
def extend_list(list1, list2):
    list1.extend(list2)


list1 = [1, 2]
list2 = [3, 4]
print(extend_list(list1, list2))
# => None
#  При этом поставленную задачу функция выполнила - изменила list1
print(list1)
# => [1, 2, 3, 4]

В примере выше использовался метод работы со списками extend() и необходимо понимать, что метод изменяет объект, к которому применен, а не возвращает результат изменения объекта.

list3 = extend_list(list1, list2)
print(list3)
# =>  None

It’s the return value of the function, which you print out. If there is no return statement (or just a return without an argument), an implicit return None is added to the end of a function.

You probably want to return the values in the function instead of printing them:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x

print(jiskya(2, 3))

Antti Haapala -- Слава Україні's user avatar

answered Aug 13, 2011 at 22:20

phihag's user avatar

phihagphihag

276k72 gold badges452 silver badges469 bronze badges

5

Ok, to start off when you do this:

print(jiskya(2, 3))

You getting something pretty much equivalent to this:

print(print(2))

So, what is going on? The print(2) is printing out 2, and returns None which is printed by the outer call. Straightforward enough.

Now look at this:

def hello():
    return 2

If you do:

print(hello())

You get 2 because if you print out a function you get whatever the return value is. (The return value is denoted by the return someVariable.

Now even though print doesn’t have parenthesis like most functions, it is a function just a little special in that respect. What does print return? Nothing. So when you print print someVariable, you will get None as the second part because the return value of print is None.

So as others have stated:

def jiskya(x, y):
    if x > y:
        print(y)
    else:
        print(x)

Should be re-written:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x

Antti Haapala -- Слава Україні's user avatar

answered Aug 13, 2011 at 22:46

Dair's user avatar

DairDair

15.9k9 gold badges61 silver badges107 bronze badges

1

Where did the ‘None’ come from?

The function.

And what is it?

It’s what the function returned.

In Python, every function returns something. It could «be multiple things» using a tuple, or it could «be nothing» using None, but it must return something. This is how we deal with the fact that there is no way to specify a return type (which would make no sense since you don’t specify types for anything else). When interpreted as a string for printing, None is replaced with the string «None».

None is a special object that is supposed to represent the absence of any real thing. Its type is NoneType (it is an instance of that class). Whenever you don’t explicitly return anything, you implicitly return None.

You wrote the function to print one of the two values x or y, but not to return anything. So None was returned. Then you asked Python to print the result of calling the function. So it called the function (printing one of the values), then printed the return value, which was None, as the text «None».

answered Aug 13, 2011 at 22:25

Karl Knechtel's user avatar

Karl KnechtelKarl Knechtel

61.7k11 gold badges97 silver badges147 bronze badges

You are doing two prints, the first one in the corpus of your function and the second one is printing the result of the function, which as actually None.

You should rather do something like this:

def yourfunction(x, y):
    if x > y:
        return y
    else:
        return x

Then,

>>> print yourfunction(2, 3)
2

answered Aug 13, 2011 at 22:20

Alexis Métaireau's user avatar

Alexis MétaireauAlexis Métaireau

10.6k5 gold badges23 silver badges34 bronze badges

Ya, basically you are using print statements in your function as a way to return information. You shouldn’t do this. Print is NOT the same as a return statement. If you simply want your function to give your answer without the none, just type jiskya(2, 3) instead. You will see what the function throws out because you have print statements in the function. If instead you typed «return» in your function, it wouldn’t give you anything without the «print» preceding the function call.

answered Aug 13, 2011 at 22:25

de1337ed's user avatar

de1337edde1337ed

3,05312 gold badges36 silver badges53 bronze badges

The problem is you wrote print jiskya(2,3). You’re passing the return value of jiskya to the print function. jiskya itself prints x or y, which is why you see the 2. But then the print in the print jiskya(2, 3) statement itself executes with no argument.

To the interpreter, this is a simplification of what happens:

print jiskya(2,3)
>> Executing jiskya with arguments 2, 3
>> jiskya evaulates `print x`
>> 2 is printed
>> Function jiskya exits with no return value
print None
>> None is printed

answered Aug 13, 2011 at 22:19

Jared Ng's user avatar

Jared NgJared Ng

4,8012 gold badges18 silver badges18 bronze badges

Consider following examples:

Function without return statement

Print() function type is none type..

def test1():

    print("code...!!!")

type(test1())

Output: code...!!!
        NoneType

Function with return statement

Returning variable ‘a’ which holds print() function, that’s why type() returns data type of print function which is NoneType, not the data type of what’s inside the print funcion:

def test1():

    a= print("code...!!!")
    
    return a

type(test1())


Output: code...!!!
        NoneType

Here function returning data type of variable ‘a’ which holds a string in it.

def test1():

    a = "First code...!!!"
    
    return a

type(test1())


Output: str

answered Sep 24, 2020 at 11:25

Avinash's user avatar

AvinashAvinash

481 silver badge8 bronze badges

Есть задача: написать функцию, которая принимает первым аргументом строку и вторым аргументом размер чанка
Я решил с помощью генератора разбивать строку и возвращать по кускам, всё хорошо, но последний элемент None. Как это исправить?

def wrap(string, max_width):
    def gen_letters(string, max_width):
        count = 0
        res_gen = ''
        for index, i in enumerate(string):
            count += 1
            res_gen += i
            if count == max_width:
                count = 0
                tmp_res = res_gen
                res_gen = ''
                yield tmp_res
            elif count < max_width and index == len(string)-1:
                yield res_gen

    for i in gen_letters(string, max_width):  
        print(i)

Входные данные:
string: ABCDEFGHIJKLIMNOQRSTUVWXYZ
max_width: 4
Результат:
ABCD
EFGH
IJKL
IMNO
QRST
UVWX
YZ
None

Опубликовано: четверг, 13 апреля 2023 г. в 09:23

  • Backend
  • Python

В этом руководстве вы узнаете об NoneType объекте None, который действует в Python как null. Этот объект представляет собой пустоту, и вы можете использовать его, чтобы отменить параметры по умолчанию и даже показать, когда у вас нет результата. None — это инструмент для того, чтобы делать всё из ничего!

Если у вас есть опты работы с другими языками программирования, такими как C или Java, вероятно, вы слышали о концепции null. Многие языки используют её для представления указателя, который ни на что не указывает. Для обозначения того, что переменная пуста, или пометки параметров по умолчанию, которые вы ещё не предоставили. null часто определяется как 0 в этих языках, но null в Python отличается.

Python использует ключевое слово None для определения null объектов и переменных. Хотя None служит некоторым из тех же целей, что и null в других языках, это совершенно другой зверь. Как null в Python, None не определяется как 0 или любое другое значение. В Python None является объектом и гражданином первого класса!

В этом руководстве вы узнаете:

  • Что такое None и как его проверить.
  • Когда и зачем использовать None в качестве параметра по умолчанию.
  • Что означают None и NoneType в вашей трассировке.
  • Как использовать None в проверке типов.
  • Как null в Python работает под капотом.

Понимание Null в Python

None — это значение, которое функция возвращает, когда в функции нет оператора return:

>>> def has_no_return():
... pass
>>> has_no_return()
>>> print(has_no_return())
None

Когда вы вызываете has_no_return(), вы ничего не видите на выходе. Однако когда вы напечатаете его вызов, вы увидите скрытое значение None, которое он возвращает.

На самом деле None так часто появляется в качестве возвращаемого значения, что Python REPL не будет печатать None, если вы явно не укажите:

>>> None
>>> print(None)
None

None сам по себе не имеет вывода, но при печати он отображает None в консоли.

Интересно, что сама функция print() не имеет возвращаемого значения. Если вы попытаетесь напечатать вызов print(), вы получите None:

>>> print(print("Hello, World!"))
Hello, World!
None

Это может показаться странным, но print(print("...")) показывает None, который возвращает внутренний print().

None также часто используется в качестве сигнала для отсутствующих параметров или параметров по умолчанию. Например, None дважды появляется в документации list.sort:

>>> help(list.sort)
Help on method_descriptor:

sort(...)
L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*

Здесь None — это значение по умолчанию для параметра key, а также подсказка типа для возвращаемого значения. Точный вывод help может варьироваться от платформы к платформе. Вы можете получить другой вывод при запуске этой команды в интерпретаторе, но он будет похож.

Использование Null объекта Python None

Часто вы будете использовать None как часть сравнения. Одним из примеров является ситуация, когда вам нужно проверить, имеет ли какой-либо результат или параметр значение None. Возьмите результат, который вы получаете от re.match. Соответствовало ли регулярное выражение заданной строке? Вы увидите один из двух результатов:

  1. Возвращает объект Match: Ваше регулярное выражение нашло совпадение.
  2. Возвращает объект None: Ваше регулярное выражение не нашло соответствия.

В приведённом ниже блоке кода проверяется, соответствует ли шаблон "Goodbye" строке:

>>> import re
>>> match = re.match(r"Goodbye", "Hello, World!")
>>> if match is None:
... print("It doesn't match.")
It doesn't match.

Здесь используется is None, чтобы проверить, соответствует ли шаблон строке "Hello, World!". Этот блок кода демонстрирует важное правило, о котором следует помнить, когда вы проверяете None:

  • Используйте операторы идентификации is и is not.
  • Не используйте операторы равенства == и !=.

Операторы равенства можно обмануть, когда вы сравниваете пользовательские объекты, которые переопределяют их:

>>> class BrokenComparison:
... def __eq__(self, other):
... return True
>>> b = BrokenComparison()
>>> b == None # Equality operator
True
>>> b is None # Identity operator
False

Оператор равенства == возвращает неверный ответ. Оператор идентификации is, с другой стороны, нельзя обмануть, потому что вы не можете его переопределить.

None является ложным, что означает, что not None это True. Если всё, что вы хотите знать, это является ли результат ложным, то достаточно теста подобного следующему:

>>> some_result = None
>>> if some_result:
... print("Got a result!")
... else:
... print("No result.")
...
No result.

Вывод не показывает вам, что some_result точно равен None, а только, что он ложный. Если вы хотите знать, есть ли у вас объект None, то используйте is и is not.

Следующие объекты также являются ложными:

  • Пустые списки.
  • Пустые словари.
  • Пустые наборы.
  • Пустые строки.
  • 0
  • False

Объявление переменных Null в Python

В некоторых языках переменные появляются из объявления. Им необязательно присваивать начальное значение. В этих языках начальное значение по умолчанию для некоторых типов переменных может быть null. Однако в Python переменные оживают благодаря операторам присваивания. Взгляните на следующий блок кода:

>>> print(bar)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'bar' is not defined
>>> bar = None
>>> print(bar)
None

Вы можете увидеть, что переменная со значением None отличается от неопределённой переменной. Всё переменные в Python создаются путём присваивания. Переменная начнёт жизнь как null в Python, только если вы присвоите ей значение None.

Использование None в качестве параметра по умолчанию

Очень часто вы будете использовать None в качестве значения по умолчанию для необязательного параметра. Есть очень веская причина для использования None, а не мутабельный тип, такой как список. Представьте такую функцию:

def bad_function(new_elem, starter_list=[]):
starter_list.append(new_elem)
return starter_list

bad_function() содержит неприятный сюрприз. Она отлично работает, когда вы вызываете её с существующим списком:

>>> my_list = ['a', 'b', 'c']
>>> bad_function('d', my_list)
['a', 'b', 'c', 'd']

Она без проблем добавляет d в конец списка.

Но если вызвать эту функцию без параметра starter_list, вы увидите некорректное поведение:

>>> bad_function('a')
['a']
>>> bad_function('b')
['a', 'b']
>>> bad_function('c')
['a', 'b', 'c']

Значение по умолчанию для starter_list оценивается только один раз во время определения функции, поэтому код повторно использует его каждый раз, когда вы не передаёте существующий список.

Правильный способ построить эту функцию — использовать None в качестве значения по умолчанию, затем протестировать его и создать экземпляр нового списка по мере необходимости:

>>> def good_function(new_elem, starter_list=None):
... if starter_list is None:
... starter_list = []
... starter_list.append(new_elem)
... return starter_list
...
>>> good_function('e', my_list)
['a', 'b', 'c', 'd', 'e']
>>> good_function('a')
['a']
>>> good_function('b')
['b']
>>> good_function('c')
['c']

good-function() ведёт себя так, как вы хотите, создавая новый список при каждом вызове, когда вы не передаёте существующий список. Это работает, потому что ваш код будет выполнять строки 2 и 3 каждый раз, когда вызывается функция с параметром по умолчанию.

Использование None в качестве значения Null в Python

Что вы делаете, когда None является допустимым входным объектом? Например, что, если функция good_function() может либо добавить элемент в список, либо нет, а None будет допустимым элементом добавления? В этом случае вы можете определить класс специально для использования по умолчанию, в то же время отличаясь от None:

>>> class DontAppend: pass
...
>>> def good_function(new_elem=DontAppend, starter_list=None):
... if starter_list is None:
... starter_list = []
... if new_elem is not DontAppend:
... starter_list.append(new_elem)
... return starter_list
...
>>> good_function(starter_list=my_list)
['a', 'b', 'c', 'd', 'e']
>>> good_function(None, my_list)
['a', 'b', 'c', 'd', 'e', None]

Класс DontAppend служит сигналом не добавлять, поэтому для этого не нужен None. Это освобождает от добавления None, когда вы хотите.

Вы можете использовать этот метод, когда None также может быть возвращаемым значением. Например, dict.get возвращает None по умолчанию, если ключ не найден в словаре. Если бы None был допустимым значением в вашем словаре, вы могли бы вызвать dict.get следующим образом:

>>> class KeyNotFound: pass
...
>>> my_dict = {'a':3, 'b':None}
>>> for key in ['a', 'b', 'c']:
... value = my_dict.get(key, KeyNotFound)
... if value is not KeyNotFound:
... print(f"{key}->{value}")
...
a->3
b->None

Мы определили собственный класс KeyNotFound. Теперь вместо того, что бы возвращать None, когда ключа нет в словаре, можем вернуть KeyNotFound. Это позволяет проще возвращать None, если это фактическое значение в словаре.

Расшифровка None в Трассировке

Когда NoneType появляется в вашей трассировке, это означает, что то, чего вы не ожидали, что это будет None, на самом деле было None, и вы пытались использовать это таким образом, каким нельзя использовать None. Почти всегда это происходит потому, что вы пытаетесь вызвать для него метод.

Например, вы много раз вызывали append() для my_list в примере выше, но если my_list каким-то образом станет чем-то другим, кроме списка, то append() завершится ошибкой:

>>> my_list.append('f')
>>> my_list
['a', 'b', 'c', 'd', 'e', None, 'f']
>>> my_list = None
>>> my_list.append('g')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'append'

Код вызывает распространённую ошибку AttributeError, потому что базовый объект, my_list, больше не является списком. Он установлен в None у которого нет атрибута append(), поэтому код выдаёт исключение.

Когда видите такую трассировку в своём коде, сначала найдите атрибут, вызвавший ошибку. Здесь это append(). Оттуда вы увидите объект, для которого пытались его вызвать. В данном случае это my_list, как видно из кода чуть выше трассировки. Наконец, выясните, как этот объект стал None, и предпримите необходимые шаги для исправления кода.

Проверка на Null в Python

Есть два случая проверки типов, когда в Python понадобится null. Первый случай — когда вы возвращаете None:

>>> def returns_None() -> None:
... pass

Этот случай подобен тому, когда у вас вообще нет оператора return, который возвращает None по умолчанию.

Второй случай немного сложнее. Здесь вы принимаете или возвращаете значение, которое может None, но также может быть и другим (одиночным) типом. Этот случай подобен тому, что мы делали с re.match выше, когда возвращался либо объект Match, либо None.

Процесс аналогичен для параметров:

from typing import Any, List, Optional
def good_function(new_elem:Any, starter_list:Optional[List]=None) -> List:
pass

Мы изменяем good_function() сверху и импортируем Optional из typing, чтобы вернуть Optional[Match].

Заглянем под капот

Во многих других языках null — это просто синоним 0, но null в Python — это полноценный объект:

>>> type(None)
<class 'NoneType'>

Эта строка показывает, что None является объектом и имеет тип NoneType.

None сам по себе встроен в язык как null в Python:

>>> dir(__builtins__)
['ArithmeticError', ..., 'None', ..., 'zip']

Здесь вы можете увидеть None в списке __builtins__, который представляет собой словарь, хранимый интерпретатором для модуля builtins.

None — это ключевое слово, как True или False. Но из-за этого вы не можете получить None напрямую из __builtins__, как могли бы, например, ArithmeticError. Однако вы можете получить его также с помощью трюка getattr():

>>> __builtins__.ArithmeticError
<class 'ArithmeticError'>
>>> __builtins__.None
File "<stdin>", line 1
__builtins__.None
^
SyntaxError: invalid syntax
>>> print(getattr(__builtins__, 'None'))
None

Когда используете getattr(), вы можете получить настоящий None из __builtins__, чего нельзя сделать, просто запросив его с помощью __builtins__.None.

Несмотря на то, что Python печатает слово NoneType во многих сообщениях об ошибках, NoneType не является идентификатором в Python. Это не в builtins. Вы можете добрать до него только с type(None).

None это синглтон. То есть класс NoneType всегда даёт один и тот же единственный экземпляр None. В вашей программе Python есть только дин None:

>>> my_None = type(None)()  # Create a new instance
>>> print(my_None)
None
>>> my_None is None
True

Даже если вы попытаетесь создать новый экземпляр, вы всё равно получите существующий None.

Вы можете доказать, что None и my_None являются одним и тем же объектом, с помощью id():

>>> id(None)
4465912088
>>> id(my_None)
4465912088

Тот факт, что id выводит одно и тоже целочисленное значение для None и my_None, означает, что они фактически являются одним и тем же объектом.

Примечание: Актуальное значение, создаваемое id, будет отличаться в разных системах и даже между запусками программы. Два объекта живущие по одному и тому же адресу памяти, являются одним и тем же объектом.

Если вы попытаетесь присвоить значение объекту None, вы получите SyntaxError:

>>> None = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
SyntaxError: can't assign to keyword
>>> None.age = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'age'
>>> setattr(None, 'age', 5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'age'
>>> setattr(type(None), 'age', 5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'NoneType'

Приведённые выше примеры показывают, что нельзя изменить None или NoneType. Они настоящие константы.

Также нельзя создать подкласс NoneType:

>>> class MyNoneType(type(None)):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type 'NoneType' is not an acceptable base type

Эта трассировка показывает, что интерпретатор не позволит создать новый класс, наследуемы от type(None).

Заключение

None — это мощный инструмент в наборе инструментов Python. Подобно True и False, None является иммутабельным ключевым словом. Как null в Python, вы используете его, чтобы пометить отсутствующие значения и результаты, и даже параметры по умолчанию, где это гораздо лучший выбор, чем мутабельные типы.

Теперь вы можете:

  • Проверить на None с помощью is и is not.
  • Выбрать, когда None является допустимым значением в коде.
  • Использовать None и его альтернативы в качестве примеров по умолчанию.
  • Расшифровать None и NoneType в трассировках программ.
  • Использовать None и Optional в подсказках типов.

Понравилась статья? Поделить с друзьями:
  • Nissan march ошибка p0121
  • Nissan liberty сброс ошибок
  • Msvpc110 dll ошибка
  • Nissan leaf ошибка b29a0
  • Msvcr90 dll office 2010 ошибка