Two ways: first, definig a function and plotting each piece separately, as was suggested in What is the clearest way to graph a piecewise function?; second , using two plots (the first approach might seem an overkill here):
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[
declare function={
func(\x) = (\x<0.5) * (1) + and(\x>0.5, \x<1) * (0);
}
]
\begin{axis}[
axis lines=middle,
enlargelimits
]
\foreach \start/\end in {0/0.5, 0.5/1}
\addplot[domain=\start:\end,blue,thick,samples=10] {func(x)};
\draw[blue,fill=blue]
(axis cs:0.5,1) circle (2pt);
\draw[blue,fill=white]
(axis cs:0.5,0) circle (2pt);
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[
axis lines=middle,
enlargelimits
]
\foreach \start/\end/\Func in {0/0.5/1, 0.5/1/0}
\addplot[domain=\start:\end,blue,thick,samples=10] {\Func};
\draw[blue,fill=blue]
(axis cs:0.5,1) circle (2pt);
\draw[blue,fill=white]
(axis cs:0.5,0) circle (2pt);
\end{axis}
\end{tikzpicture}
\end{document}

The filled and "empty" dots can be produced using small circles placed at the desired location using the axis cs coordinate system. If you want to see the axis beneath the empty dot, add axis on top:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[
declare function={
func(\x) = (\x<0.5) * (1) + and(\x>0.5, \x<1) * (0);
}
]
\begin{axis}[
axis lines=middle,
enlargelimits,
axis on top
]
\foreach \start/\end in {0/0.5, 0.5/1}
\addplot[domain=\start:\end,blue,thick,samples=10] {func(x)};
\draw[blue,fill=blue]
(axis cs:0.5,1) circle (2pt);
\draw[blue,fill=white]
(axis cs:0.5,0) circle (2pt);
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[
axis lines=middle,
enlargelimits,
axis on top
]
\foreach \start/\end/\Func in {0/0.5/1, 0.5/1/0}
\addplot[domain=\start:\end,blue,thick,samples=10] {\Func};
\draw[blue,fill=blue]
(axis cs:0.5,1) circle (2pt);
\draw[blue,fill=white]
(axis cs:0.5,0) circle (2pt);
\end{axis}
\end{tikzpicture}
\end{document}
