Найти - Пользователи
Полная версия: Функция возвращает None
Начало » Центр помощи » Функция возвращает None
1
random_box
Всем привет!
Есть задача написать функцию:
Функция принимает в качестве аргумента список строк.
Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на ‘x’, затем все остальные.
Наример: из получится
Подсказка: это можно сделать при помощи склеивания 2х заранее отсортированных списков

Есть код:
 words = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark']
def front_x(words):
    x_files = []
    for i in words:
        if i[0] == 'x':
            words.remove(i)
            x_files.append(i)
    return x_files.extend(words)
print(front_x(words))

Вопрос: почему “return” возвращает “None”?
Смотрел работу кода в визуализаторе, все проходит нормально до строчки с “return”
FishHook
random_box
random_box
почему “return” возвращает “None”?

потому что list.extend возвращает None. Этот метод изменяет список. Существует такое хорошее правило: если метод что-то возвращает, он не должен вызывать побочных эффектов (то есть изменений чего-либо за пределами себя), и наоборот.
random_box
FishHook

Я все понял! Огромное спасибо
marvellik
 def front_x(words, x_files = []): 
    for i,x in enumerate(words):
        if x[0] == 'x':
            x_files.append(words.pop(i))
    return sorted(x_files) + sorted(words)
words = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark']
print(front_x(words))

'xanadu', ‘xyz’, ‘aardvark’, ‘apple’, ‘mix’
FishHook
marvellik
 def front_x(words, x_files = []):
Так нельзя делать никогда. Тот пустой список, который у вас в параметрах, создается один раз во время создания объекта функции. В нем будут сохраняться все изменения при каждом вызове функции.

marvellik
да согласен есть такой косяк что то написал под задачу но не учел что в реальности функция может быть вызвана много раз. но что так делать нельзя не согласен все зависит от требуемых результатов.
py.user.next
marvellik
но что так делать нельзя не согласен все зависит от требуемых результатов.
Побочный эффект это. Нужно писать функции так, чтобы было минимум побочных эффектов. А уж основывать что-то на побочном эффекте - верх беспомощности. Того же результата можно достичь с функцией без побочного эффекта.
FishHook
marvellik
не согласен все зависит от требуемых результатов
Если вы едите один и в темноте пишите свой маленький уютный проектик сам для себя, то вы вольны там делать что угодно. Но если вы пишите в команде или пишите на заказчика (что подразумевает, что ваш код когда-то может достаться на поддержку другому программисту) то отдавайте себе отчет, что если есть функция, то её в любой момент могут взять и заюзать без вашего ведома и вообще не так, как вы планировали. А теперь представьте себя на месте своего коллеги: вы вызываете кем-то ранее написаную функцию, получаете в ответе список. Используете этот список как планировали, но вдруг замечаете, что список получает изменения, которых вы туда не вносили. Как долго вы будете искать место возникновения побочки, и какими словами вы будете вспоминать своего коллегу?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB