## Python, 245 <strike>256</strike>

    import sys
    def t(n,l):return sum(map(lambda x:int(x**0.5+0.5)**2==x,[int(n[i:j+1])for i in range(l)for j in range(i,l)if n[i]!='0']))/float(l)
    print max(map(lambda x:(x,t(str(x),len(str(x)))),range(*map(int,sys.argv[1:]))),key=lambda y:y[1])[0]

* 256 → 245: Cleaned up the argument parsing code thanks to a tip from [Keith Randall][1].

This could be a lot shorter if the range were read from `stdin` as opposed to the command line arguments.


  [1]: http://codegolf.stackexchange.com/users/67/keith-randall