Is this calculator written in Python clean/good? As a beginner I wrote my first program (calculator) with Python and as far as functionality is concerned it just works fine but I have some concerns about one thing at the end of the code. Under CalculateAgain() in the if statement, Calculate() is without the return statement. If I used it, it would just run the function one time and then it exits the program. That's why i left it without the statement. Is this ok or should I change something?

#Choose the operation
def OperationType():

    while True:

        Type = input('What type of operation do you want? +, -, *, /: \n')

        if Type in ('+', '-', '*', '/'):
            return Type
        else:
            print('Invalid input')


#Enter the first number
def InputFirstNumber():

    while True:
        try:
            firstNumber = float(input('Enter your first number: '))
            return firstNumber
        except ValueError:
            print ('Please enter a number')


#Enter the second number
def InputSecondNumber():

    while True:
        try:
            secondNumber = float(input('Enter your second number: '))
            return secondNumber
        except ValueError:
            print ('Please enter a number')


#Calculating
def Calculate():

    Type = OperationType()
    firstNumber = InputFirstNumber()
    secondNumber = InputSecondNumber()

    if Type == '+':
        print('{} + {} = '.format(firstNumber, secondNumber), firstNumber + secondNumber)

    elif Type == '-':
        print('{} - {} = '.format(firstNumber, secondNumber), firstNumber - secondNumber)

    elif Type == '*':
        print('{} * {} = '.format(firstNumber, secondNumber), firstNumber * secondNumber)

    elif Type == '/':
        print('{} / {} = '.format(firstNumber, secondNumber), firstNumber / secondNumber)

    else:
        print('Input not valid')


Calculate()

#Asks if the User want to calculate again
def CalculateAgain():

    while True:

        calculating_again = input('Do you want to calculate again? Y/N \n')


        if calculating_again in ('Y','y'):
            Calculate()

        elif calculating_again in ('N','n'):
            print('Quitting the program')
            break

        else:
            print('Not a valid answer')

CalculateAgain()
This code is broken into multiple unnecessary functions. Below is all thats needed:

operations = {
    "+": lambda x, y: x + y,
    "-": lambda x, y: x - y,
    "*": lambda x, y: x * y,
    "/": lambda x, y: x / y
}

def calculate():

    # Get numbers #
    one, two = input("Enter two numbers separated by a space: ").split()

    while operator := input("Enter an operator: + - * /"):
        if operator in ["+", "-", "*", "/"]:
            print(operations[operator](int(one), int(two)))
            return


Getting multiple values from input

Instead of prompting for each number, simply ask for two numbers separated by a space then split the input with a given delimiter, by default a space. .split returns a list, and since you only anticipate two values, can assign the output to one, two.

Walrus Operator

If you're using python-3.8, you can utilize the walrus operator, also called assignment expressions. It allows you to assign and return a value in an expression. This reduces the need to define a variable before the loop and use it.

Checking in

I do believe using a list/tuple instead of a string when checking in this particular case because it can catch some invalid input. A catch such as if operator in "+-*/":, it will allow "+-" as a valid operator, which we don't want. So good job there.

Lambdas

I've decided to use lambdas here because it's much easier to store them in a dictionary and then simply retrieve the value from the dictionary with the operator. If you want to learn more about how lambdas work, this Google Search brings up a plethora of sources that can explain the concept much better than I can.