Encontrando la raíz cuadrada usando el método de Newton (¡errores!)

Estoy trabajando para terminar un problema matemático que se aproxima a la raíz cuadrada de un número utilizando el método de verificación y conjetura de Newton en Python. Se supone que el usuario debe ingresar un número, una estimación inicial del número y la cantidad de veces que desea verificar su respuesta antes de regresar. Para facilitar las cosas y conocer Python (hace un par de meses, apenas comencé a aprender el idioma), lo dividí en varias funciones más pequeñas; Sin embargo, el problema ahora es que estoy teniendo problemas para llamar a cada función y pasar los números.

Aquí está mi código, con comentarios para ayudar (cada función está en orden de uso):

# This program approximates the square root of a number (entered by the user)
# using Newton's method (guess-and-check). I started with one long function,
# but after research, have attempted to apply smaller functions on top of each
# other.
# * NEED TO: call functions properly; implement a counting loop so the
# goodGuess function can only be accessed the certain # of times the user
# specifies. Even if the - .001 range isn't reached, it should return.

# sqrtNewt is basically the main, which initiates user input.

def sqrtNewt():
    # c equals a running count initiated at the beginning of the program, to
    # use variable count.
    print("This will approximate the square root of a number, using a guess-and-check process.")
    x = eval(input("Please type in a positive number to find the square root of: "))
    guess = eval(input("Please type in a guess for the square root of the number you entered: "))
    count = eval(input("Please enter how many times would you like this program to improve your initial guess: ")) 
    avg = average(guess, x)
    g, avg = improveG(guess, x)
    final = goodGuess(avg, x)
    guess = square_root(guess, x, count)
    compare(guess, x)


# Average function is called; is the first step that gives an initial average,
# which implements through smaller layers of simple functions stacked on each
# other.
def average(guess, x) :
    return ((guess + x) / 2)

# An improvement function which builds upon the original average function.
def improveG(guess, x) :
    return average(guess, x/guess)

# A function which determines if the difference between guess X guess minus the
# original number results in an absolute vale less than 0.001. Not taking
# absolute values (like if guess times guess was greater than x) might result
# in errors
from math import *
def goodGuess(avg, x) :
    num = abs(avg * avg - x)
    return (num < 0.001)

# A function that, if not satisfied, continues to "tap" other functions for
# better guess outputs. i.e. as long as the guess is not good enough, keep
# improving the guess.
def square_root(guess, x, count) :
    while(not goodGuess(avg, x)):
        c = 0
        c = c + 1
        if (c < count):
            guess = improveG(guess, x)
        elif (c == count):
            return guess
        else :
            pass

# Function is used to check the difference between guess and the sqrt method
# applied to the user input.
import math
def compare(guess, x):
    diff = math.sqrt(x) - guess
    print("The following is the difference between the approximation") 
    print("and the Math.sqrt method, not rounded:", diff)

sqrtNewt()

Actualmente, me sale este error:g, avg = improveG(guess, x) TypeError: 'float' object is not iterable. La función final usa la iteración final de la conjetura para restar del método matemático de la raíz cuadrada y devuelve la diferencia general. ¿Estoy haciendo esto bien? Se agradecería el código de trabajo, con sugerencias, si puede proporcionarlo. Nuevamente, soy un novato, así que me disculpo por los conceptos erróneos o los errores obvios ciegos.

Respuestas a la pregunta(5)

Su respuesta a la pregunta