[Tutor] What does "TypeError: 'int' object is not iterable" mean?

Steven D'Aprano steve at pearwood.info
Sat Oct 23 02:23:08 CEST 2010

On Sat, 23 Oct 2010 12:42:50 am Richard D. Moores wrote:

> So I wrote a function:
> def float2n_decimals(floatt, n):
>     """
>     Given a float (floatt), return floatt to n decimal places.
>     E.g., with n = 2, 81.34567 -> 81.35
>     """
>     return ("%%.%sf" % n) % floatt
> which works fine, 

float2n_decimals(x, 3)

is better written in place as:

"%.*f" % (3, x)

There's no need for a function for something so simple.

> but a question remains: n is an integer. Why the 
> 's' in '%sf'?

Your function might be more clear if you split the formatting into two 

template = "%%.%sf" % n
return template % floatt

The first line builds a template string from n. Now it becomes clear 
what %s is for: it's to insert the n as a string into the template. %d 
would express the intention of the function better.

By the way, the function docstring is seriously misleading. It describes 
a completely different function:

>     Given a float (floatt), return floatt to n decimal places.
>     E.g., with n = 2, 81.34567 -> 81.35

It does nothing of the sort! What you are describing is the built-in 
function round:

>>> print round(81.34567, 2)

What your function does is return a string, not a float. Besides, given 
a float, where does n come from? A global variable?

There is a convention for giving examples that you should follow. 
Putting the three of these together, your docstring should say 
something like:

    Given a float floatt and an integer n, returns floatt formatted 
    as a string to n decimal places.

    >>> float2n_decimals(2, 81.34567)

(BTW, I really hate the name "floatt". It makes me think you're 

Steven D'Aprano

More information about the Tutor mailing list