n00bie wants advice.

Discussion in 'Python' started by bsagert@gmail.com, Jul 2, 2008.

  1. Guest

    This simple script writes html color codes that can be viewed in a
    browser. I used short form hex codes (fff or 000, etc) and my list
    has only six hex numbers otherwise the results get rather large. I
    invite criticism as to whether my code is "pythonic". Are there other
    ways to generate the hex combos besides the nested "for" loops? Thanks
    in advance, Bill

    list = ['3','6','9','b','d','f']

    s = '<html><head><style>h1{margin:0}</style></head><body>\n'

    for a in list:
    for b in list:
    for c in list:
    s += '<h1 style="background:#'+ a + b + c +'">'+ a + b + c +'</h1>
    \n'

    s += '</body></html>'

    f = open('c:/x/test.htm', 'w')
    f.write(s)
    f.close()
    , Jul 2, 2008
    #1
    1. Advertising

  2. On Tue, 01 Jul 2008 23:25:53 -0700, bsagert wrote:

    > This simple script writes html color codes that can be viewed in a
    > browser. I used short form hex codes (fff or 000, etc) and my list
    > has only six hex numbers otherwise the results get rather large. I
    > invite criticism as to whether my code is "pythonic".


    You should not rebind the name `list` because it shadows the built in type
    of that name then. A more descriptive name would be nice anyway, i.e.
    `hex_digits`. And strings are iterable too, so it's a bit shorter and
    easier to type the digits a string.

    Repeatedly concatenating strings with ``+=`` might be performance problem.
    Python strings are immutable so this operation has to copy the involved
    and growing strings over and over again. Although the current CPython
    implementation can optimize here in some cases, the usual idiom is to use
    the `join()` method of strings to build a string from components in a list
    or iterable.

    Alternative implementation of your script:

    from __future__ import with_statement

    def main():
    html_template = ('<html><head><style>h1{margin:0}</style></head><body>\n'
    '%s\n'
    '</body></html>\n')
    header_template = '<h1 style="background:#%s">%s</h1>'
    hex_digits = '369bdf'
    colors = (a + b + c for a in hex_digits
    for b in hex_digits
    for c in hex_digits)
    html = html_template % '\n'.join(header_template % (c, c) for c in colors)
    with open('test.html', 'w') as html_file:
    html_file.write(html)

    if __name__ == '__main__':
    main()
    Marc 'BlackJack' Rintsch, Jul 2, 2008
    #2
    1. Advertising

  3. oj Guest

    On Jul 2, 7:25 am, wrote:
    > This simple script writes html color codes that can be viewed in a
    > browser.  I used short form hex codes (fff or 000, etc) and my list
    > has only six hex numbers otherwise the results get rather large. I
    > invite criticism as to whether my code is "pythonic". Are there other
    > ways to generate the hex combos besides the nested "for" loops? Thanks
    > in advance, Bill
    >
    > list = ['3','6','9','b','d','f']
    >
    > s = '<html><head><style>h1{margin:0}</style></head><body>\n'
    >
    > for a in list:
    >         for b in list:
    >                 for c in list:
    >                         s += '<h1 style="background:#'+ a + b + c +'">'+ a + b + c +'</h1>
    > \n'
    >
    > s += '</body></html>'
    >
    > f = open('c:/x/test.htm', 'w')
    > f.write(s)
    > f.close()


    You could write the loop like this:

    for red, green, blue in [(r, g, b) for r in list for g in list for b
    in list]:
    s += blah blah blah

    but, arguably, that isn't easier to read or understand. It's a matter
    of taste, I guess.

    As has already been mentioned, list is not a good name, because it is
    already used.

    Also, personally, I find it easier to read strings that aren't
    constructed with concatenation, but using pythons string formatting
    gubbins:

    '<h1 style="background: #%s%s%s">' % (red, green, blue)

    Again, I think this is mostly personal preference.
    oj, Jul 2, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ed
    Replies:
    38
    Views:
    1,319
  2. Se'noj

    n00bie questions

    Se'noj, Aug 25, 2004, in forum: C++
    Replies:
    5
    Views:
    345
    Karthik Kumar
    Aug 28, 2004
  3. Asun Friere
    Replies:
    1
    Views:
    498
    Paul Boddie
    Aug 27, 2003
  4. Mark
    Replies:
    11
    Views:
    454
    Stuart MacMartin
    Sep 7, 2005
  5. Replies:
    2
    Views:
    1,895
    John Nagle
    Jun 22, 2008
Loading...

Share This Page