2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Codewars Python
Сообщение20.10.2020, 13:55 


18/10/20
10
Добрый день. Есть 2 проблемы с codewars. Сможете подсказать, пожалуйста, почему они возникают?

Первая из них связана с простейшим заданием. Я придумал его решение, но почему-то оно пропускается компилятором моим, но codewars не устраивает. Может что-то я не так понял?

Create a function (or write a script in Shell) that takes an integer as an argument and returns "Even" for even numbers or "Odd" for odd numbers.

Мое решение было таким:

Используется синтаксис Python
number=int(input())
if number%2=0:
        print('even')
else:
    print('Odd')
 


Его не пропустил codewars, но пропустил компилятор Python на моем компе.

При этом там первая строчка за меня уже напечатана была зачем-то

Используется синтаксис Python
def even_or_odd(number):
 


Но при этом такое решение считается правильным:

Используется синтаксис Python
def even_or_odd(number):
    if number % 2 == 0:
        return "Even"
    else:
        return "Odd"
 


Но такая программа не пишет odd или even (а моя пишет). В чем подвох?. Как-то это странно.

И еще, возможно ли как-то сохранить настройки? (я не нашел кнопки и гугление не помогло)

Изображение

 Профиль  
                  
 
 Re: Codewars Python
Сообщение20.10.2020, 14:24 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Вас что просят сделать?
progr-2020 в сообщении #1488071 писал(а):
Create a function (or write a script in Shell) that takes an integer as an argument and returns "Even" for even numbers or "Odd" for odd numbers.
Создать функцию, которая что-то принимает и что-то возвращает. Вот и следуйте заданию. Первая строчка уже напечатана, потому что это заголовок функции. Вы должны написать тело.

 Профиль  
                  
 
 Re: Codewars Python
Сообщение20.10.2020, 14:27 
Заслуженный участник


20/08/14
11210
Россия, Москва
Даже не зная синтаксиса питона вижу минимум две ошибки у вас: вместо "==" использовали "=", что далеко не одно и то же; вместо возврата значения оператором "return" зачем-то его печатаете оператором "print", что тоже совершенно разные вещи. Ну и вас просили функцию сделать, а не просто кусок кода, так что "def" тоже нужно.
Почему компилятор не ругается на ваш код с операцией "=" не понимаю, по моему она в таком контексте недопустима.

 Профиль  
                  
 
 Re: Codewars Python
Сообщение20.10.2020, 14:37 
Аватара пользователя


11/12/16
13364
уездный город Н
progr-2020
Разберитесь с разницей между функцией и процедурой. У Вас получилась процедура, а просили функцию.

 Профиль  
                  
 
 Re: Codewars Python
Сообщение20.10.2020, 18:01 


18/10/20
10
Спасибо за разъяснения, понял.
Только тогда это очень странное задание, ибо вот такая программа совершенно такой же результат выдает!

Используется синтаксис Python
def even_or_odd(number):
        print(number)
 

 Профиль  
                  
 
 Re: Codewars Python
Сообщение20.10.2020, 20:04 


17/12/15
66
Если в питоне в функции нет оператора return то эта функция возвращает значение None, какие бы вызовы функции print вы не использовали.
Попробуйте вызвать у себя на компьютере свою функцию с принтами в виде
r=even_or_odd(4)
print(r)
r - это то что вернула ваша функция (а в задаче она должна вернуть строку 'Even' или 'Odd')

 Профиль  
                  
 
 Re: Codewars Python
Сообщение21.10.2020, 00:33 


09/05/16
138
progr-2020 в сообщении #1488071 писал(а):
При этом там первая строчка за меня уже напечатана была зачем-то
Используется синтаксис Python
def even_or_odd(number):
В программировании большое внимание уделяется модульности кода, т.е. возможности оперировать отдельными частями программы и повторно использовать их в других целях. Одной из единиц, на которые код делится в языке Python, является функция (ключевое слово def). К другим можно отнести классы и модули, но до них Вы ещё доберётесь.

Почему решение авторы хотят в виде функции, а не полноценной программы? Функции можно скормить тот же ввод с клавиатуры и сразу вывести результат на экран:
Используется синтаксис Python
print(even_or_odd(int(input())))
а можно скормить константу и сохранить результат в переменную:
Используется синтаксис Python
result = even_or_odd(42)
В обоих случаях сама even_or_odd устроена одинаково. Решение, не отделяющее логику от ввода/вывода, повторно использовать сложнее: его придётся редактировать, чтобы использовать в других условиях.

Для x%2==0 разницы почти не видно, но если бы вместо проверки на чётность было, предположим, решение какой-нибудь обратной задачи, разница между передачей параметров через аргументы функции и через файлы/клавиатуру стала бы гораздо заметнее. В первом случае встроить готовую реализацию алгоритма в более сложную программу почти тривиально (программе достаточно сформировать и передать аргументы в нужном виде), во втором - нет: нужно притворяться, как будто параметры подготовил человек и сложил в нужное место, а потом считывать ответ из файлов/с экрана, разбирая текст обратно в структуры данных, из которых он был получен. Been there, done that, got a stupid T-shirt.

См. также про т.н. чистоту функций: предложенное решение с def является чистым, а с input() - нет.

 Профиль  
                  
 
 Re: Codewars Python
Сообщение22.10.2020, 22:19 


18/10/20
10
Спасибо большое! Разобрался!

Есть еще один немного странный вопрос. Почему здесь программа ругается на else. У меня Python 3.9.

Задача была такая, но решение я немного странное придумал, оно рабочее, но вот если поставить else вместо последнего if, то компилятор не пропускает.

Цитата:
You get an array of numbers, return the sum of all of the positives ones.

Example [1,-4,7,12] => 1 + 7 + 12 = 20

Note: if there is nothing to sum, the sum is default to 0.


Моя версия программы, которая работает

Используется синтаксис Python
def positive_sum(arr):
    if len(arr)>0:    
        for i in range(0,len(arr)):
            arr[i]=(abs(arr[i])+arr[i])/2
        for i in range(1,len(arr)):
            arr[i]=arr[i-1]+arr[i]  
        return arr[i]
    if len(arr)==0:        
        return 0
 


А вот эта версия не работает:

Используется синтаксис Python
def positive_sum(arr):
    if len(arr)>0:    
        for i in range(0,len(arr)):
            arr[i]=(abs(arr[i])+arr[i])/2
        for i in range(1,len(arr)):
            arr[i]=arr[i-1]+arr[i]  
        return arr[i]
    else:        
        return 0
 

 Профиль  
                  
 
 Re: Codewars Python
Сообщение22.10.2020, 22:47 
Заслуженный участник
Аватара пользователя


16/07/14
8554
Цюрих
progr-2020 в сообщении #1488548 писал(а):
А вот эта версия не работает:
А почему вы думаете, что не работает? У меня эта версия заработала.
(ну и вообще очень желательно кроме "не работает" говорить, что делает вместо того, чтобы работать)

 Профиль  
                  
 
 Re: Codewars Python
Сообщение23.10.2020, 00:12 


18/10/20
10
mihaild в сообщении #1488552 писал(а):
А почему вы думаете, что не работает? У меня эта версия заработала.
(ну и вообще очень желательно кроме "не работает" говорить, что делает вместо того, чтобы работать)

Спасибо! Теперь у меня тоже работает, что-то компилятору не понравилось в строчке с else. Может с отступами была проблема. Сейчас все ок.

 Профиль  
                  
 
 Re: Codewars Python
Сообщение29.10.2020, 12:04 
Аватара пользователя


19/10/20
16
Советую использовать linter для проверки кода. Он не только будет следить чтоб отступ был везде одинаковый (в первом примере разное число пробелов перед print), но и найдет глупые ошибки типа неиспользованных переменных и использования знака присвоения (=) к константе, что наведет сразу на мысль что надо использовать ==.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: worm2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group