blob: 1b3faae64b3a61de2531a79b7d54dfacf0262b1b [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001.. _tut-informal:
2
3**********************************
4An Informal Introduction to Python
5**********************************
6
7In the following examples, input and output are distinguished by the presence or
8absence of prompts (``>>>`` and ``...``): to repeat the example, you must type
9everything after the prompt, when the prompt appears; lines that do not begin
10with a prompt are output from the interpreter. Note that a secondary prompt on a
11line by itself in an example means you must type a blank line; this is used to
12end a multi-line command.
13
Georg Brandl116aa622007-08-15 14:28:22 +000014Many of the examples in this manual, even those entered at the interactive
15prompt, include comments. Comments in Python start with the hash character,
Georg Brandl5d955ed2008-09-13 17:18:21 +000016``#``, and extend to the end of the physical line. A comment may appear at the
17start of a line or following whitespace or code, but not within a string
Christian Heimes5b5e81c2007-12-31 16:14:33 +000018literal. A hash character within a string literal is just a hash character.
Georg Brandl5d955ed2008-09-13 17:18:21 +000019Since comments are to clarify code and are not interpreted by Python, they may
20be omitted when typing in examples.
Georg Brandl116aa622007-08-15 14:28:22 +000021
22Some examples::
23
24 # this is the first comment
25 SPAM = 1 # and this is the second comment
26 # ... and now a third!
27 STRING = "# This is not a comment."
28
29
30.. _tut-calculator:
31
32Using Python as a Calculator
33============================
34
35Let's try some simple Python commands. Start the interpreter and wait for the
36primary prompt, ``>>>``. (It shouldn't take long.)
37
38
39.. _tut-numbers:
40
41Numbers
42-------
43
44The interpreter acts as a simple calculator: you can type an expression at it
45and it will write the value. Expression syntax is straightforward: the
46operators ``+``, ``-``, ``*`` and ``/`` work just like in most other languages
47(for example, Pascal or C); parentheses can be used for grouping. For example::
48
49 >>> 2+2
50 4
51 >>> # This is a comment
52 ... 2+2
53 4
54 >>> 2+2 # and a comment on the same line as code
55 4
56 >>> (50-5*6)/4
Guido van Rossum0616b792007-08-31 03:25:11 +000057 5.0
58 >>> 8/5 # Fractions aren't lost when dividing integers
Mark Dickinsond1cc39d2009-06-28 21:00:42 +000059 1.6
Guido van Rossum0616b792007-08-31 03:25:11 +000060
Georg Brandl48310cd2009-01-03 21:18:54 +000061Note: You might not see exactly the same result; floating point results can
Guido van Rossum0616b792007-08-31 03:25:11 +000062differ from one machine to another. We will say more later about controlling
63the appearance of floating point output; what we see here is the most
64informative display but not as easy to read as we would get with::
65
66 >>> print(8/5)
67 1.6
68
69For clarity in this tutorial we will show the simpler floating point output
70unless we are specifically discussing output formatting, and explain later
71why these two ways of displaying floating point data come to be different.
72See :ref:`tut-fp-issues` for a full discussion.
73
Georg Brandl48310cd2009-01-03 21:18:54 +000074To do integer division and get an integer result,
Guido van Rossum0616b792007-08-31 03:25:11 +000075discarding any fractional result, there is another operator, ``//``::
Georg Brandl48310cd2009-01-03 21:18:54 +000076
Georg Brandl116aa622007-08-15 14:28:22 +000077 >>> # Integer division returns the floor:
Guido van Rossum0616b792007-08-31 03:25:11 +000078 ... 7//3
Georg Brandl116aa622007-08-15 14:28:22 +000079 2
Guido van Rossum0616b792007-08-31 03:25:11 +000080 >>> 7//-3
Georg Brandl116aa622007-08-15 14:28:22 +000081 -3
82
83The equal sign (``'='``) is used to assign a value to a variable. Afterwards, no
84result is displayed before the next interactive prompt::
85
86 >>> width = 20
87 >>> height = 5*9
88 >>> width * height
89 900
90
91A value can be assigned to several variables simultaneously::
92
93 >>> x = y = z = 0 # Zero x, y and z
94 >>> x
95 0
96 >>> y
97 0
98 >>> z
99 0
100
Georg Brandl5d955ed2008-09-13 17:18:21 +0000101Variables must be "defined" (assigned a value) before they can be used, or an
102error will occur::
103
104 >>> # try to access an undefined variable
105 ... n
Georg Brandl48310cd2009-01-03 21:18:54 +0000106 Traceback (most recent call last):
Georg Brandl5d955ed2008-09-13 17:18:21 +0000107 File "<stdin>", line 1, in <module>
108 NameError: name 'n' is not defined
109
Georg Brandl116aa622007-08-15 14:28:22 +0000110There is full support for floating point; operators with mixed type operands
111convert the integer operand to floating point::
112
113 >>> 3 * 3.75 / 1.5
114 7.5
115 >>> 7.0 / 2
116 3.5
117
118Complex numbers are also supported; imaginary numbers are written with a suffix
119of ``j`` or ``J``. Complex numbers with a nonzero real component are written as
120``(real+imagj)``, or can be created with the ``complex(real, imag)`` function.
121::
122
123 >>> 1j * 1J
124 (-1+0j)
Georg Brandle4ac7502007-09-03 07:10:24 +0000125 >>> 1j * complex(0, 1)
Georg Brandl116aa622007-08-15 14:28:22 +0000126 (-1+0j)
127 >>> 3+1j*3
128 (3+3j)
129 >>> (3+1j)*3
130 (9+3j)
131 >>> (1+2j)/(1+1j)
132 (1.5+0.5j)
133
134Complex numbers are always represented as two floating point numbers, the real
135and imaginary part. To extract these parts from a complex number *z*, use
136``z.real`` and ``z.imag``. ::
137
138 >>> a=1.5+0.5j
139 >>> a.real
140 1.5
141 >>> a.imag
142 0.5
143
144The conversion functions to floating point and integer (:func:`float`,
Georg Brandl2d2590d2007-09-28 13:13:35 +0000145:func:`int`) don't work for complex numbers --- there is not one correct way to
146convert a complex number to a real number. Use ``abs(z)`` to get its magnitude
147(as a float) or ``z.real`` to get its real part::
Georg Brandl116aa622007-08-15 14:28:22 +0000148
149 >>> a=3.0+4.0j
150 >>> float(a)
151 Traceback (most recent call last):
152 File "<stdin>", line 1, in ?
153 TypeError: can't convert complex to float; use abs(z)
154 >>> a.real
155 3.0
156 >>> a.imag
157 4.0
158 >>> abs(a) # sqrt(a.real**2 + a.imag**2)
159 5.0
160 >>>
161
162In interactive mode, the last printed expression is assigned to the variable
163``_``. This means that when you are using Python as a desk calculator, it is
164somewhat easier to continue calculations, for example::
165
166 >>> tax = 12.5 / 100
167 >>> price = 100.50
168 >>> price * tax
169 12.5625
170 >>> price + _
171 113.0625
172 >>> round(_, 2)
173 113.06
174 >>>
175
176This variable should be treated as read-only by the user. Don't explicitly
177assign a value to it --- you would create an independent local variable with the
178same name masking the built-in variable with its magic behavior.
179
180
181.. _tut-strings:
182
183Strings
184-------
185
186Besides numbers, Python can also manipulate strings, which can be expressed in
187several ways. They can be enclosed in single quotes or double quotes::
188
189 >>> 'spam eggs'
190 'spam eggs'
191 >>> 'doesn\'t'
192 "doesn't"
193 >>> "doesn't"
194 "doesn't"
195 >>> '"Yes," he said.'
196 '"Yes," he said.'
197 >>> "\"Yes,\" he said."
198 '"Yes," he said.'
199 >>> '"Isn\'t," she said.'
200 '"Isn\'t," she said.'
201
Guido van Rossum0616b792007-08-31 03:25:11 +0000202The interpreter prints the result of string operations in the same way as they
203are typed for input: inside quotes, and with quotes and other funny characters
204escaped by backslashes, to show the precise value. The string is enclosed in
205double quotes if the string contains a single quote and no double quotes, else
206it's enclosed in single quotes. Once again, the :func:`print` function
207produces the more readable output.
208
Georg Brandl116aa622007-08-15 14:28:22 +0000209String literals can span multiple lines in several ways. Continuation lines can
210be used, with a backslash as the last character on the line indicating that the
211next line is a logical continuation of the line::
212
213 hello = "This is a rather long string containing\n\
214 several lines of text just as you would do in C.\n\
215 Note that whitespace at the beginning of the line is\
216 significant."
217
Guido van Rossum0616b792007-08-31 03:25:11 +0000218 print(hello)
Georg Brandl116aa622007-08-15 14:28:22 +0000219
220Note that newlines still need to be embedded in the string using ``\n``; the
221newline following the trailing backslash is discarded. This example would print
222the following::
223
224 This is a rather long string containing
225 several lines of text just as you would do in C.
226 Note that whitespace at the beginning of the line is significant.
227
Benjamin Petersond23f8222009-04-05 19:13:16 +0000228If we make the string literal a "raw" string, ``\n`` sequences are not converted
229to newlines, but the backslash at the end of the line, and the newline character
230in the source, are both included in the string as data. Thus, the example::
Georg Brandl116aa622007-08-15 14:28:22 +0000231
232 hello = r"This is a rather long string containing\n\
233 several lines of text much as you would do in C."
234
Guido van Rossum0616b792007-08-31 03:25:11 +0000235 print(hello)
Georg Brandl116aa622007-08-15 14:28:22 +0000236
237would print::
238
239 This is a rather long string containing\n\
240 several lines of text much as you would do in C.
241
Georg Brandl116aa622007-08-15 14:28:22 +0000242Strings can be concatenated (glued together) with the ``+`` operator, and
243repeated with ``*``::
244
245 >>> word = 'Help' + 'A'
246 >>> word
247 'HelpA'
248 >>> '<' + word*5 + '>'
249 '<HelpAHelpAHelpAHelpAHelpA>'
250
251Two string literals next to each other are automatically concatenated; the first
252line above could also have been written ``word = 'Help' 'A'``; this only works
253with two literals, not with arbitrary string expressions::
254
255 >>> 'str' 'ing' # <- This is ok
256 'string'
257 >>> 'str'.strip() + 'ing' # <- This is ok
258 'string'
259 >>> 'str'.strip() 'ing' # <- This is invalid
260 File "<stdin>", line 1, in ?
261 'str'.strip() 'ing'
262 ^
263 SyntaxError: invalid syntax
264
265Strings can be subscripted (indexed); like in C, the first character of a string
266has subscript (index) 0. There is no separate character type; a character is
Georg Brandle4ac7502007-09-03 07:10:24 +0000267simply a string of size one. As in the Icon programming language, substrings
268can be specified with the *slice notation*: two indices separated by a colon.
269::
Georg Brandl116aa622007-08-15 14:28:22 +0000270
271 >>> word[4]
272 'A'
273 >>> word[0:2]
274 'He'
275 >>> word[2:4]
276 'lp'
277
278Slice indices have useful defaults; an omitted first index defaults to zero, an
279omitted second index defaults to the size of the string being sliced. ::
280
281 >>> word[:2] # The first two characters
282 'He'
283 >>> word[2:] # Everything except the first two characters
284 'lpA'
285
Georg Brandl5d955ed2008-09-13 17:18:21 +0000286Unlike a C string, Python strings cannot be changed. Assigning to an indexed
Georg Brandl116aa622007-08-15 14:28:22 +0000287position in the string results in an error::
288
289 >>> word[0] = 'x'
290 Traceback (most recent call last):
291 File "<stdin>", line 1, in ?
Georg Brandl7fcb3bf2009-05-17 08:18:02 +0000292 TypeError: 'str' object does not support item assignment
Georg Brandl116aa622007-08-15 14:28:22 +0000293 >>> word[:1] = 'Splat'
294 Traceback (most recent call last):
295 File "<stdin>", line 1, in ?
Georg Brandl7fcb3bf2009-05-17 08:18:02 +0000296 TypeError: 'str' object does not support slice assignment
Georg Brandl116aa622007-08-15 14:28:22 +0000297
298However, creating a new string with the combined content is easy and efficient::
299
300 >>> 'x' + word[1:]
301 'xelpA'
302 >>> 'Splat' + word[4]
303 'SplatA'
304
305Here's a useful invariant of slice operations: ``s[:i] + s[i:]`` equals ``s``.
306::
307
308 >>> word[:2] + word[2:]
309 'HelpA'
310 >>> word[:3] + word[3:]
311 'HelpA'
312
313Degenerate slice indices are handled gracefully: an index that is too large is
314replaced by the string size, an upper bound smaller than the lower bound returns
315an empty string. ::
316
317 >>> word[1:100]
318 'elpA'
319 >>> word[10:]
320 ''
321 >>> word[2:1]
322 ''
323
324Indices may be negative numbers, to start counting from the right. For example::
325
326 >>> word[-1] # The last character
327 'A'
328 >>> word[-2] # The last-but-one character
329 'p'
330 >>> word[-2:] # The last two characters
331 'pA'
332 >>> word[:-2] # Everything except the last two characters
333 'Hel'
334
335But note that -0 is really the same as 0, so it does not count from the right!
336::
337
338 >>> word[-0] # (since -0 equals 0)
339 'H'
340
341Out-of-range negative slice indices are truncated, but don't try this for
342single-element (non-slice) indices::
343
344 >>> word[-100:]
345 'HelpA'
346 >>> word[-10] # error
347 Traceback (most recent call last):
348 File "<stdin>", line 1, in ?
349 IndexError: string index out of range
350
351One way to remember how slices work is to think of the indices as pointing
352*between* characters, with the left edge of the first character numbered 0.
353Then the right edge of the last character of a string of *n* characters has
354index *n*, for example::
355
Georg Brandl48310cd2009-01-03 21:18:54 +0000356 +---+---+---+---+---+
Georg Brandl116aa622007-08-15 14:28:22 +0000357 | H | e | l | p | A |
Georg Brandl48310cd2009-01-03 21:18:54 +0000358 +---+---+---+---+---+
359 0 1 2 3 4 5
Georg Brandl116aa622007-08-15 14:28:22 +0000360 -5 -4 -3 -2 -1
361
362The first row of numbers gives the position of the indices 0...5 in the string;
363the second row gives the corresponding negative indices. The slice from *i* to
364*j* consists of all characters between the edges labeled *i* and *j*,
365respectively.
366
367For non-negative indices, the length of a slice is the difference of the
368indices, if both are within bounds. For example, the length of ``word[1:3]`` is
3692.
370
371The built-in function :func:`len` returns the length of a string::
372
373 >>> s = 'supercalifragilisticexpialidocious'
374 >>> len(s)
375 34
376
377
378.. seealso::
379
380 :ref:`typesseq`
Georg Brandl48310cd2009-01-03 21:18:54 +0000381 Strings are examples of *sequence types*, and support the common
Guido van Rossum0616b792007-08-31 03:25:11 +0000382 operations supported by such types.
Georg Brandl116aa622007-08-15 14:28:22 +0000383
384 :ref:`string-methods`
Guido van Rossum0616b792007-08-31 03:25:11 +0000385 Strings support a large number of methods for
Georg Brandl116aa622007-08-15 14:28:22 +0000386 basic transformations and searching.
387
388 :ref:`string-formatting`
Benjamin Petersone6f00632008-05-26 01:03:56 +0000389 Information about string formatting with :meth:`str.format` is described
390 here.
391
392 :ref:`old-string-formatting`
393 The old formatting operations invoked when strings and Unicode strings are
394 the left operand of the ``%`` operator are described in more detail here.
Georg Brandl116aa622007-08-15 14:28:22 +0000395
396
397.. _tut-unicodestrings:
398
Guido van Rossum0616b792007-08-31 03:25:11 +0000399About Unicode
400-------------
Georg Brandl116aa622007-08-15 14:28:22 +0000401
402.. sectionauthor:: Marc-Andre Lemburg <mal@lemburg.com>
403
404
Georg Brandl5d955ed2008-09-13 17:18:21 +0000405Starting with Python 3.0 all strings support Unicode (see
406http://www.unicode.org/).
Georg Brandl116aa622007-08-15 14:28:22 +0000407
408Unicode has the advantage of providing one ordinal for every character in every
409script used in modern and ancient texts. Previously, there were only 256
410possible ordinals for script characters. Texts were typically bound to a code
411page which mapped the ordinals to script characters. This lead to very much
412confusion especially with respect to internationalization (usually written as
413``i18n`` --- ``'i'`` + 18 characters + ``'n'``) of software. Unicode solves
414these problems by defining one code page for all scripts.
415
Guido van Rossum0616b792007-08-31 03:25:11 +0000416If you want to include special characters in a string,
Georg Brandl116aa622007-08-15 14:28:22 +0000417you can do so by using the Python *Unicode-Escape* encoding. The following
418example shows how::
419
Guido van Rossum0616b792007-08-31 03:25:11 +0000420 >>> 'Hello\u0020World !'
421 'Hello World !'
Georg Brandl116aa622007-08-15 14:28:22 +0000422
423The escape sequence ``\u0020`` indicates to insert the Unicode character with
424the ordinal value 0x0020 (the space character) at the given position.
425
426Other characters are interpreted by using their respective ordinal values
427directly as Unicode ordinals. If you have literal strings in the standard
428Latin-1 encoding that is used in many Western countries, you will find it
429convenient that the lower 256 characters of Unicode are the same as the 256
430characters of Latin-1.
431
Georg Brandl116aa622007-08-15 14:28:22 +0000432Apart from these standard encodings, Python provides a whole set of other ways
433of creating Unicode strings on the basis of a known encoding.
434
Guido van Rossum0616b792007-08-31 03:25:11 +0000435To convert a string into a sequence of bytes using a specific encoding,
436string objects provide an :func:`encode` method that takes one argument, the
Georg Brandl116aa622007-08-15 14:28:22 +0000437name of the encoding. Lowercase names for encodings are preferred. ::
438
Georg Brandlc3f5bad2007-08-31 06:46:05 +0000439 >>> "Äpfel".encode('utf-8')
440 b'\xc3\x84pfel'
Georg Brandl116aa622007-08-15 14:28:22 +0000441
442.. _tut-lists:
443
444Lists
445-----
446
447Python knows a number of *compound* data types, used to group together other
448values. The most versatile is the *list*, which can be written as a list of
449comma-separated values (items) between square brackets. List items need not all
450have the same type. ::
451
452 >>> a = ['spam', 'eggs', 100, 1234]
453 >>> a
454 ['spam', 'eggs', 100, 1234]
455
456Like string indices, list indices start at 0, and lists can be sliced,
457concatenated and so on::
458
459 >>> a[0]
460 'spam'
461 >>> a[3]
462 1234
463 >>> a[-2]
464 100
465 >>> a[1:-1]
466 ['eggs', 100]
467 >>> a[:2] + ['bacon', 2*2]
468 ['spam', 'eggs', 'bacon', 4]
469 >>> 3*a[:3] + ['Boo!']
470 ['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']
471
472Unlike strings, which are *immutable*, it is possible to change individual
473elements of a list::
474
475 >>> a
476 ['spam', 'eggs', 100, 1234]
477 >>> a[2] = a[2] + 23
478 >>> a
479 ['spam', 'eggs', 123, 1234]
480
481Assignment to slices is also possible, and this can even change the size of the
482list or clear it entirely::
483
484 >>> # Replace some items:
485 ... a[0:2] = [1, 12]
486 >>> a
487 [1, 12, 123, 1234]
488 >>> # Remove some:
489 ... a[0:2] = []
490 >>> a
491 [123, 1234]
492 >>> # Insert some:
493 ... a[1:1] = ['bletch', 'xyzzy']
494 >>> a
495 [123, 'bletch', 'xyzzy', 1234]
496 >>> # Insert (a copy of) itself at the beginning
497 >>> a[:0] = a
498 >>> a
499 [123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
500 >>> # Clear the list: replace all items with an empty list
501 >>> a[:] = []
502 >>> a
503 []
504
505The built-in function :func:`len` also applies to lists::
506
Guido van Rossum58da9312007-11-10 23:39:45 +0000507 >>> a = ['a', 'b', 'c', 'd']
Georg Brandl116aa622007-08-15 14:28:22 +0000508 >>> len(a)
Guido van Rossum58da9312007-11-10 23:39:45 +0000509 4
Georg Brandl116aa622007-08-15 14:28:22 +0000510
511It is possible to nest lists (create lists containing other lists), for
512example::
513
514 >>> q = [2, 3]
515 >>> p = [1, q, 4]
516 >>> len(p)
517 3
518 >>> p[1]
519 [2, 3]
520 >>> p[1][0]
521 2
Guido van Rossum0616b792007-08-31 03:25:11 +0000522
523You can add something to the end of the list::
524
Georg Brandle4ac7502007-09-03 07:10:24 +0000525 >>> p[1].append('xtra')
Georg Brandl116aa622007-08-15 14:28:22 +0000526 >>> p
527 [1, [2, 3, 'xtra'], 4]
528 >>> q
529 [2, 3, 'xtra']
530
531Note that in the last example, ``p[1]`` and ``q`` really refer to the same
532object! We'll come back to *object semantics* later.
533
534
535.. _tut-firststeps:
536
537First Steps Towards Programming
538===============================
539
540Of course, we can use Python for more complicated tasks than adding two and two
541together. For instance, we can write an initial sub-sequence of the *Fibonacci*
542series as follows::
543
544 >>> # Fibonacci series:
545 ... # the sum of two elements defines the next
546 ... a, b = 0, 1
547 >>> while b < 10:
Georg Brandl22ec03c2008-01-07 17:32:13 +0000548 ... print(b)
549 ... a, b = b, a+b
Georg Brandl48310cd2009-01-03 21:18:54 +0000550 ...
Georg Brandl116aa622007-08-15 14:28:22 +0000551 1
552 1
553 2
554 3
555 5
556 8
557
558This example introduces several new features.
559
560* The first line contains a *multiple assignment*: the variables ``a`` and ``b``
561 simultaneously get the new values 0 and 1. On the last line this is used again,
562 demonstrating that the expressions on the right-hand side are all evaluated
563 first before any of the assignments take place. The right-hand side expressions
564 are evaluated from the left to the right.
565
566* The :keyword:`while` loop executes as long as the condition (here: ``b < 10``)
567 remains true. In Python, like in C, any non-zero integer value is true; zero is
568 false. The condition may also be a string or list value, in fact any sequence;
569 anything with a non-zero length is true, empty sequences are false. The test
570 used in the example is a simple comparison. The standard comparison operators
571 are written the same as in C: ``<`` (less than), ``>`` (greater than), ``==``
572 (equal to), ``<=`` (less than or equal to), ``>=`` (greater than or equal to)
573 and ``!=`` (not equal to).
574
575* The *body* of the loop is *indented*: indentation is Python's way of grouping
576 statements. Python does not (yet!) provide an intelligent input line editing
577 facility, so you have to type a tab or space(s) for each indented line. In
578 practice you will prepare more complicated input for Python with a text editor;
579 most text editors have an auto-indent facility. When a compound statement is
580 entered interactively, it must be followed by a blank line to indicate
581 completion (since the parser cannot guess when you have typed the last line).
582 Note that each line within a basic block must be indented by the same amount.
583
Guido van Rossum0616b792007-08-31 03:25:11 +0000584* The :func:`print` function writes the value of the expression(s) it is
Georg Brandl116aa622007-08-15 14:28:22 +0000585 given. It differs from just writing the expression you want to write (as we did
Georg Brandl48310cd2009-01-03 21:18:54 +0000586 earlier in the calculator examples) in the way it handles multiple
587 expressions, floating point quantities,
Georg Brandl116aa622007-08-15 14:28:22 +0000588 and strings. Strings are printed without quotes, and a space is inserted
589 between items, so you can format things nicely, like this::
590
591 >>> i = 256*256
Guido van Rossum0616b792007-08-31 03:25:11 +0000592 >>> print('The value of i is', i)
Georg Brandl116aa622007-08-15 14:28:22 +0000593 The value of i is 65536
594
Georg Brandl11e18b02008-08-05 09:04:16 +0000595 The keyword *end* can be used to avoid the newline after the output, or end
596 the output with a different string::
Georg Brandl116aa622007-08-15 14:28:22 +0000597
598 >>> a, b = 0, 1
599 >>> while b < 1000:
Georg Brandl11e18b02008-08-05 09:04:16 +0000600 ... print(b, end=' ')
Georg Brandl116aa622007-08-15 14:28:22 +0000601 ... a, b = b, a+b
Georg Brandl48310cd2009-01-03 21:18:54 +0000602 ...
Georg Brandl116aa622007-08-15 14:28:22 +0000603 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987