You need to learn about scopes. The variable good exists only within the scope of the function Hello - outside this function the variable is not known.
In your case, you should store the return value of Hello in a variable - and then pass this variable to the function Bye:
def Hello():
good = "Nice"
return good
def Bye(g):
print (g)
g = Hello()
Bye(g)
From the docs:
A scope defines the visibility of a name within a block. If a local variable is defined in a block, its scope includes that block. If the definition occurs in a function block, the scope extends to any blocks contained within the defining one, unless a contained block introduces a different binding for the name.
[...]
When a name is not found at all, a NameError exception is raised. If the current scope is a function scope, and the name refers to a local variable that has not yet been bound to a value at the point where the name is used, an UnboundLocalError exception is raised. UnboundLocalError is a subclass of NameError.