Python:Functions: Difference between revisions

From wiki
Jump to navigation Jump to search
 
(9 intermediate revisions by the same user not shown)
Line 4: Line 4:
:Return name of current function
:Return name of current function


;You can pass a function-name as parameter
;eval(functionnameasstring)()
:Convert a function name as string to a function call
:WARNING: Make sure you have control over the string provided, you may call anything this way.
 
 
=Passing arguments=
 
If an argument is a mutable object it is passed by reference. So when you modify the object in the function, the change there in the outside world too.
Immutable objects are passed by value. You cannot change the object, you have to return the new one.


<syntaxhighlight lang='python'>
<syntaxhighlight lang='python'>
def main():
def main():
     outcome = function1(function2,inpar2 = <value>)
     aInt = 1
    aList = ['a']
    bInt = function(aInt, aList)
    print(aInt, bInt, aList) # This will print:  "1 6 ['a', 'something']"
     return
     return


def function1 (functiontocall, inpar2 = <defaultvalue>):
def function (a, b):
     result = functiontocall(inpar2)
     # a is a new integer object
     return result
     # b is a reference to the aList object.
 
    a += 5
def function2 (inpar):
    b.append('something')
    codeblock
     return a
     return result


main()
main()
</syntaxhighlight>
</syntaxhighlight>


;eval(functionnameasstring)()
:Convert a function name as string to a function call
:WARNING: Make sure you have control over the string provided, you may call anything this way.
=Self defined functions=


Arguments are positional but can be passed by keyword too.
Arguments are positional but can be passed by keyword too.
Line 49: Line 53:
:Take any number of keyword arguments and put them in the [[Python:DataTypes#Dictionary_or_dict|dict]] kwargs
:Take any number of keyword arguments and put them in the [[Python:DataTypes#Dictionary_or_dict|dict]] kwargs


;You can pass a function-name as parameter
<syntaxhighlight lang='python'>
def main():
    outcome = function1(function2,inpar2 = <value>)
    return
def function1 (functiontocall, inpar2 = <defaultvalue>):
    result = functiontocall(inpar2)
    return result
def function2 (inpar):
    codeblock
    return result
main()
</syntaxhighlight>


=Anonymous functions(lambda)=
=Anonymous functions(lambda)=
lambda defines an anonymous function.  
lambda defines an anonymous function.


Can be used in may places.
Here the dictionary has lambda functions as value. adict['a'](<value>) calls the function and returns True of False.
<syntaxhighlight lang=python>
adict = {
        'a': lambda a: 0 < a < 10,
        'b': lambda a: 11 < a < 20,
        'c': lambda a: 21 < a < 30,
        'd': lambda a: 31 < a < 40
    }
adict['a'](5)  # True
adict['a'](15) # False
</syntaxhighlight>


=Build in functions=
=Build in functions=
Line 69: Line 105:
;round(x,y)
;round(x,y)
:Round x to y decimals, y defaults to 0
:Round x to y decimals, y defaults to 0
;BEWARE; In python 3x rounding does not work 'As taught in school'[https://stackoverflow.com/questions/10825926/python-3-x-rounding-behavior] but rounding half to even[https://en.wikipedia.org/wiki/Rounding#Round_half_to_even].
;BEWARE; In python 3x rounding does not work 'As taught in school'[https://stackoverflow.com/questions/10825926/python-3-x-rounding-behavior] but rounds half to even[https://en.wikipedia.org/wiki/Rounding#Round_half_to_even].
Use this to implement 'As taught in school' by overwriting the round() function.
Use this to implement 'As taught in school' by overwriting the round() function.


<syntaxhighlight lang=python>
<syntaxhighlight lang=python>
def round(value, digits=0):
def round(valuein, digits=None):
     from decimal import Decimal, ROUND_HALF_UP
     import decimal
    value = str(valuein)
    if digits is None:
        try:
            digits = len(value.split('.')[1])
        except IndexError:
            digits = 0
     formatstring = '1.' + '1' * digits
     formatstring = '1.' + '1' * digits
     return Decimal(str(value)).quantize(Decimal(formatstring), rounding=ROUND_HALF_UP)
     try:
        result = decimal.Decimal(value).quantize(decimal.Decimal(formatstring), rounding=decimal.ROUND_HALF_UP)
    except decimal.InvalidOperation:
        result = valuein
    return result
</syntaxhighlight>
</syntaxhighlight>


Line 95: Line 141:
;isfile(filename)
;isfile(filename)
:If a file exists
:If a file exists
;any(alist)
 
;any(<object>)
:If any of the elements is True (any iterateble will do)
:If any of the elements is True (any iterateble will do)
;any(x in alist for x in aset)
;any(x in alist for x in aset)
:If any of the elements of list are in set
:If any of the elements of list are in set
;all()
;all(<object>)
:If all of the elements are true
:True if all elements of <object> are true (have a value)
 
=Resursive functions=
In resursive functions you should update the objects to return, not create new ones. Use augmented assignment (+=).


=Other often used functions=
=Other often used functions=

Latest revision as of 09:50, 28 April 2026


sys._getframe( ).f_code.co_name
Return name of current function
eval(functionnameasstring)()
Convert a function name as string to a function call
WARNING: Make sure you have control over the string provided, you may call anything this way.


Passing arguments

If an argument is a mutable object it is passed by reference. So when you modify the object in the function, the change there in the outside world too. Immutable objects are passed by value. You cannot change the object, you have to return the new one.

def main():
    aInt = 1
    aList = ['a']
    bInt = function(aInt, aList)
    print(aInt, bInt, aList)  # This will print:  "1 6 ['a', 'something']"
    return

def function (a, b):
    # a is a new integer object
    # b is a reference to the aList object.
    a += 5
    b.append('something')
    return a

main()


Arguments are positional but can be passed by keyword too.

def main():
    outcome = function(par1,par2)
    function(par2 = <value>, par1 = <value>)
    return

def function (inpar1, inpar2 = <defaultvalue>):
    codeblock
    return result

main()


def function (*args,**kwargs)
Take any number of positional arguments and put them in the tuple args
Take any number of keyword arguments and put them in the dict kwargs


You can pass a function-name as parameter
def main():
    outcome = function1(function2,inpar2 = <value>)
    return

def function1 (functiontocall, inpar2 = <defaultvalue>):
    result = functiontocall(inpar2)
    return result

def function2 (inpar):
    codeblock
    return result

main()

Anonymous functions(lambda)

lambda defines an anonymous function.

Can be used in may places.

Here the dictionary has lambda functions as value. adict['a'](<value>) calls the function and returns True of False.

adict = {
        'a': lambda a: 0 < a < 10,
        'b': lambda a: 11 < a < 20,
        'c': lambda a: 21 < a < 30,
        'd': lambda a: 31 < a < 40
    }

adict['a'](5)  # True
adict['a'](15) # False

Build in functions

List of all build in functions [1]

len(obj1)
Return the number of elements in obj1 (string, list, tuple, set)
max(obj1)
Return the largest item in obj1
min(obj1)

Return the smallest item in obj1

round(x,y)
Round x to y decimals, y defaults to 0
BEWARE; In python 3x rounding does not work 'As taught in school'[2] but rounds half to even[3].

Use this to implement 'As taught in school' by overwriting the round() function.

def round(valuein, digits=None):
    import decimal
    value = str(valuein)
    if digits is None:
        try:
            digits = len(value.split('.')[1])
        except IndexError:
            digits = 0
    formatstring = '1.' + '1' * digits
    try:
        result = decimal.Decimal(value).quantize(decimal.Decimal(formatstring), rounding=decimal.ROUND_HALF_UP)
    except decimal.InvalidOperation:
        result = valuein
    return result
input([prompt])
Read and return input from standard input. Display 'prompt' first when provided.
int(string[,base=x)])
Convert str to an integer. Base = 2 converts bit-string presentation ('010101').
str(object)
repr(object)
Return a string representation of an object. str for the informal representation (just make it printable), repr for the formal representation (more formating??)

Boolean functions

Functions that just return True or False

isinsantce(var, type)
If a variable has the wanted type (list,set,int,str,dict)
isfile(filename)
If a file exists
any(<object>)
If any of the elements is True (any iterateble will do)
any(x in alist for x in aset)
If any of the elements of list are in set
all(<object>)
True if all elements of <object> are true (have a value)

Resursive functions

In resursive functions you should update the objects to return, not create new ones. Use augmented assignment (+=).

Other often used functions

Sleep function
import time
time.sleep(<sec>)