Funkcje są podstawowym narzędziem ułatwiającym wykonywanie skomplikowanych zadań. Dzielimy cale zadanie na prostsze czynnosci które potrafimy wykonać ręcznie, a następnie piszemy funkcje które wykonają je automatycznie.

Bardzo prosty przykład: zakładam, że potrafimy dodać trzy liczby w Mathematice, np:

7+9+111

podobnie dodajemy trzy symbole:

a+b+Pi

Teraz chcemy napisać funkcję która dodaje trzy składniki, np: x, y, z. Standardowa składnia wygląda następująco:

dodaj3[x_,y_,z_]:=x+y+z

Podsumowanie składni: 
dodaj3		- nazwa funkcji 	
[] 		- argumenty funkcji zawsze w nawiasach kwadratowych
x_ 		- pierwszy argument składa się z nazwy (x) i symbolu podkreślenia (_)
:=  		- symbol dwukropek i ,,równa się’’ poprzedza definicję funkcji
x+y+z 		- to co funkcja ma zrobić: dodać trzy symbole
Przykładowe wywołanie funkcji:

dodaj3[1,5,9]

dodaj3[a,b,c]

Warto zwrócić uwagę na fakt, iż funkcja która dodaje 3 (i dowolną ilość) symboli istnieje już w Mathematice : jest to Plus:

Plus[a,b,Pi]

Powyższa sytuacja zdarza się często, gdyż Mathematica posiada bardzo rozbudowany język. Czasem szybciej jest napisać jednak własną funkcję, niż doszukać się jej w dokumentacji. Innym powodem pisania własnych funkcji może być chęć ich np. przyspieszenia.

Inne sposoby definiowania funkcji:

dodaj3A=Function[{x,y,z},x+y+z] (* funkcja z nazwanymi argumentami, znana np. z analizy matematycznej *)

dodaj3A[a,b,Pi]

dodaj3B = (#1+#2+#3)& (* czysta funkcja, nie posiadająca nazw argumentów *)

dodaj3B[a,b,Pi]

Przykład: funkcja generująca losową sekwencję DNA.

Na początek sprawdzamy czy potrafimy wygenerować jeden losowy nukleotyd. Mozna to zrobić za pomocą RandomChoice (losowy wybór z listy). Każdorazowe wywołanie może dać inny wynik:

RandomChoice[{"A","C","G","T"}]

Teraz chcemy wygenerować listę np: 10 takich losowych nukleotydów, za pomocą Table:

Table[RandomChoice[{"A","C","G","T"}],{i,1,10}]

Listę należy ,,posklejać’’ aby utworzyć jeden łańcuch tekstowy:

%//StringJoin

Można to zrobić na raz w ten sposób:

Table[RandomChoice[{"A","C","G","T"}],{i,1,10}];
%//StringJoin

lub w ten:

StringJoin[Table[RandomChoice[{"A","C","G","T"}],{i,1,10}]]

lub jeszcze inaczej:

StringJoin@Table[RandomChoice[{"A","C","G","T"}],{i,1,10}]

Nazwijmy funkcję wykonującą te czynności randomDNA. Jej ,,wnętrze’’ (ang. body, ciało) najprościeś wkleić metodą Ctrl+C Ctrl+V.

randomDNA[num_]:=StringJoin[Table[RandomChoice[{"A","C","G","T"}],{i,1,num}]]

randomDNA[100*3]

Nieco bardziej skomplikowana funkcja rozwiązująca podpunkt (a) Zad. 1 z Zestawu 1. Funkcja sprawdza czy podano jej jako argument łańcuch tekstowy ( _?StringQ), i zawiera 5 zmiennych wewnętrznych (dlugosc, czestoscA, czestoscC, czestoscG, czestoscT), tj. niewidocznych poza ,,ciałem’’ funkcji:

czestosc[dna_?StringQ]:=Module[{dlugosc,czestoscA,czestoscC,czestoscG,czestoscT},
dlugosc=StringLength[dna];
czestoscA=StringCount[dna,"A"];
czestoscC=StringCount[dna,"C"];
czestoscG=StringCount[dna,"G"];
czestoscT=StringCount[dna,"T"];
{czestoscA,czestoscC,czestoscG,czestoscT}/dlugosc//N
]

czestosc[Pi]

czestosc[randomDNA[3*100]]

czestosc[GenomeData[{"Chromosome1",{1,300}}]]

GenomeData[{"Chromosome2",{1,300}}]

ch5=GenomeData[{"Chromosome2",{1,10^5}}];

SetOptions[ListPlot,{Joined->True,InterpolationOrder->1,PlotRange->All,AspectRatio->1/3}]

Od momentu napisania i przetestowania funkcji, możemy ją uzywać podobnie jak funkcji wbudowanych. Poniższy wykres pokazuje jak zmienia się częstość występowania nukleotydów na początku chromosomu.

Table[
czestosc[
StringTake[ch5,{1,i}]
]
,{i,1,4000,10}]//Transpose//ListPlot

hox=Cases[GenomeData[],q_/;StringCount[q,"HOX"]≠0]

czestosc[GenomeData["HOXA11"]]

czestosc/@GenomeData/@hox

Sort[%]