Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 3, 2017 12:24:28

random_box
Зарегистрирован: 2017-02-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция возвращает None

Всем привет!
Есть задача написать функцию:
Функция принимает в качестве аргумента список строк.
Необходимо вернуть отсортированный список строк, в котором: сначала идет группа строк, начинающихся на ‘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”

Отредактировано random_box (Фев. 3, 2017 12:25:10)

Офлайн

#2 Фев. 3, 2017 13:15:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Функция возвращает None

random_box

random_box
почему “return” возвращает “None”?

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



Офлайн

#3 Фев. 3, 2017 13:58:18

random_box
Зарегистрирован: 2017-02-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция возвращает None

FishHook

Я все понял! Огромное спасибо

Офлайн

#4 Фев. 3, 2017 17:16:08

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Функция возвращает None

 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’

Отредактировано marvellik (Фев. 3, 2017 17:16:41)

Офлайн

#5 Фев. 3, 2017 17:31:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Функция возвращает None

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



Отредактировано FishHook (Фев. 3, 2017 17:31:20)

Офлайн

#6 Фев. 3, 2017 20:06:37

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Функция возвращает None

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

Офлайн

#7 Фев. 4, 2017 02:26:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9894
Репутация: +  854  -
Профиль   Отправить e-mail  

Функция возвращает None

marvellik
но что так делать нельзя не согласен все зависит от требуемых результатов.
Побочный эффект это. Нужно писать функции так, чтобы было минимум побочных эффектов. А уж основывать что-то на побочном эффекте - верх беспомощности. Того же результата можно достичь с функцией без побочного эффекта.



Отредактировано py.user.next (Фев. 4, 2017 02:26:51)

Офлайн

#8 Фев. 4, 2017 07:33:17

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Функция возвращает None

marvellik
не согласен все зависит от требуемых результатов
Если вы едите один и в темноте пишите свой маленький уютный проектик сам для себя, то вы вольны там делать что угодно. Но если вы пишите в команде или пишите на заказчика (что подразумевает, что ваш код когда-то может достаться на поддержку другому программисту) то отдавайте себе отчет, что если есть функция, то её в любой момент могут взять и заюзать без вашего ведома и вообще не так, как вы планировали. А теперь представьте себя на месте своего коллеги: вы вызываете кем-то ранее написаную функцию, получаете в ответе список. Используете этот список как планировали, но вдруг замечаете, что список получает изменения, которых вы туда не вносили. Как долго вы будете искать место возникновения побочки, и какими словами вы будете вспоминать своего коллегу?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version