Python Forum

Full Version: You can call a function without it's arg's?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Absolutely brand new to python.
Here is some code from a tutorial that works, I just don't understand why.
strs = ['xc', 'zb', 'yd' ,'wa']

def MyFn(s):
    return s[-1]

print(sorted(strs, key=MyFn))

## ['wa', 'zb', 'xc', 'yd']
My question is, why am I not required to pass an argument (s) to MyFn?
Why is the code *not*
print(sorted(strs, key=MyFn(strs)))
sorted uses the function that is passed to extract a comparison key from each element in iterable,
it will call the function and fill in s itself.
If you were to call the function, the result of the called function would be given to sorted and it would then not work.
So I can only use functions with a single argument? If my sort value required using 2+ arguments, I'd have to first assign a variable to the return value of the function, then refer to the variable in the sort method?

someVariable = MyFn(10, True, 'Fred')

print(sorted(strs, key=someVariable)
Why would your sort value require 2+ arguments? The argument to the key function is the item being sorted. You just return a different value to be sort that item by.
I'm apparently not being clear. I understand the simplistic example, the syntax, and how it works. What I am asking is what IF you have far more complicated code used to determine what your *single* value is to sort by. I am not asking for how to get 2+ sort values. I am asking how to refer to a function that determines one sort value which requires more than one argument.

sortKeyFunction(i, j, k):
    If i and j or not k:
        return [-1]
    else:
        return [0]
I am not asking about multiple return values. The solution would be easy if the syntax allowed
print(sorted(strs, key=sortKeyFunction(True, True, False)))
but it does not.
I can only assume that you have to assign a variable to the return value of the function and then use the variable in the sorted statement.
As it is stated in the docs:
Quote:The value of the key parameter should be a function that takes a single argument and returns a key to use for sorting purposes.
note the bold text - it should be single argument function
And again I ask: why would you want to do this? Your example returns the same value for every item, so the list order doesn't change. It's pointless. I can't think of a practical reason to have more than one parameter to the key function. If you come up with a practical reason and a real example, we might be able to come up with a way around the restriction of one parameter for the key function. Without that, all we can say is "you can't do that."