Les fonctions

Il est possible de définir une fonction de trois façons différentes :

Définition en ligne


In [15]:
f(x)=x+1


Out[15]:
f (generic function with 1 method)

In [16]:
f(2)


Out[16]:
3

In [1]:
g(x,y)=[x*y+1, x-y]


Out[1]:
g (generic function with 1 method)

In [2]:
g(1,2)


Out[2]:
2-element Array{Int64,1}:
  3
 -1

Il est possible d'utiliser begin-end ou ( ; ) pour délimiter la fonction la dernière valeur calculée est retournée


In [27]:
h(x)=begin
    y=2
    x+y
end


Out[27]:
h (generic function with 1 method)

In [1]:
h(3)


h not defined
while loading In[1], in expression starting on line 1

In [2]:
h(x)=(y=2;x+y) # equivallent à la première écriture


Out[2]:
h (generic function with 1 method)

In [3]:
h(3)


Out[3]:
5

Structurée

JULIA possède une structure plus clasique à l'aide de function-end comme précedemment la dernière valeur calculée est par défaut la variable de retour autrement l'utilisation de return spécifie la ou les variables de sortie.


In [3]:
function H(x,y)
    z=x+y;
    z^2/(abs(x)+1)
end


Out[3]:
H (generic function with 1 method)

In [4]:
H(1,2)


Out[4]:
4.5

L'usage de return pour fixer la sortie


In [5]:
function Choix(x)
    if x>0
        return "Positif"
    else
        return "Négatif"
    end
end


Out[5]:
Choix (generic function with 1 method)

In [33]:
txt=Choix(3)


Out[33]:
"Positif"

Anonyme

Le concept peut paraitre abstrait mais on peut définir une fonction sans la nommée puis l'affecter à une variable...


In [35]:
x->x^2


Out[35]:
(anonymous function)

In [38]:
G=x->sqrt(x)


Out[38]:
(anonymous function)

In [39]:
G(1)


Out[39]:
1.0

Arguments de sortie

Pour avoir plusieurs arguments de sortie il faut utiliser un "tuple" autrement dit une collection d'éléments


In [14]:
function multi_output(x,y)
    return x+y, x-y
end


Out[14]:
multi_output (generic function with 1 method)

In [15]:
a=multi_output(1,2) # un seul argument de sortie qui contient un tuple


Out[15]:
(3,-1)

In [16]:
typeof(a)


Out[16]:
(Int64,Int64)

In [18]:
a[1]


Out[18]:
3

In [19]:
a[2]


Out[19]:
-1

In [21]:
a , b =multi_output(1,2) # assignation aux 2 arguments de sortie


Out[21]:
(3,-1)

In [54]:
a


Out[54]:
3

In [22]:
b


Out[22]:
-1

Portée des variables

Quelle est la portée des variables autrement dit une variable définie peut elle être accessible, modifiable dans une fonction sans la passer en paramètre ?


In [23]:
a=1
f(x)=a+x
f(1)


Out[23]:
2

In [29]:
a=1
function ff(x)
    x+a
end
ff(1)


Out[29]:
2

In [30]:
a=1
function ff(x)
    x+a # on utilise a défini en dehors de la fonction
    a=2 # on tente de changer la valeur de a... error !
end
ff(1)


a not defined
while loading In[30], in expression starting on line 6

 in ff at In[30]:3

In [31]:
a=1
function ff(x)
    a=2
    x+a
end
ff(1)


Out[31]:
3

In [32]:
a


Out[32]:
1

Donc par défaut une variable définie est connue et utilisable par toute fonction appellée (de même à l'intérieure d'une fonction).

Si on redéfinie localement dans la fonction la variable alors "elle écrase localement" la dite variable et en sortie de fonction rien n'est modifié.

Attention à l'utilisation dans la fonction d'une variable extérieure puis d'affecter une valeur à cette variable...

Le mapping

Souvent on écrit une fonction sous une forme scalaire sans chercher à utiliser les opérations vectorielles pour appliquer cette fonction à un tableau


In [43]:
f(x)=x^2+1
f(1:5)  # il aurait fallu définir f(x)=x.^2+1


`*` has no method matching *(::UnitRange{Int64}, ::UnitRange{Int64})
while loading In[43], in expression starting on line 2

 in power_by_squaring at intfuncs.jl:56
 in f at In[43]:1

La fonction map permet de palier à ce manquement


In [46]:
map(f,1:5)


Out[46]:
5-element Array{Int64,1}:
  2
  5
 10
 17
 26

In [50]:
map(f,[1 2; 3 4])


Out[50]:
2x2 Array{Int64,2}:
  2   5
 10  17

In [51]:
g(x,y)=x+y
map(g,0:3,1:4)


Out[51]:
4-element Array{Int64,1}:
 1
 3
 5
 7

In [52]:
map(g,[1 2;3 4],[2 3;4 5])


Out[52]:
2x2 Array{Int64,2}:
 3  5
 7  9