Python Forum

Full Version: Creating a variable as a function
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
In JavaScript there is an ability to make a variable a function.

Does that exists in python?

For example, could I do something like this?

Def x(y):
   print(y)

z= def x(‘hello’)

Z()
Thanks!
You can't make anonymous functions, you have to give them a name. So in line 1, your function has the name x.

Once it has a name, you can assign it another name as well and call it that way.

In line 4, you're not just creating a function, you're trying to create a function with some private data (a closure). Yes, you can create such functions and return them.

def x(y):
    print(y)

def z():
    x("hello")

z()
new_name = z
new_name()
Output:
hello hello
Or a better example of a closure:

def make_printer(data):
    def printer_func():
        print(data)
    return printer_func

myhello = make_printer("Hello, world.")
myhello()
Output:
Hello, world.
Anonymous Functions! It was driving me crazy trying to remember what they were called.

Thanks! That really makes things easier for me!
I guess to say "can't" is a little bit strong. Python does have lambda expressions, but they can only be a single expression rather than everything that can be placed into a (named) function.

>>> squareit = lambda x: x**2 # no name, but assigned to squareit
>>> print(squareit(5))
25
But because of the limitations, I think of them as a separate category from python functions.
The suggestion with lambda goes against PEP8 recommendations:

Quote:Always use a def statement instead of an assignment statement that binds a lambda expression directly to an identifier:
# Correct:
def f(x):
    return 2*x

# Wrong:
f = lambda x: 2*x
the first form means that the name of the resulting function object is specifically 'f' instead of the generic '<lambda>'. This is more useful for tracebacks and string representations in general. The use of the assignment statement eliminates the sole benefit a lambda expression can offer over an explicit def statement (i.e. that it can be embedded inside a larger expression)

as to OP question - function is object as any other, you can always assign the function to variable:
def spam():
    print('This is spam')
eggs = spam
eggs()
This has plenty of useful applications, e.g. the pythonic way to create a menu/switch statement, using dict with functions as values.


also, you may be interested in functools.partial

from functools import partial
def raise_power(num, power):
    return num ** power

power_3 = partial(raise_power, power=3)
print(power_3(2))