numbers = [4, 2, 1, 6, 9, 7]
print(numbers)


def square(x):
    return x * x


print(list(map(square, numbers)))

print([square(x) for x in numbers])


print(numbers)


def is_odd(x):
    return bool(x % 2)


print(list(filter(is_odd, numbers)))

print([x for x in numbers if is_odd(x)])


def reversed_string(text):
    result = ""
    for char in text:
        result = char + result
    return result


print(reversed_string("Hello, World!"))


greeting = "Hello, World!"
for char in reversed(greeting):
    print(char)


greeting = "Hello, World!"

for char in greeting[::-1]:
    print(char)

print(greeting[::-1])


from collections import UserString


class ReversibleString(UserString):
    def reverse(self):
        self.data = self.data[::-1]


text = ReversibleString("Hello, World!")
print(text)


# Reverse the string in place
text.reverse()
print(text)


text = ReversibleString("Hello, World!")

# Support reverse iteration out of the box
for char in reversed(text):
    print(char)

print(text)
