Предизвикателства > Полиморфичен негативизъм


Полиморфичен негативизъм
Краен срок: 19.10.2023 18:00
Точки: 1

#### "В спора се ражда истината", но "истината зависи от гледната точка". В духа на следния скеч, ние искаме да направите една спореща функция. Тя ще е "контра" на всичко, което искате да заявите, а какво значи "контра" ще зависи от данните, които приема. [![Argument - Monty Python](/media/resources/challenge1.jpg)](https://www.youtube.com/watch?v=ohDB5gbtaEQ) Напишете функцията `no_it_isnt()`, която приема `list` от стойности и връща `list` от "контра" вариантите на тези стойности **в обратен ред**. Възможните типове на стойностите, както и съответните операции за "контра", които да приложите към тях, са следните: - `int` - ако е положително, става отрицателно, и обратното; - `float` - ако е положително, става отрицателно, и обратното; - `bool` - ако е `True`, става `False`, и обратното; - `str` - обръща реда на символите в низа. #### Разяснения - За други типове данни в колекцията няма да тестваме. - Смяна на знака на нула (било то цяло число, или с десетична запетая) не води до промяна. #### Един пример ``` no_it_isnt([1, -3.14, True, 'abc', 0]) # [0, 'cba', False, 3.14, -1] ```
 1import unittest
 2
 3from solution import *
 4
 5
 6class TestOpposite(unittest.TestCase):
 7    """Test no_it_isnt function."""
 8
 9    def test_sanity(self):
10        """Sanity test for returning the correct type."""
11        self.assertIs(type(no_it_isnt([])), list)
12
13
14if __name__ == '__main__':
15    unittest.main()
 1import unittest
 2
 3from solution import *
 4
 5
 6class TestOpposite(unittest.TestCase):
 7    """Test no_it_isnt function."""
 8
 9    def test_int(self):
10        """Test with an integer."""
11        self.assertEqual(no_it_isnt([1, 2]), [-2, -1])
12        self.assertEqual(no_it_isnt([-2]), [2])
13        self.assertEqual(no_it_isnt([0]), [0])
14
15    def test_float(self):
16        """Test with a float."""
17        self.assertEqual(no_it_isnt([1.234]), [-1.234])
18        self.assertEqual(no_it_isnt([-2.33]), [2.33])
19        self.assertEqual(no_it_isnt([6.66, 0.0]), [0.0, -6.66])
20
21    def test_bool(self):
22        """Test with a bool."""
23        self.assertEqual(no_it_isnt([True, False]), [True, False])
24        self.assertEqual(no_it_isnt([False, True, False]), [True, False, True])
25
26    def test_str(self):
27        """Test with a string."""
28        self.assertEqual(no_it_isnt(['1- 2 ab']), ['ba 2 -1'])
29        self.assertEqual(no_it_isnt(['']), [''])
30
31    def test_mixed(self):
32        """Test with a long mixed content of types."""
33        self.assertEqual(no_it_isnt([1, 1.2, True, 'string']), ['gnirts', False, -1.2, -1])
34        self.assertEqual(no_it_isnt([True, True, False]), [True, False, False])
35        self.assertEqual(no_it_isnt(['1', '12', '123']), ['321', '21', '1'])
36
37
38if __name__ == '__main__':
39    unittest.main()
Дискусия
Георги Кунчев
18.10.2023 11:54

Нека визуализирам: ``` 0 == -0 # True 0.0 == 0 # True ``` Уговорката с нула беше добавена, за да не се чудите какво да правите с нея. В крайна сметка правите най-логичното нещо - не я закачате. Дали функцията ти ще върне `0`, `-0`, `0.0` или `-0.0`, за Python (т.е. и за нашите тестове) това е една и съща стойност. Виж, случаят с `0.2` е различен. Това не е нула, т.е му сменяш знака.
Нелина Тотева
18.10.2023 11:32

Не съм сигурна, че разбирам условието с 0-та правилно. Примерно ако имам 0 ми е ясно че трябва да върне 0 , но ако е 0,2 тогава -0.2 или 0,2 и ако е -0.0, тогава трябва да върне отново -0.0 ли? В крайна сметка в математиката нулата с какъвто и знак да е си е нула, но тук нещо се обърквам.