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
11065
Россия, Москва
Даже не зная синтаксиса питона вижу минимум две ошибки у вас: вместо "==" использовали "=", что далеко не одно и то же; вместо возврата значения оператором "return" зачем-то его печатаете оператором "print", что тоже совершенно разные вещи. Ну и вас просили функцию сделать, а не просто кусок кода, так что "def" тоже нужно.
Почему компилятор не ругается на ваш код с операцией "=" не понимаю, по моему она в таком контексте недопустима.

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


11/12/16
13195
уездный город Н
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
8352
Цюрих
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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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