Archive

Archive for September, 2010

StringBuilder functionality in Python

September 27, 2010 Leave a comment

Problem

You need to concatenate lots of string elements. Under Java we use a StringBuilder for this, but how to do that in Python?

Solution #1

Use a list, and join the elements of the list at the end. This is much more efficient than concatenating strings since strings are immutable objects, thus if you concatenate a string with another, the result is a NEW string object (the problem is the same with Java strings).

Example:

def g():
    sb = []
    for i in range(30):
        sb.append("abcdefg"[i%7])

    return ''.join(sb)

print g()   # abcdefgabcdefgabcdefgabcdefgab

Solution #2 (update 20120110)

Use a StringIO object and print to it. In short:

from cStringIO import StringIO

out = StringIO()
print >>out, 'arbitrary text'    # 'out' behaves like a file
return out.getvalue()

First 15 digits of PI

September 27, 2010 2 comments

Look at this verse:

How I want a drink
alcoholic of course
After the heavy lectures
involving complex functions

Take the length of the words and you get the first 15 digits of PI. Here is the proof:

import sys
import math

s = """
How I want a drink
alcoholic of course
After the heavy lectures
involving complex functions
"""

print [len(w) for w in s.split()]
print math.pi

Output:

[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
3.14159265359   # the last digit is rounded here

Read more on PI at http://www.eveandersson.com/pi/.

And if you didn’t know, here is the PI song :)

 
Update (20110317)

You can approximate the value of PI with 355/113. The first 6 decimal places are the same. It’s quite easy to memorize it: visualize 113355, split into two (113 and 355), then do the division.

>>> import math
>>> math.pi
3.1415926535897931
>>> 355/113.
3.1415929203539825

Ref.: Kee Nethery at python-list.

Categories: python Tags: , ,

Play sound

September 26, 2010 1 comment

In Python, for playing sound there are several options (see http://stackoverflow.com/search?q=python+play+sound). However, under Ubuntu I didn’t have much success with portable solutions :( I got most luck with wx.Sound('sound.wav') which used to work for a while but then it stopped… So I’ve decided to just call mplayer to do the job.

#!/usr/bin/env python

import os

SOUND = 'Gong.wav'

command = 'mplayer %s 1>/dev/null 2>&1' % SOUND
os.system(command)

Not too elegant but at least it works…

Notes

If you want to launch mplayer in the background without any verbosity, here is how to do that:

mplayer music.mp3 &>/dev/null </dev/null &

Update (20101016): I forgot to mention that with the help of mplayer, you can play videos too. Just pass an AVI instead of an MP3, for instance.

Categories: python Tags: , , , , ,

Pretty print an integer

September 24, 2010 2 comments

Exercise: Take an integer and print it in a pretty way, i.e. use commas as thousands separators. Example: 1977 should be 1,977.

Solution:

#!/usr/bin/env python

def numberToPrettyString(n):
    """Converts a number to a nicely formatted string.
       Example: 6874 => '6,874'."""
    l = []
    for i, c in enumerate(str(n)[::-1]):
        if i%3==0 and i!=0:
            l += ','
        l += c
    return "".join(l[::-1])
#

if __name__ == "__main__":
    number = 6874
    print numberToPrettyString(number)   # '6,874'

The idea is simple. Consider the number 1977. Convert it to string ("1977") and reverse it ("7791"). Start processing it from left to right and after every third character add a comma: "7" -> "77" -> "779," (comma added) -> "779,1". Now reverse the string ("1,977"). Done.

Links

Update (20131125)
There is an easier way. You can do it with string formatting too:

>>> n = 1977
>>> "{:,}".format(n)
'1,977'

Thanks to Krisztián B. for the tip.

Categories: python Tags: , , ,

Reverse a string

September 23, 2010 Leave a comment

Exercise #1: Take a string and reverse its characters. For instance “ab12” => “21ba”.

Solution:

#!/usr/bin/env python

s = 'Python adventures'
print s         # Python adventures
print s[::-1]   # serutnevda nohtyP

Slice notation has the form [start:stop:step]. By default, start is at the beginning of a sequence, stop is at the end, and step is 1. So the slice [::-1] returns the full sequence in reverse order.


Exercise #2: Decide if a word is a palindrome.

Solution:

#!/usr/bin/env python

def is_palindrome(str):
    return str == str[::-1]

print is_palindrome('1367631')      # True
print is_palindrome('Python')       # False
Categories: python Tags: , , ,

ASCII table

September 21, 2010 Leave a comment

Exercise: Print out the ASCII table.

Solution:

#!/usr/bin/env python

for char in range(256):
    print "%d: %c" % (char, char)

Note that range(N) creates a list of elements in the interval [0, N), that is N is excluded. In the example, it will be 0..255.

Output (special characters are removed):

0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33: !
34: "
35: #
36: $
37: %
38: &
39: '
40: (
41: )
42: *
43: +
44: ,
45: -
46: .
47: /
48: 0
49: 1
50: 2
51: 3
52: 4
53: 5
54: 6
55: 7
56: 8
57: 9
58: :
59: ;
60: <
61: =
62: >
63: ?
64: @
65: A
66: B
67: C
68: D
69: E
70: F
71: G
72: H
73: I
74: J
75: K
76: L
77: M
78: N
79: O
80: P
81: Q
82: R
83: S
84: T
85: U
86: V
87: W
88: X
89: Y
90: Z
91: [
92: \
93: ]
94: ^
95: _
96: `
97: a
98: b
99: c
100: d
101: e
102: f
103: g
104: h
105: i
106: j
107: k
108: l
109: m
110: n
111: o
112: p
113: q
114: r
115: s
116: t
117: u
118: v
119: w
120: x
121: y
122: z
123: {
124: |
125: }
126: ~
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161: ¡
162: ¢
163: £
164: ¤
165: ¥
166: ¦
167: §
168: ¨
169: ©
170: ª
171: «
172: ¬
173: ­
174: ®
175: ¯
176: °
177: ±
178: ²
179: ³
180: ´
181: µ
182: ¶
183: ·
184: ¸
185: ¹
186: º
187: »
188: ¼
189: ½
190: ¾
191: ¿
192: À
193: Á
194: Â
195: Ã
196: Ä
197: Å
198: Æ
199: Ç
200: È
201: É
202: Ê
203: Ë
204: Ì
205: Í
206: Î
207: Ï
208: Ð
209: Ñ
210: Ò
211: Ó
212: Ô
213: Õ
214: Ö
215: ×
216: Ø
217: Ù
218: Ú
219: Û
220: Ü
221: Ý
222: Þ
223: ß
224: à
225: á
226: â
227: ã
228: ä
229: å
230: æ
231: ç
232: è
233: é
234: ê
235: ë
236: ì
237: í
238: î
239: ï
240: ð
241: ñ
242: ò
243: ó
244: ô
245: õ
246: ö
247: ÷
248: ø
249: ù
250: ú
251: û
252: ü
253: ý
254: þ
255: ÿ
Categories: python Tags: ,

Template

September 21, 2010 1 comment

Here is the classical “Hello, World!” script in Python. It can be used as a template for writing a new script:

#!/usr/bin/env python

# DESCRIPTION:   hello world
# DATE:          2010.09.21. (yyyy.mm.dd.)

print "Hello, World!"

Tip: If you want to insert source code in your blog at WordPress.com, check out this post: Code » Posting Source Code.

Update (20110503): For a more professional template, see this post, where Guido tells us how he writes his main() functions.

Categories: python Tags: ,