100% found this document useful (1 vote)
24 views

(eBook PDF) Python for Everyone, 2nd Edition by Cay S. Horstmann download

The document provides information about various eBooks available for download, including titles like 'Python for Everyone' and 'Big Java: Early Objects.' It highlights features of the 'Python for Everyone' book, such as its pedagogical elements, exercises, and online resources. Additionally, it mentions options for custom print and eBook formats, along with acknowledgments for contributors to the project.

Uploaded by

ukichacottq9
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
24 views

(eBook PDF) Python for Everyone, 2nd Edition by Cay S. Horstmann download

The document provides information about various eBooks available for download, including titles like 'Python for Everyone' and 'Big Java: Early Objects.' It highlights features of the 'Python for Everyone' book, such as its pedagogical elements, exercises, and online resources. Additionally, it mentions options for custom print and eBook formats, along with acknowledgments for contributors to the project.

Uploaded by

ukichacottq9
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

(eBook PDF) Python for Everyone, 2nd Edition by

Cay S. Horstmann download

https://ebooksecure.com/product/ebook-pdf-python-for-
everyone-2nd-edition-by-cay-s-horstmann/

Download full version ebook from https://ebooksecure.com


We believe these products will be a great fit for you. Click
the link to download now, or visit ebooksecure.com
to discover even more!

(eBook PDF) Big Java: Early Objects, 6th Edition by Cay


S. Horstmann

http://ebooksecure.com/product/ebook-pdf-big-java-early-
objects-6th-edition-by-cay-s-horstmann/

Op Amps for Everyone 5th Edition Carter B. - eBook PDF

https://ebooksecure.com/download/op-amps-for-everyone-ebook-pdf/

Python For Dummies 1st Edition - PDF Version

http://ebooksecure.com/product/python-for-dummies-1st-edition-
pdf-version/

(eBook PDF) POLICE 2nd Edition by John S. Dempsey

http://ebooksecure.com/product/ebook-pdf-police-2nd-edition-by-
john-s-dempsey/
(eBook PDF) Fundamentals of Python: First Programs 2nd
Edition

http://ebooksecure.com/product/ebook-pdf-fundamentals-of-python-
first-programs-2nd-edition/

(eBook PDF) Abnormal Psychology 2nd Edition by Robin S.


Rosenberg

http://ebooksecure.com/product/ebook-pdf-abnormal-psychology-2nd-
edition-by-robin-s-rosenberg/

(Original PDF) Foundations of Criminal Justice 2nd


Edition by Stephen S. Owen

http://ebooksecure.com/product/original-pdf-foundations-of-
criminal-justice-2nd-edition-by-stephen-s-owen/

(eBook PDF) Django for Professionals: Production


websites with Python & Django

http://ebooksecure.com/product/ebook-pdf-django-for-
professionals-production-websites-with-python-django/

Fundamentals Of Python: Data Structures 2nd Edition


Kenneth A. Lambert - eBook PDF

https://ebooksecure.com/download/fundamentals-of-python-data-
structures-ebook-pdf/
Python for
Everyone
2/e

Cay Horstmann
Rance Necaise
vi Preface

Appendices Six appendices provide a handy reference for students on operator


precedence, reserved words, Unicode, the Python standard library, and more.

Graphics and Image Processing


Writing programs that create drawings or process images can provide students with
effective visualizations of complex topics. Chapter 2 introduces the EzGraphics
open-source library and how to use it to create basic graphical drawings. The library,
which students find easier to use than Python’s standard Tkinter library, also sup-
ports simple image processing. Graphics Worked Examples and exercises are pro-
vided throughout the text, all of which are optional.

Exercises
End-of-chapter exercises contain a broad mix of review and programming questions,
with optional questions from graphics, science, and business. Designed to engage
students, the exercises illustrate the value of programming in applied fields.

Custom Book and eBook Options


Python For Everyone may be ordered in both custom print and eBook formats. You
can order a custom print version that includes your choice of chapters—including
those from other Horstmann titles. Visit customselect.wiley.com to create your custom
order.
Python For Everyone is also available in an electronic eBook format with three key
advantages:
• The price is significantly lower than for the printed book.
• The eBook contains all material in the printed book plus the web appendices in
one easy-to-browse format.
• You can customize the eBook to include your choice of chapters.
The interactive edition of Python For Everyone adds even more value by integrating
a wealth of interactive exercises into the eBook. See http://wiley.com/go/pfe2interac-
tivities to find out more about this new format.
Please contact your Wiley sales rep for more information about any of these
options or check www.wiley.com/college/horstmann for available versions.

Web Resources
This book is complemented by a complete suite of online resources. Go to www.wiley.
com/college/horstmann to visit the online companion sites, which include

• Source code for all examples programs and Worked Examples in the book.
• Lecture presentation slides (for instructors only).
• Solutions to all review and programming exercises (for instructors only).
• A test bank that focuses on skills, not just terminology (for instructors only). This
extensive set of multiple-choice questions can be used with a word processor or
imported into a course management system.
• “CodeCheck” assignments that allow students to work on programming prob-
lems presented in an innovative online service and receive immediate feedback.
Instructors can assign exercises that have already been prepared, or easily add
their own.
Preface vii

Acknowledgments
Many thanks to Byran Gambrel, Don Fowley, Jessy Moor, Jennifer Lartz, Graig
Donini, and Billy Ray at John Wiley & Sons, and Vickie Piercey at Publishing Ser-
vices for their help with this project. An especially deep acknowledgment and thanks
goes to Cindy Johnson for her hard work, sound judgment, and amazing attention to
detail.
We are grateful to the following for their excellent work preparing and reviewing
the supplemental materials:
Jim Carrier, Guilford Technical Community College
Akshaye Dhawan, Ursinus College
Byron Hoy, Stockton University
Maria Laurent-Rice, Orange Coast College
John McManus, Randolph-Macon College
Ben Stephenson, University of Calgary
Amanda Stouder, Rose-Hulman Institute of Technology
Dean Zeller, University of Northern Colorado
Many thanks to the individuals who provided feedback, reviewed the manuscript,
made valuable suggestions, and brought errors and omissions to our attention. They
include:
Claude Anderson, Rose Hulman Institute of Technology
Gokcen Cilingir, Washington State University
Lee D. Cornell, Minnesota State University, Mankato
Dirk Grunwald, University of Colorado Boulder
Andrew Harrington, Loyola University Chicago
Debbie Keen, University of Kentucky
Nicholas A. Kraft, University of Alabama
Aaron Langille, Laurentian University
Shyamal Mitra, University of Texas Austin
Chandan R. Rupakheti, Rose-Hulman Institute of Technology
John Schneider, Washington State University
Amit Singhal, University of Rochester
Ben Stephenson, University of Calgary
Amanda Stouder, Rose-Hulman Institute of Technology
Dave Sullivan, Boston University
Jay Summet, Georgia Institute of Technology
James Tam, University of Calgary
Krishnaprasad Thirunarayan, Wright State University
Leon Tietz, Minnesota State University, Mankato
Peter Tucker, Whitworth University
Frances VanScoy, West Virginia University
viii Walkthrough

A Walkthrough of the Learning Aids


The pedagogical elements in this book work together to focus on and reinforce key
concepts and fundamental principles of programming, with additional tips and detail
organized to support and deepen these fundamentals. In addition to traditional fea-
tures, such as chapter objectives and a wealth of exercises, each chapter contains ele-
ments geared to today’s visual learner.

1.5 Analyzing Your First Program 11

1.5 Analyzing Your First Program


In this section, we will analyze the first Python program in detail. Here again is the
code:

ch01/hello.py

1 # My first Python program.


2 print("Hello, World!")

A Python program contains one or more lines of instructions or statements that will
be translated and executed by the Python interpreter. The first line
Throughout each chapter, # My first Python program.

margin notes show where A comment provides


information to
is a comment. Comments begin with # and are not statements. They provide descrip-
tive information to the programmer. Comments will be discussed in more detail in
new concepts are introduced the programmer. Section 2.1.5.
The second line contains a statement
and provide an outline of key ideas. print("Hello, World!")

A function is
that prints or displays a line of text, namely “Hello, World!”. In this statement, we
a collection of call a function named print and pass it the information to be displayed. A function is
instructions a collection of programming instructions that carry out a particular task. We do not
that perform a
particular task.
have to implement this function, it is part of the Python language. We simply want
the function to perform its intended task, namely to print a value.
A function is called
To use, or call, a function in Python, you need to specify
by specifying the
1. The name of the function you want to use (in this case, print).
function name and
its arguments. 2. Any values the function needs to carry out its task (in this case, "Hello, World!").
The technical term for such a value is an argument. Arguments are enclosed in
Annotated syntax boxes parentheses with multiple arguments separated by commas. The number of
arguments required depends on the function.
provide a quick, visual overview
of new language constructs.
Syntax 1.1 print Statement

Syntax print()
print(value1, value2, ..., valuen)

All arguments are optional. If no arguments


Annotations explain required are given, a blank line is printed.

components and point to more print("The answer is", 6 + 7, "!")

information on common errors The v alues to be printed,


one after the other ,
or best practices associated separated by a blank space.
with the syntax.

Analogies to everyday objects are


used to explain the nature and behavior
of concepts such as variables, data
Like a variable in a computer types, loops, and more.
program, a parking space has
an identifier and a contents.
Walkthrough ix

Memorable photos reinforce


analogies and help students
remember the concepts. pie(fruit) pie(fruit)

A recipe for a fruit pie may say to use any kind of fruit.
Here, “fruit” is an example of a parameter variable.
Apples and cherries are examples of arguments.

Problem Solving sections teach


techniques for generating ideas and 6.6 Problem Solving: Discovering Algorithms by Manipulating Physical Objects 311

evaluating proposed solutions, often Now how does that help us with our problem, switching the first and the second
using pencil and paper or other half of the list?
Let’s put the first coin into place, by swapping it with the fifth coin. However, as
artifacts. These sections emphasize Python programmers, we will say that we swap the coins in positions 0 and 4:

that most of the planning and problem


solving that makes students successful
happens away from the computer.

HOW TO 1.1 Describing an Algorithm with Pseudocode


This is the first of many “How To” sections in this book that give you step-by-step proce- How To guides give step-by-step
dures for carrying out important tasks in developing computer programs.
Before you are ready to write a program in Python, you need to develop an algorithm—a guidance for common programming
method for arriving at a solution for a particular problem. Describe the algorithm in pseudo-
code: a sequence of precise steps formulated in English. tasks, emphasizing planning and
Problem Statement You have the choice of buying two
cars. One is more fuel efficient than the other, but also more testing. They answer the beginner’s
expensive. You know the price and fuel efficiency (in miles per
gallon, mpg) of both cars. You plan to keep the car for ten years. question, “Now what do I do?” and
Assume a price of $4 per gallon of gas and usage of 15,000 miles
per year. You will pay cash for the car and not worry about integrate key concepts into a
financing costs. Which car is the better deal?
problem-solving sequence.
Step 1 Determine the inputs and outputs.
In our sample problem, we have these inputs:
• purchase price1 and fuel efficiency1 , the price and fuel efficiency (in mpg) of the first car
• purchase price2 and fuel efficiency2, the price and fuel efficiency of the second car
We simply
WORKED EXAMPLE 1.1 want to know which
Writing car is the better
an Algorithm forbuy. That isathe
Tiling desired output.
Floor
Worked Examples apply
Problem Statement Make a plan for tiling a rectangular bathroom floor with alternating
the steps in the How To to a
black and white tiles measuring 4 × 4 inches. The floor dimensions, measured in inches, are
multiples of 4.
different example, showing
how they can be used to
Step 1 Determine the inputs and outputs. plan, implement, and test
The inputs are the floor dimensions (length × width),
measured in inches. The output is a tiled floor.
a solution to another
Step 2 Break down the problem into smaller tasks. programming problem.
A natural subtask is to lay one row of tiles. If you can
solve that task, then you can solve the problem by laying
one row next to the other, starting from a wall, until you
reach the opposite wall.

Example tables support beginners


Table 1 Number Literals in Python with multiple, concrete examples.
Number Type Comment These tables point out common
6 int An integer has no fractional part.
errors and present another quick
Integers can be negative.
reference to the section’s topic.
–6 int

0 int Zero is an integer.

0.5 float A number with a fractional part has type float.

1.0 float An integer with a fractional part .0 has type float.

1E6 float A number in exponential notation: 1 × 106 or 1000000.


Numbers in exponential notation always have type float.
2.96E-2 float Negative exponent: 2.96 × 10–2 = 2.96 / 100 = 0.0296 Optional graphics programming
100,000 Error: Do not use a comma as a decimal separator.
examples demonstrate constructs
Error: Do not use fractions; use decimal notation: 3.5.
with engaging drawings, visually
3 1/2

reinforcing programming concepts.


x Walkthrough

Figure 2
1 Check the loop condition
Execution of the
doubleinv.py Loop while balance < TARGET :
The condition is true
Progressive figures trace code
10000.0
segments to help students visualize
balance = year = year + 1
interest = balance * RATE / 100
year = 0 balance = balance + interest
the program flow. Color is used
2 Execute the statements in the loop consistently to make variables and
balance = 10500.0
while balance < TARGET :
year = year + 1 other elements easily recognizable.
interest = balance * RATE / 100 g
year = 1 balance = balance + interest

interest = 500.0 Figure 3


1 Function call result1 =
Parameter P
result1 = cubeVolume(2)
3 Check the loop condition again
The condition is still true
sideLength =
while balance < TARGET :
balance = 10500.0 year = year + 1
interest = balance * RATE / 100
2 Initializing function parameter variable result1 =
year = 1 balance = balance + interest
result1 = cubeVolume(2)
interest = 500.0
sideLength = 2
.
.
.
3 About to return to the caller result1 =
4 After 15 iterations
The condition is
while balance < TARGET : no longer true
balance = 20789.28 year = year + 1
sideLength = 2
interest = balance * RATE / 100 volume = sideLength ** 3
year = 15 balance = balance + interest return volume
volume = 8
interest = 989.97
4 After function call result1 = 8
result1 = cubeVolume(2)
5 Execute the statement following the loop

while balance < TARGET :


balance = 20789.28 year = year + 1 Consider the function call illustrated in Figure 3:
interest = balance * RATE / 100 result1 = cubeVolume(2)
year = 15 balance = balance + interest
• The parameter variable sideLength of the cubeVolume function is created when the
interest = 989.97 print(year) function is called. 1
• The parameter variable is initialized with the value of the argument that was
passed in the call. In our case, sideLength is set to 2. 2
• The function computes the expression sideLength ** 3, which has the value 8. That
value is stored in the variable volume. 3
• The function returns. All of its variables are removed. The return value is trans-
ferred to the caller, that is, the function calling the cubeVolume function. The caller
puts the return value in the result1 variable. 4
Self-check exercises at the SELF CHECK 25. Write the for loop of the investment.py program as a while loop.
end of each section are designed 26. How many numbers does this loop print?

to make students think through for n in range(10, -1, -1) :


print(n)

the new material—and can 27. Write a for loop that prints all even numbers between 10 and 20 (inclusive).
28. Write a for loop that computes the total of the integers from 1 to n.
spark discussion in lecture. 29. How would you modify the loop of the investment.py program to print all bal-
ances until the investment has doubled?

Practice It Now you can try these exercises at the end of the chapter: R4.18, R4.19, P4.8.

•• Business P4.28 Currency conversion. Write a program


that first asks the user to type today’s
price for one dollar in Japanese yen,
then reads U.S. dollar values and
Optional science, graphics, and converts each to yen. Use 0 as a sentinel.

business exercises engage •• Business P4.29 Write a program that first asks the user
•• Graphics P2.30 Write
to type a program
in today’s pricethat displays
of one dollarthe Olympic rings. Color the rings in the Olympic
students with realistic applications. colors.yen, then reads U.S. dollar
in Japanese
l d h

• Science P4.37 Radioactive


Make a bar chartdecay of the
to plot radioactive materials
following data set.can be each bar.
Label
modeled by the equation A = A0e-t (log 2 /h), where A is
the amount of the material
Bridgeat time
Name t, A0 is Longest
the amount
Span (ft)
ch04/doubleinv.py at time 0, and h is the half-life.
Golden Gate 4,200
1 ## Technetium-99 is a radioisotope that is used in imaging
2 # This program computes the time required to double an investment. of the brain. It has a half-life of 6 hours. Your program
Brooklyn 1,595
3 #
4
should display the relative amount A /A0 in a patient
5 # Create constant variables. body every hour forDelaware
24 hoursMemorial 2,150
after receiving a dose.
6 RATE = 5.0
7 INITIAL_BALANCE = 10000.0
8 TARGET = 2 * INITIAL_BALANCE
9
10 # Initialize variables used with the loop.
11 balance = INITIAL_BALANCE Program listings are carefully
12 year = 0
13 designed for easy reading, going
14 # Count the years required for the investment to double.
15
16
while balance < TARGET :
year = year + 1
well beyond simple color coding.
17
18
interest = balance * RATE / 100
balance = balance + interest
Methods and functions are set
19
20 # Print the results. off by a subtle outline.
21 print("The investment doubled after", year, "years.")
Walkthrough xi

TOOLBOX 7 . 1 Working with CSV Files


You have seen how to read and write text files and to process data stored in various formats,
but what if you need to process data stored in a spreadsheet? For example, suppose you need
to print a list of all the movies released in the 1990s from a spreadsheet filled with movie data,
such as the one shown below.
Toolbox sections teach students
how to use Python libraries for
solving real-world problems.

Most spreadsheet applications store their data in proprietary file formats that cannot be
accessed directly by other programs. Fortunately, most can save a copy of the data in a porta-
ble format known as CSV (Comma-Separated Values). A CSV file is simply a text file in which
each row of the spreadsheet is stored as a line of text. The data values in each row are separated
by commas. For example, the CSV file created from the spreadsheet shown above contains:
Common Errors describe the kinds Common Error 3.2 Exact Comparison of Floating-Point Numbers
Floating-point numbers have only a limited precision, and cal-
of errors that students often make, culations can introduce roundoff errors. You must take these
inevitable roundoffs into account when comparing floating-
with an explanation of why the errors point numbers. For example, the following code multiplies the
square root of 2 by itself. Ideally, we expect to get the answer 2:
occur, and what to do about them. from math import sqrt

r = sqrt(2.0)
if r * r == 2.0 : Take limited precision into
print("sqrt(2.0) squared is 2.0") account when comparing
else : floating-point numbers.
print("sqrt(2.0) squared is not 2.0 but", r * r)
This program displays
sqrt(2.0) squared is not 2.0 but 2.0000000000000004

Hand-Tracing It does not make sense in most circumstances to compare floating-point numbers exactly.
Programming Tip 3.2 Instead, we should test whether they are close enough. That is, the magnitude of their differ-
A very useful technique for ence understanding whether
should be less a prothreshold.
than some gram Mathematically, we would write that x and y are close
works correctly is called hand-tracing.
enough if You simulate the pro-
gram’s activity on a sheet of paper. You can use this method with
pseudocode or Python code.
Get an index card, a cocktail napkin, or whatever sheet of paper
is within reach. Make a column for each variable. Have the pro-
gram code ready. Use a marker, such as a paper clip, to mark the
current statement. In your mind, execute statements one at a time.
Programming Tips explain Every time the value of a variable changes, cross out the old value
and write the new value below the old one. Hand-tracing helps you
good programming practices, Let’s trace the taxes.py program on page 107 with the inputs from understand whether a
the program run that follows it. In lines 12 and 13, income and program works correctly.
and encourage students to be maritalStatus are initialized by input statements.

more productive with tips and


5 # Initialize constant variables for the tax rates and rate limits.
6 RATE1 = 0.10 marital
7 RATE2 = 0.25 tax1 tax2 income status
techniques such as hand-tracing.
8 RATE1_SINGLE_LIMIT = 32000.0
9 RATE1_MARRIED_LIMIT = 64000.0 80000 m
10
11 # Read income and marital status.
12 income = float(input("Please enter your income: "))
13 maritalStatus = input("Please enter s for single, m for married: ")

In lines 16 and 17, tax1 and tax2 are


marital
initialized to 0.0. tax1 tax2 income status
tax1 = 0.0
tax2 = 0.0
Computing & Society 1.1 Computers
0 0 Are Everywhere
80000 m
When computers were first The advent of ubiqui-
invented in the 1940s, a tous computing changed
computer filled an entire many aspects of our
room. The photo below shows the lives. Factories used

Computing & Society presents social ENIAC (electronic numerical integra-


tor and computer), completed in 1946
to employ people to
do repetitive assembly
at the University of Pennsylvania. tasks that are today car-
and historical information on computing— The ENIAC was used by the military ried out by computer-
to compute the trajectories of projec- controlled robots, oper-
for interest and to fulfill the “historical tiles. Nowadays, computing facilities
of search engines, Internet shops, and
ated by a few people
who know how to work
and social context” requirements of the social networks fill huge buildings
called data centers. At the other end of
with those computers.
Books, music, and mov-

ACM/IEEE curriculum guidelines. the spectrum, computers are all around


us. Your cell phone has a computer
ies nowadays are often
consumed on comput- This transit card contains a computer.
inside, as do many credit cards and fare ers, and computers are
cards for public transit. A modern car almost always involved
has several computers––to control the in their production. The book that not have been written without
engine, brakes, lights, and the radio. you are reading right now could computers.

Special Topic 3.4 Short-Circuit Evaluation of Boolean Operators


The and and or operators are computed using short-circuit evalu-
The and and or
ation. In other words, logical expressions are evaluated from left to operators are
right, and evaluation stops as soon as the truth value is determined. computed using
When an and is evaluated and the first condition is false, the second short-circuit
condition is not evaluated, because it does not matter what the out- evaluation: As soon
as the truth value
come of the second test is. is determined, no
For example, consider the expression further conditions
quantity > 0 and price / quantity < 10 are evaluated.

Suppose the value of quantity is zero. Then the test quantity > 0 fails, and the second test is not
attempted. That is just as well, because it is illegal to divide by zero.
Similarly, when the first condition of an or expres-
sion is true, then the remainder is not evaluated because
Special Topics present optional the result must be true.

topics and provide additional In a short circuit, electricity travels along the path of
least resistance. Similarly, short-circuit evaluation
explanation of others. takes the fastest path for computing the result
of a Boolean expression.
CONTENTS
PREFACE iii CE3 Unbalanced Parentheses 41
SPECIAL FEATURES xviii PT3 Use Spaces in Expressions 42
ST1 Other Ways to Import Modules 42
ST2 Combining Assignment and Arithmetic 42
1 INTRODUCTION 1 ST3 Line Joining 43

1.1 Computer Programs   2 2.3 PROBLEM SOLVING: First Do It By Hand   43


1.2 The Anatomy of a Computer   3 WE1 Computing Travel Time 45

CS1 Computers Are Everywhere 5 2.4 Strings  46


1.3 The Python Programming Language   5 The String Type 46
Concatenation and Repetition 47
1.4 Becoming Familiar with Your Programming
Converting Between Numbers and Strings 48
Environment  6 Strings and Characters 48
PT1 Interactive Mode 9 String Methods 50
PT2 Backup Copies 9 ST4 Character Values 51
ST1 The Python Interpreter 10 ST5 Escape Sequences 52
1.5 Analyzing Your First Program   11 CS1 International Alphabets and Unicode 52
1.6 Errors  13 2.5 Input and Output   53
CE1 Misspelling Words 15 User Input 53
1.7 PROBLEM SOLVING: Algorithm Design   15 Numerical Input 54
HT1 Describing an Algorithm with Formatted Output 54
Pseudocode 19 PT4 Don’t Wait to Convert 58
WE1 Writing an Algorithm for Tiling a Floor 20 HT1 Writing Simple Programs 58
WE2 Computing the Cost of Stamps 61
CS2 The Pentium Floating-Point Bug 63
2 PROGRAMMING WITH
NUMBERS AND STRINGS 27 2.6 GRAPHICS: Simple Drawings   63
Creating a Window 64
2.1 Variables  28 Lines and Polygons 66
Defining Variables 28 Filled Shapes and Color 67
Number Types 30 Ovals, Circles, and Text 69
Variable Names 31 HT2 GRAPHICS: Drawing Graphical Shapes 70
Constants 32 TOOLBOX1 Symbolic Processing with SymPy 73
Comments 33
CE1 Using Undefined Variables 34
PT1 Choose Descriptive Variable Names 34
3 DECISIONS 91
PT2 Do Not Use Magic Numbers 35
3.1 The if Statement   92
2.2 Arithmetic  35 CE1 Tabs 96
Basic Arithmetic Operations 35 PT1 Avoid Duplication in Branches 96
Powers 36 ST1 Conditional Expressions 97
Floor Division and Remainder 37
3.2 Relational Operators   97
Calling Functions 38
CE2 Exact Comparison of Floating-Point
Mathematical Functions 39
Numbers 101
CE2 Roundoff Errors 41
ST2 Lexicographic Ordering of Strings 101

xii
Contents xiii

HT1 Implementing an if Statement 102 Maximum and Minimum 184


WE1 Extracting the Middle 104 Comparing Adjacent Values 185
3.3 Nested Branches   106 4.6 The for Loop   187
PT2 Hand-Tracing 108 PT1 Count Iterations 191
CS1 Denver’s Luggage Handling System 109 HT1 Writing a Loop 192

3.4 Multiple Alternatives   110 4.7 Nested Loops   194


TOOLBOX1 Sending E-mail 113 ST3 Special Form of the print Function 198
WE1 Average Exam Grades 198
3.5 PROBLEM SOLVING: Flowcharts   115
WE2 A Grade Distribution Histogram 200
3.6 PROBLEM SOLVING: Test Cases   119
PT3 Make a Schedule and Make Time for 4.8 Processing Strings   202
Unexpected Problems 120 Counting Matches 202
Finding All Matches 203
3.7 Boolean Variables and Operators   121
Finding the First or Last Match 203
CE3 Confusing and and or Conditions 124
Validating a String 204
PT4 Readability 124
Building a New String 204
ST3 Chaining Relational Operators 125
4.9 APPLICATION: Random Numbers and
ST4 Short-Circuit Evaluation of Boolean
Operators 125 Simulations  206
ST5 De Morgan’s Law 126 Generating Random Numbers 207
Simulating Die Tosses 207
3.8 Analyzing Strings   126
The Monte Carlo Method 208
3.9 APPLICATION: Input Validation   130 WE3 GRAPHICS: Bull’s Eye 210
ST6 Terminating a Program 133
4.10 GRAPHICS: Digital Image Processing   212
ST7 Interactive Graphical Programs 133
Filtering Images 212
CS2 Artificial Intelligence 134
Reconfiguring Images 215
WE2 GRAPHICS: Intersecting Circles 134
TOOLBOX2 Plotting Simple Graphs 138 4.11 PROBLEM SOLVING: Solve a Simpler
Problem First   217
CS2 Digital Piracy 223
4 LOOPS 165
4.1 The while Loop   166 5 FUNCTIONS 245
CE1 Don’t Think “Are We There Yet?” 170
CE2 Infinite Loops 171 5.1 Functions as Black Boxes   246
CE3 Off-by-One Errors 171 5.2 Implementing and Testing Functions   248
CS1 The First Bug 172 Implementing a Function 248
4.2 PROBLEM SOLVING: Hand-Tracing   173 Testing a Function 249
Programs that Contain Functions 250
4.3 APPLICATION: Processing Sentinel
PT1 Function Comments 252
Values  176
5.3 Parameter Passing   252
ST1 Processing Sentinel Values with a
Boolean Variable 179 PT2 Do Not Modify Parameter Variables 254

ST2 Redirection of Input and Output 179 CE1 Trying to Modify Arguments 254

4.4 PROBLEM SOLVING: Storyboards   180 5.4 Return Values   255


ST1 Using Single-Line Compound
4.5 Common Loop Algorithms   183
Statements 256
Sum and Average Value 183 HT1 Implementing a Function 257
Counting Matches 184
WE1 Generating Random Passwords 259
Prompting Until a Match is Found 184
xiv Contents

5.5 Functions Without Return Values   263 Copying Lists 326


5.6 PROBLEM SOLVING: Reusable ST2 Slices 328

Functions  265 6.3 Common List Algorithms   328


CS1 Personal Computing 268 Filling 329
5.7 PROBLEM SOLVING: Stepwise Combining List Elements 329
Element Separators 329
Refinement  269
Maximum and Minimum 330
PT3 Keep Functions Short 273
Linear Search 330
PT4 Tracing Functions 274
Collecting and Counting Matches 331
PT5 Stubs 275
Removing Matches 331
WE2 Calculating a Course Grade 275 Swapping Elements 332
WE3 Using a Debugger 278 Reading Input 333
5.8 Variable Scope   282 WE1 Plotting Trigonometric Functions 335
PT6 Avoid Global Variables 285 6.4 Using Lists with Functions   338
WE4 GRAPHICS: Rolling Dice 285 ST3 Call by Value and Call by Reference 341
5.9 GRAPHICS: Building an Image Processing ST4 Tuples 342
Toolkit  288 ST5 Functions with a Variable Number of
Getting Started 288 Arguments 342
Comparing Images 289 ST6 Tuple Assignment 343
Adjusting Image Brightness 290 ST7 Returning Multiple Values with Tuples 343
Rotating an Image 291 TOOLBOX1 Editing Sound Files 344
Using the Toolkit 292 6.5 PROBLEM SOLVING: Adapting
WE5 Plotting Growth or Decay 294 Algorithms  345
5.10 Recursive Functions (Optional)   296 HT1 Working with Lists 347
HT2 Thinking Recursively 299 WE2 Rolling the Dice 349

6.6 PROBLEM SOLVING: Discovering Algorithms by


6 LISTS 315 Manipulating Physical Objects   352
6.7 Tables  356
6.1 Basic Properties of Lists   316
Creating Tables 357
Creating Lists 316
Accessing Elements 358
Accessing List Elements 317
Locating Neighboring Elements 358
Traversing Lists 318
Computing Row and Column Totals 359
List References 319
Using Tables with Functions 360
CE1 Out-of-Range Errors 320
WE3 A World Population Table 362
ST1 Reverse Subscripts 320
ST8 Tables with Variable Row Lengths 364
PT1 Use Lists for Sequences of Related
WE4 GRAPHICS: Drawing Regular Polygons 365
Items 321
CS1 Computer Viruses 321

6.2 List Operations   322 7 FILES AND EXCEPTIONS 383


Appending Elements 322 7.1 Reading and Writing Text Files   384
Inserting an Element 322
Opening a File 384
Finding an Element 323
Reading from a File 385
Removing an Element 324
Writing from a File 386
Concatenation and Replication 325
A File Processing Example 386
Equality Testing 325
CE1 Backslashes in File Names 388
Sum, Maximum, Minimum, and Sorting 325
Contents xv

7.2 Text Input and Output   388 PT1 Use Python Sets, Not Lists, for Efficient Set
Iterating over the Lines of a File 388 Operations 466
Reading Words 390 ST1 Hashing 467
Reading Characters 392 CS1 Standardization 468
Reading Records 393 8.2 Dictionaries  468
ST1 Reading the Entire File 397 Creating Dictionaries 469
ST2 Regular Expressions 397 Accessing Dictionary Values 470
ST3 Character Encodings 398 Adding and Modifying Items 470
TOOLBOX1 Working with CSV Files 399 Removing Items 471
7.3 Command Line Arguments   401 Traversing a Dictionary 472
HT1 Processing Text Files 404 ST2 Iterating over Dictionary Items 475

WE1 Analyzing Baby Names 407 ST3 Storing Data Records 475

TOOLBOX2 Working with Files and WE2 Translating Text Messages 476
Directories 410 8.3 Complex Structures   478
CS1 Encryption Algorithms 412 A Dictionary of Sets 478
7.4 Binary Files and Random Access A Dictionary of Lists 481
(Optional)  413 ST4 User Modules 484
Reading and Writing Binary Files 413 WE3 GRAPHICS: Pie Charts 484
Random Access 414 TOOLBOX1 Harvesting JSON Data from
Image Files 415 the Web 489
Processing BMP Files 416
WE2 GRAPHICS: Displaying a Scene File 419 9 OBJECTS AND CLASSES 499
7.5 Exception Handling   422
Raising Exceptions 423
9.1 Object-Oriented Programming   500
Handling Exceptions 424 9.2 Implementing a Simple Class   502
The finally Clause 426 9.3 Specifying the Public Interface of
PT1 Raise Early, Handle Late 428 a Class   506
PT2 Do Not Use except and finally in the
Same try Statement 428
9.4 Designing the Data Representation   508
PT1 Make All Instance Variables Private, Most
ST4 The with Statement 428
Methods Public 509
TOOLBOX3 Reading Web Pages 429
9.5 Constructors  510
7.6 APPLICATION: Handling Input Errors   430
CE1 Trying to Call a Constructor 512
TOOLBOX4 Statistical Analysis 433
ST1 Default and Named Arguments 512
WE3 Creating a Bubble Chart 438
CS2 The Ariane Rocket Incident 441 9.6 Implementing Methods   513
PT2 Define Instance Variables Only in the
Constructor 516
8 SETS AND ST2 Class Variables 516
DICTIONARIES 457 9.7 Testing a Class   517
8.1 Sets  458 HT1 Implementing a Class 519
WE1 Implementing a Bank Account Class 522
Creating and Using Sets 458
Adding and Removing Elements 459 9.8 PROBLEM SOLVING: Tracing Objects   525
Subsets 460 9.9 PROBLEM SOLVING: Patterns for
Set Union, Intersection, and Difference 461
Object Data   528
WE1 Counting Unique Words 465
Keeping a Total 528
Counting Events 529
xvi Contents

Collecting Values 529 11 RECURSION 611


Managing Properties of an Object 530
Modeling Objects with Distinct States 530 11.1 Triangle Numbers Revisited   612
Describing the Position of an Object 531 CE1 Infinite Recursion 615
CS1 Electronic Voting Machines 533 ST1 Recursion with Objects 616
9.10 Object References   534 11.2 PROBLEM SOLVING: Thinking
Shared References 534 Recursively  616
The None Reference 536 WE1 Finding Files 620
The self Reference 536
11.3 Recursive Helper Functions   621
The Lifetime of Objects 537
11.4 The Efficiency of Recursion   622
9.11 APPLICATION: Writing a Fraction
Class  538 11.5 Permutations  627
CS1 The Limits of Computation 630
Fraction Class Design 538
The Constructor 539 11.6 Backtracking  631
Special Methods 540 WE2 Towers of Hanoi 636
Arithmetic Operations 542
11.7 Mutual Recursion   639
Logical Operations 543
TOOLBOX1 Analyzing Web Pages with
ST3 Object Types and Instances 546 Beautiful Soup 643
WE2 GRAPHICS: A Die Class 547
CS2 Open Source and Free Software 550
12 SORTING AND
SEARCHING 655
10 INHERITANCE 563
12.1 Selection Sort   656
10.1 Inheritance Hierarchies   564
12.2 Profiling the Selection Sort
PT1 Use a Single Class for Variation in Values,
Inheritance for Variation in Behavior 567
Algorithm  658
ST1 The Cosmic Superclass: object 568 12.3 Analyzing the Performance of the
10.2 Implementing Subclasses   569 Selection Sort Algorithm   660
ST1 Oh, Omega, and Theta 662
CE1 Confusing Super- and Subclasses 572
ST2 Insertion Sort 663
10.3 Calling the Superclass Constructor   573
12.4 Merge Sort   664
10.4 Overriding Methods   577
CE2 Forgetting to Use the super Function When
12.5 Analyzing the Merge Sort Algorithm   667
Invoking a Superclass Method 580 ST3 The Quicksort Algorithm 669

10.5 Polymorphism  580 12.6 Searching  671


ST2 Subclasses and Instances 584 Linear Search 671
Binary Search 672
ST3 Dynamic Method Lookup 584
ST4 Abstract Classes 585 12.7 PROBLEM SOLVING: Estimating the Running
CE3 Don’t Use Type Tests 586 Time of an Algorithm   674
HT1 Developing an Inheritance Hierarchy 586 Linear Time 674
WE1 Implementing an Employee Hierarchy for Quadratic Time 675
Payroll Processing 591 The Triangle Pattern 676
Logarithmic Time 677
10.6 APPLICATION: A Geometric Shape Class
PT1 Searching and Sorting 679
Hierarchy  594
ST4 Comparing Objects 679
The Base Class 595
WE1 Enhancing the Insertion Sort Algorithm 680
Basic Shapes 597
Groups of Shapes 600 CS1 The First Programmer 683
Contents xvii

Appendix A PYTHON OPERATOR SUMMARY   A-1 GLOSSARY  A-20


Appendix B PYTHON RESERVED WORD INDEX  A-25
SUMMARY  A-3 CREDITS  A-40
Appendix C THE PYTHON STANDARD
LIBRARY  A-5
Appendix D THE BASIC LATIN AND LATIN-1 SUBSETS
OF UNICODE*
Appendix E BINARY NUMBERS AND BIT OPERATIONS*
Appendix F HTML SUMMARY*

*On the companion site at www.wiley.com/college/horstmann.

ALPHABETICAL LIST OF SYNTAX BOXES


Assignment  29
Calling Functions  38
Constructor  511
for Statement  188
for Statement with range Function  189
Function Definition  249
Handling Exceptions  425
if Statement  94
Lists  317
Method Definition  514
Opening and Closing FIles   385
print Statement  12
Program with Functions   250
Raising an Exception   424
Set and Dictionary Literals   469
String Format Operator   55
Subclass Constructor  573
Subclass Definition  570
The finally Clause  426
while Statement  167
xviii Special Features

Toolboxes How Tos


CHAPTE R Common and and
Errors © Steve Simzer/iStockphoto.

Worked Examples Worked Examples


chalice: Paul Fleet/Getty Images, Inc.; © Tom Horyn/iStockphoto.

.otohpkcotSi/eélessI cirE © tools: mattjeacock/Getty Images, Inc.

1 Misspelling Words 15 Describing an Algorithm


with Pseudocode 19
Writing an Algorithm for
Tiling a Floor 20

2 Using Undefined Variables 34 Symbolic Processing Computing Travel Time  45


Roundoff Errors 41 with SymPy 73 Writing Simple Programs 58
Unbalanced Parentheses 41 Computing the Cost
of Stamps  61
Graphics: Drawing
Graphical Shapes  70

3 Tabs 96 Sending E-mail 113 Implementing an


Exact Comparison of Plotting Simple Graphs 138 if Statement 102
Floating-Point Numbers 101 Extracting the Middle 104
Confusing and and Graphics: Intersecting
or Conditions 124 Circles 134

4 Don’t Think “Are We A Grade Distribution Writing a Loop 192


There Yet?” 170 Histogram 200 Average Exam Grades 198
Infinite Loops 171 Graphics: Bull’s Eye 210
Off-by-One Errors 171

5 Trying to Modify Plotting Growth or Decay 294 Implementing a Function 257


Arguments 254 Generating Random
Passwords 259
Calculating a Course Grade 275
Using a Debugger 278
Graphics: Rolling Dice 285
Thinking Recursively 299
Special Features xix

Programming
Special Topics Random Facts
Tips
© Stephen Coburn/123RF.com.
© Mikhail Mishchenko/123RF Limited. © modella/123RF.com.
Interactive Mode 9 The Python Interpreter 10 Computers Are Everywhere 5
Backup Copies  9

Choose Descriptive Other Ways to Import Modules 42 International Alphabets and


Variable Names  34 Combining Assignment and Unicode  52
Do Not Use Magic Numbers  35 Arithmetic  42 The Pentium Floating-
Use Spaces in Expressions  42 Line Joining  43 Point Bug 63
Don’t Wait to Convert  58 Character Values  51
Escape Sequences  52

Avoid Duplication in Branches  96 Conditional Expressions   97 Denver’s Luggage


Hand-Tracing 108 Lexicographic Ordering Handling System  109
Make a Schedule and Make Time of Strings  101 Artificial Intelligence  134
for Unexpected Problems  120 Chaining Relational
Readability 124 Operators  125
Short-Circuit Evaluation of
Boolean Operators  125
De Morgan’s Law 126
Terminating a Program  133
Interactive Graphical Programs 133

Count Iterations  191 Processing Sentinel Values The First Bug 172
with a Boolean Variable   179 Digital Piracy 223
Redirection of Input and
Output 179
Special Form of the print
Function  188

Function Comments 252 Using Single-Line Compound Personal Computing  257


Do Not Modify Parameter Statements  256
Variables 254
Keep Functions Short 273
Tracing Functions  274
Stubs 275
Avoid Global Variables  285
xx Special Features

Toolboxes How Tos


CHAPTE R Common and and
Errors © Steve Simzer/iStockphoto.

Worked Examples Worked Examples


chalice: Paul Fleet/Getty Images, Inc.; © Tom Horyn/iStockphoto.

.otohpkcotSi/eélessI cirE © tools: mattjeacock/Getty Images, Inc.

6 Out-of-Range Errors  320 Plotting Trigonometric Working with Lists  347


Functions 335 Rolling the Dice  349
Editing Sound Files 344 A World Population
Table 362
Graphics: Drawing Regular
Polygons 365

7 Backslashes in File Names  388 Working with CSV Files 399 Processing Text Files  404
Working with Files and Analyzing Baby Names  407
Directories 410 Graphics: Displaying a
Reading Web Pages 429 Scene File  419
Statistical Analysis 433
Creating a Bubble Chart 438

8 Harvesting JSON Data Counting Unique Words  465


from the Web 489 Translating Text
Messages  476
Graphics: Pie Charts  484

9 Trying to Call a Constructor  512 Implementing a Class  519


Implementing a Bank
Account Class  522
Graphics: A Die Class  547

10 Confusing Super- and Developing an


Subclasses 572 Inheritance Hierarchy 586
Forgetting to Use the super Implementing an
Function When Invoking Employee Hierarchy for
a Superclass Method 580 Payroll Processing 591
Don’t Use Type Tests 586

11 Infinite Recursion  615 Analyzing Web Pages with Finding Files 620
Beautiful Soup 643 Towers of Hanoi 636

12 Enhancing the Insertion


Sort Algorithm 680
Special Features xxi

Programming
Special Topics Random Facts
Tips
© Stephen Coburn/123RF.com.
Use ListsMishchenko/123RF
© Mikhail for SequencesLimited.
of Reverse Subscripts
© modella/123RF.com. 320 Computer Viruses 321
Related Items 321 Slices 328
Call by Value and
Call by Reference 341
Tuples 342
Functions with a Variable
Number of Arguments  342
Tuple Assignment  343
Returning Multiple Values
with Tuples 343
Tables with Variable
Row Lengths 364

Raise Early, Handle Late  428 Reading the Entire File  397 Encryption Algorithms 412
Do Not Use except and finally Regular Expressions  397 The Ariane Rocket Incident 441
in the Same try Statement  428 Character Encodings  398
The with Statement 428

Use Python Sets, Not Lists, for Hashing  467 Standardization 468
Efficient Set Operations 466 Iterating over
Dictionary Items  475
Storing Data Records  475
User Modules  484

Make all Instance Variables Private, Default and Named Electronic Voting Machines 533
Most Methods Public  509 Arguments  512 Open Source and
Define Instance Variables Class Variables  516 Free Software 550
Only in the Constructor  516 Object Types and Instances  546

Use a Single Class for Variation The Cosmic Superclass:


in Values, Inheritance for object 568
Variation in Behavior 567 Subclasses and Instances 584
Dynamic Method Lookup 584
Abstract Classes 585

Recursion with Objects 616 The Limits of


Computation 630

Searching and Sorting 679 Oh, Omega, and Theta 662 The First Programmer 683
Insertion Sort 663
The Quicksort Algorithm 669
Comparing Objects 679
For Clora, maybe—C.H.

To my parents
Willard and Ella—R.N.
CHAPTER 1
INTRODUCTION

CHAPTER GOALS

To learn about computers


© JanPietruszka/iStockphoto.
and programming
To write and run your first Python program
To recognize compile-time and run-time errors
© JanPietruszka/iStockphoto.

To describe an algorithm with pseudocode

CHAPTER CONTENTS

1.1 COMPUTER PROGRAMS 2 1.5 ANALYZING YOUR FIRST


PROGRAM 11
1.2 THE ANATOMY OF A
Syntax 1.1: print Statement 12
COMPUTER 3
Computing & Society 1.1: Computers Are 1.6 ERRORS 13
Everywhere 5 Common Error 1.1: Misspelling Words 15

1.3 THE PYTHON PROGRAMMING 1.7 PROBLEM SOLVING:


LANGUAGE 5 ALGORITHM DESIGN 15
How To 1.1: Describing an Algorithm with
1.4 BECOMING FAMILIAR WITH YOUR
Pseudocode 19
PROGRAMMING ENVIRONMENT 6
Worked Example 1.1: Writing an Algorithm for
Programming Tip 1.1: Interactive Mode 9
Tiling a Floor 20
Programming Tip 1.2: Backup Copies 9
Special Topic 1.1: The Python Interpreter 10

1
Another Random Scribd Document
with Unrelated Content
Janne oli seisahtunut Eeron eteen ja lausui viimeiset sanansa
omituisella äänen painolla, aivan kuin olisi itseltään epäillen kysynyt,
oliko se mahdollista, ja hän lisäsi samaan tapaan:

— Kuinka tuo minuun koski ja kuinka olen tuntenut itseni


viheliäiseksi ja huonoksi. Olen rukoillut Jumalaa, olen paastonut ja
valvonut, ja sen minä vain tiedän, että jollen Leenaa saa, olen
mennyt mies. Silloin en voi tänne jäädä, renttu minusta tulee,
merelle menen tai Amerikkaan tai minne vain… Eikä tässä ole
mikään apuna.

Eero, joka oli säikähtynyt pahemmin kuin tahtoi itsellensä


myöntääkään, oli vähän aikaa ääneti, miettien sinne tänne,
ennenkuin viimein osasi puhua:

— Älä nyt noin, Janne… eihän hukka niin pian peri, totta tämä on
autettavissa. Ethän sinä, Janne, ennen ole juopotellut?

— Ensimäinen kerta se oli, jolloin päihdyin. Mutta tunnustaa minun


täytyy, että joskus olen ryypyn ottanut.

Eero loi ystäväänsä nuhtelevan katseen ja virkkoi:

— Ai ai, Janne, siinä olet tehnyt väärin, kun tiesit kumminkin, ettei
Leena siitä pitänyt.

— Niin niin, väärin olen tehnyt, sen minä nyt ymmärrän. Mutta voi,
ei se sillä parane, en minä sillä häntä takaisin saa, ja minä en jaksa
elää ilman häntä. Hän on niin kaunis, niin kaunis.

— Kuules, Janne!

— Mitä?
Eero oli äkkiä keksinyt pelastuskeinon, ja hänen silmänsä loistivat.

— Minäpä tiedänkin, mitä sinun pitää tekemän!

Hän ryntäsi ylös ja tarttui syliksi ällistynyttä Jannea.

— Oi Eero, jos voisit minua auttaa! kuiskasi toinen melkein


nyyhkyttäen, mutta toivon säde välähti hänenkin silmissään.

— Sano, Janne, oletko varma Leenan rakkaudesta? Tiedätkö aivan


varmaan, että hän sinua lempii?

— Tiedän, vastasi Janne ja katsoi Eeroa ihmetellen silmiin.

— Tiedät siis, että hänen puheensa teidän erostanne ei lähtenyt


sydämestä?

— Sen ainakin uskon, sillä kuinka… en, en, en minä tiedä.

— Mutta onhan hän vannonut sinulle uskollisuutta?

— On.

— No kuule nyt tuumani, sanoi Eero, istuutuen taas


sängynreunalle, ja veti Jannen viereensä istumaan. — Minä tiedän,
että sinun aikomuksesi ovat aivan rehelliset. Leena on köyhä ja
toiseen säätyluokkaan kuuluva kuin sinä, mutta ottaisit sinä hänet
kumminkin vaimoksesi, eikö niin?

— Vielä kysyt! Enhän ole minäkään mikään sivistynyt — ja mitä


rakkauteen tulee! Perintömme ei ole iso ja perijää on monta. En
edes tahtoisi kartanon pitää, vaikka se on kotini, paremmin tulisin
toimeen pienellä tilalla.
— No niin, asia on siis selvä. Etkö nyt itse huomaa, mitä sinun on
tekeminen?

— En.

— Leenan kunniaa on loukattu ja hänen vanhempansa…

— Aah!

— Niin juuri, sinun pitää mennä torppaan ja pyytää tytär


omaksesi.

— Mutta kun en vielä ole mynti! Äitini…

— Luuletko hänen panevan vastaan?

— Luulen.

— Ei auta. Sinä puhut äidillesikin… Ja kyllä hän suostuu, kun koko


historian kerrot… Mutta ennen kaikkea laita asia selväksi Leenan
vanhempain kanssa.

Janne nousi kävelemään. Otsa oli rypyssä ja silmä maahan


painettuna. Aivot työskentelivät ja rinnassa vyöri voimakkaita
tunteita. Eero ei tahtonut häiritä, seurasi vain mykkänä toisen
liikkeitä.

Vähän ajan perästä Janne pysähtyi sängyn luo, nojasihe päätyyn


ja virkkoi päättävästi:

— Niin on tapahtuva kuin sinä ehdotit, Eero. Hän oli nyt aivan
tyyni, ja vähän entistä reippautta loisti silmistä.

— Oikein, sanoi Eero ja hymyili ilosta.


— Mutta tahdotko sinä minua auttaa, Eero?

— Mikäs siinä? Autanhan minä mielelläni.

— Lähde sitten puhemiehenä kanssani torppaan.

— Mitä? puhemiehenä?

— Niin, tiedäthän sinä, mikä se on, ja minä tahdon, että asia


tapahtuu kansan tapaan. Etkö suostu?

Eero oli lentänyt tulipunaiseksi kasvoiltaan, ja tuo ehdotus tuntui


hänestä ensin ylen vastenmieliseltä.

— Etkö suostu? toisti Janne, ja hänen äänensä ilmaisi jo


pettymystä.
— Mistä sitten saan puhemiehen?

Yht'äkkiä Eeroa nauratti. Mikä lie tullut, mutta tällä surullisella


jutulla oli koomillinenkin puolensa. Hän kuitenkin pidätti naurunsa,
melkein suuttuneena omaan kunnioittamattomuuteensa, ja sanoi
lämpimästi:

— Kyllä suostun.

— Hyvä, virkkoi Janne tyytyväisenä ja oikasihe suoraksi. —


Lähdetään sitten menemään.

— Nyt samallako?

— Tottakai, eihän tuo viipymisestä parane. Nyt on muuten paras


aika, kun on pyhäaatto.
— No, kuinka tahdot, sanoi Eero, nielaisten viimeisen
vastahakoisuutensa.

Ja sitten pojat lähtivät. Roland, jonka olisi tehnyt mieli mennä


mukaan, käskettiin jäämään kotiin, ja hyvin kasvatettu koira totteli
nöyrästi.

Matkalla torppaan Eero kysyi Jannelta, eikö hänellä ollut


aavistusta, kuka se oli Leenan vanhemmille kannellut ja juonitellut,
sillä eihän kukaan ilman mitään —

— Ei suinkaan, keskeytti Janne, — enhän minä varmasti tiedä,


kuka vihamieheni on, ellei se lie Aapolan Kalle. Juovuspäissäni
jouduin riitaan hänen kanssaan, kun hän kehui Leenaa
morsiamekseen. Kalle muuten kuulemma on Leenaa kosinutkin ja
saanut rukkaset. En minä muista mitään puhuneeni omista
asioistani, mutta ehkä se Kalle arvasi oikean laidan, ehkä on
jäljestäpäin meitä vakoillut. Hän jos sitten lie jollain ämmällä juorua
juoksutellut…

— Kylläkai se niin on, kylläkai, arveli Eero ja ihmetteli itsekseen,


että rakkausjutussa aina piti olla mustasukkaisuus mukana.

Ilta oli jo myöhäinen, kun Eero palasi kotiin kosioretkeltään Jannen


kanssa. Kaikki oli käynyt hyvin. Miten olikaan, Eero innostui
puhemiesvirkaansa, kertoi Leenan ja Jannen rakkausjutun alusta
alkaen ja sai kunnon vanhukset heltymään, niin että vielä itkivätkin;
ukko puristi vahvasti kädestä ja eukko tarttui oikein syliksi nuorta
isäntäänsä, jota ennenkin olivat kunnioittaneet. Janne oli
seitsemännessä taivaassa sulasta onnesta ja virkkoi auttajalleen
heidän poistuttuaan torpasta:
— Voi jos osaisin puhua niinkuin sinä! Saathan kivetkin
heltymään…
Jos sinäkin äidilleni puhuisit…

Mutta se tietysti ei käynyt laatuun.

Kylään tullessa Janne erosi Eerosta ja lähti Leenaa tapaamaan.

Koko tämä kohtaus oli vaikuttanut Eeroon virkistävästi. Ajatukset


olivat hetkeksi vapautuneet omista huolistaan ja murheistaan, sydän
iloitsi, että oli saanut olla avuksi, ja monta uutta havaintoa oli mieli
tehnyt. Istuessaan kevät-illan haaveellisessa hämärässä matalan
torpan pyhää varten erittäin siivotussa kamarissa ja keskustellessaan
noitten kokeneitten ja kunniallisten ihmisten kanssa rupesi Eerosta
tuntumaan, aivan kuin hän jostakin oven raosta olisi saanut
kurkistaa outoon, uuteen, ihanaan maailmaan. Avautui näköaloja,
joista hänellä ei ennen ollut aavistustakaan, monet arvotukset
kävivät äkkiä päivän selviksi, mutta haihtuivat taas, ja Jannesta
erottuaan hän koetti muistella vanhusten sanoja ja omia
mielialojaan, saadakseen selvyyttä ajatuksiinsa ja havaintonsa
jonkinmoiseen järjestykseen.

Tultuaan kotiin hän istui pöytänsä ääreen ja kirjotti päiväkirjaansa:

"23. V. Oudon kokemuksen olen tänä iltana tehnyt. Uskallanko siitä


vetää johtopäätöksiä? Silloin torpan ukko on ollut minulla
ensimäisenä opettajanani sitten kuin koulun päätin. Mutta mikä
opettaja! Sydämensä suoraa kieltä vain puhui ilman minkäänmoisia
'pedagogisia' tarkotuksia. Ja mikä opetus! Ei se sanojen paljoudessa
ilmennyt, vaan niiden ytimekkäisyydessä; eikä niiden
kirjavankoreassa muodossa, vaan henkevässä sisällyksessä. Eikä
ainoastaan sanoissa, vaan katseessa, liikkeissä, äänenpainossa! Ne
ovat rikkaita ihmisiä ne, joilla on semmoinen sielunelämä.

"Ja nyt on johtopäätökseni kysymyksenä esitettynä: onko koko


kansa, koko n.k. sivistymätön luokka tämmöistä? Näinkö
viisashenkistä, ylevämielistä, teräväjärkistä?

"Luulin ennen, että meidän sivistyneiden pitäisi heitä opettaa,


kasvattaa, neuvoa. Mutta heillähän onkin ihan toinen
maailmankatsomus kuin meillä sivistyneillä! Tai oikeammin: ei
toisenlainen, mutta se heillä on jo tiettynä, toteutettuna, koettuna,
mikä sivistyneille jonkinmoisena ihanteena väikkyy. Ja minun
yksityiselle maailmankatsomukselleni se on mitä likintä sukua!

"Eiväthän he vähääkään epäile elämän siveellistä pohjasäveltä,


ihmisen korkeata tehtävää ja hänen velvollisuuttaan luopua
itsekkäistä pyyteistään ja alhaisista himoistaan! Niin, mitä heidän
oma elämänsä onkaan muuta kuin yksinkertaista velvollisuuksien
täyttämistä aamusta iltaan hamaan kuolemaan saakka. Ja mikä
vaatimattomuus, mikä alistuminen Jumalan tahdon alle, mikä rauha
ja tyytyväisyys.

"Sivistyneitä he pitävät melkein kuin toisena sukuna. Ennestään


tiedän, että kansa on kunnioittavainen ja nöyrä ylempää luokkaa
kohtaan — jos välistä sen omituisuuksille nauraakin — mutten ole
ennen hoksannut, että syvällä kansan mielessä piilee jonkinlainen
epäilys herroja kohtaan, jonkinlainen arkuus — semmoinen tunne,
joka herää, kun pitää astua kevätjäälle eikä tiedä, kestääkö tuo
enää. On aivan kuin me sivistyneet olisimme lapsia, jotka olemme
eksyneet äitimme, kansan helmasta ja joita äiti pelonalaisena, mutta
kaipauksella odottaa palaavan takaisin — — —
"Niin, jos johtopäätökseni tämän illan kokemuksista pitää
paikkansa."

Eero laski kynän kädestään ja nousi. Hän käveli toiseen


huoneeseen, Aarnon ja Tuomon saliin, ja ohjasi askelensa ikkunan
luo, jonne häntä vastustamattomasti veti mustain tuomen oksain
välitse kuultava, heleänhohtava luoteinen taivaanranta. Tuolla ulkona
uinaili luonto kevätkesäistä untaan. Kukkiva tuomi aivan lasin takana
ja kuusen istukkaat alempana törmän laidalla seisoivat liikkumatta ja
äänettöminä ja katselivat puolihorroksissa jalkojensa juurella hiljaa
juoksevaa jokea, joka väsymättömässä kulussaan luikerteli niittyjen
välitse ja katosi näkyvistä metsäisen niemen taa.

Rauhan tunne tuuditti nyt Eeronkin mielen kevätyöllisiin


haaveiluihin. Ne tulivat etsimättä kuin haimion siivillä, kun hän avasi
akkunan ja imi itseensä leyhkäilevää tuomentuoksua. Ne kertoivat
jostain kaukaisesta onnesta, jostain salaperäisestä rauhasta, joka
kerran tulee ja nostaa sielun korkealle yli maailman murheiden, yli
elämän eksymysten, ja ne kuiskailivat jostain äärettömästä
rakkaudesta ja voimasta, joka elää syvällä tämän jumalallisen
luonnon sydämessä ja jonka helmaan ihminenkin voi kallistaa
päätänsä. Mitä siitä, ne sanoivat Eerolle aivan korvin kuuluvasti, mitä
siitä, jos ystäväsi sinusta luopuvat, jos ei yksikään ymmärrä sinun
aikeitasi, sinun tarkotuksiasi, olet elävä ihminen kumminkin,
maailmaan lähetetty kuin kaikki muut — heitä sinä huolesi ja ole
kuin yksi näistä pienimmistä, ilomielinen, nöyrä, vaatimaton, ja
katso, kansa on sinut ymmärtävä, kansa on tuleva ystäväksesi, ja se
suuri, sanomaton voima on rintasi täyttävä.

Ja Eero ihmetteli näitä unelmia ja katseli kauvan yhä vaalenevaa


taivaanrantaa.
V.

Kynttilä paloi kirjotuspöydällä. Eero istui lukemassa, odotellen


Aarnoa ja Tuomoa, jotka kumma kyllä eivät vielä olleet saapuneet
kotiin kaupunginmatkalta, vaikka heidän jo senkin seitsemän kertaa
olisi pitänyt ehtiä hurrata Harryn valkolakille…

Eeron mieleen oli muistunut eräs toukokuun yö kolme vuotta


sitten, kun hän oli ensi kerran painanut päähänsä valkoisen lakin.
Heitä ei ollut samaan ryhmään kuulunut kuin kolme vanhaa
luokkatoveria, jonka tähden asianomaisesta viftistä ei ollut tullut
mitään. Hyvin tyytyväisenä siihen Eero oli kiirehtinyt kotia ja pannut
tunteensa paperille.

Kuinka kaikki oli toisenlaista nyt kuin silloin. Ihan pelotti ajatella,
mitä muutoksia aika oli tuonut mukanaan. Silloin oli mieli vielä
täynnä uskallusta ja uskoa, uskoa ei niin paljon itseensä kuin muihin,
kuin siihen, että maailma on hyvä, että ihmiset ovat jaloja, että
elämä on ihana. Silloin ei ollut ystäviä muita kuin Aarno, mutta
kuinka rakas, kuinka luotettava, kuinka ihailtava se ystävä oli! Ja
Eero oli käynyt miettimään suhdettansa tuohon nuoruutensa
uskottuun, tuohon sielunsa lemmittyyn, ja kun hän ajatteli, että se
sama suhde nyt oli rikkoutunut, että liitot ja lupaukset eivät
sittenkään voineet kestää elämän kourissa, niin kaipauksen kyynel
vieri hänen poskelleen, mutta katkeruus ei astunut hänen
sydämeensä tänä hiljaisena, runollisena yönä. Pysyttääkseen vienon
tunnelmansa ja elvyttääkseen vanhoja muistojaan, oli Eero
papereittensa joukosta hakenut pienen vihkosen, jonka kansilehdelle
oli sirosti piirrettynä eri riville nimet "Aarnolle Eero", — saman
vihkosen, johon hän sinä yönä kolme vuotta takaperin oli sydämensä
vuodattanut. Sitä hän nyt kynttilän valossa istui lukemaan, ja sen
sisältö oli näin kuuluva:

'Kirje Eerolta hänen ystävälleen Aarnolle.

Paras, ainoa ystäväni, riemuitse, riemuitse kanssani,


kuohuilevan sydämeni kanssa! Tuhannet aatokset ajelehtivat
aivoissani, kiitävät ohi kirjavina kuvina, häipyvät ilmaan
hohtavina haahmoina ja jättävät minut taas yksin tähän
valoisaan, kuultavaan kevätyöhön sen autuaine, mahtavine
tunteineen: olen lyyryn voittanut. Aarno, ymmärrätkö, mitä se
merkitsee?

On lumpeenkukka syntynyt järvenpohjan mutaliejussa.


Hiljalleen se nousee pintaan halki haalevan, kuulakkaan
veden, kaiholla tähystellen ylhäällä häämöttävää valoa ja
vapautta, mutta koittaapa vihdoin päivä, jolloin kesäinen
tuulenhive pyyhkäisee sen kukkaispäätä, armaan auringon
miltei häikäistessä sen silmiä. Ja hento ruumis värähtää
lemmestä ja aavemaisesta auvosta, unholaan uupuvat lyhyen
elämän surut ja murheet, ja hurmottuna kukka vaieten
aukaisee lumivalkoiset terälehtensä laineiden luikutettaviksi.

En löydä minäkään sanoja ilmaistakseni tämänhetkisiä


tunteitani: olen vapaa! vapaa taistelemaan kaiken hyvän,
suuren ja kauniin puolesta, vapaa elämään kansani ja uskoni
puolesta, vapaa valon taistelussa voittamaan tai kuolemaan!…

Ei, minun täytyy tyyntyä, hillitä huimaavaa iloani, ajatella ja


mietiskellä. Tahdon kanssasi puhua, Aarno. Tänä hetkenä
rakastan sinua enemmän kuin koskaan ennen, ja jos täällä
olisit, halailisin sinua, pyörittäisin tanssiin kanssani ja
nauraisin ääneen. Ja sitten kertoisin sinulle kahdesta pojasta,
jotka tulivat ystäviksi.

Muistatko?

Se oli viime kesänä. Kauniina ehtoopäivänä olin talon


renkien seurassa peltoa kuokkimassa. Työ oli mieluista, mutta
raskasta, ja suuret hikipisarat valuivat kasvoiltani mustaan
maahan. Usein minun täytyi hoivata, toverit seurasivat
esimerkkiäni, laskettiin leikkiä, puheltiin ja naurettiin.
Semmoisena lepohetkenä meidän seisoskellessamme kuokan
varteen nojaten satuit sinä tulemaan peltoa kiertävällä
maantiellä, ja minä näin sinut ensi kerran. Reipas oli ryhtisi
astellessasi, viheltäen sinä tulit, kädet lakkarissa, pitkävartiset
saappaat jaloissa. Suu hymyssä meitä sivuutit, ja kun
kohtasin veitikkamaisen katseesi, tuntui minusta äkkiä kuin
olisimme ennen toisiamme tavanneet. Muistatko, että minä
vähän epävarmana tervehdin — kuten muuten maalla on
tapana — ja että sinä tervehdykseeni vastasit? Mutta kun olit
kadonnut tien mutkaan, havauduin kysymään viereiseltä
rengiltä:

— Kuka tuo olikaan?

— Niemelän Aarnohan se oli, vastasi renkipoika.


— Missä hän asuu?

— Niemelässähän tuo asuu tuolla järven rannalla.

— No, mitä hän toimittaa?

— Jaa Aarnoko?

— Aarno, niin.

— Mitä toimittanee. Talvella käypi koulua kaupungissa,


tiedämmä.
Kesällä laiskottelee.

Naurahdin tuolle selonteolle. Älä sinäkään pahastu, että


semmoinen kuva sinusta annettiin. Olisi tehnyt mieli minun
kysyä enemmänkin, mutta kumppanini kuivat vastaukset ja
jonkinmoinen ujous pidättivät jatkamasta. Tiesinhän muuten
tarpeeksikin.

Ryhdyimme jälleen työhön.

Kolme viikkoa sitten kului, ennenkuin meidät esitettiin


toisillemme. Minä olin jo ehtinyt sinut unohtaa. Sinulla oli nyt
toiset vaatteet yllä — niinkuin minullakin — eikä meidän
kummankaan käytös kehottanut tuttavallisuuteen. "Herra
Niemelä" soi aivan luonnolliselta.

Tämän jälkeen tavattiin silloin tällöin. Muistan leikillä


kysyneeni:

— Ettekö te kerran alkukesällä kulkenut ohitseni maantiellä, kun


minä olin pellolla kuokkimassa?
Sinä sävähdit tulipunaiseksi ja heitit minuun aran katseen,
aivan kuin olisit epäillyt minun aikovan tuomita sinua jostain
julmasta tyhmyydestä. Vastasit lyhyesti:

— Kuljin.

— No, sittenhän oikeastaan olemme vanhat tuttavat,


peruutin minä hymyillen ja lisäsin, kättä tarjoten: — nimeni
on Eero.

Ja sinä pääsit pälkähästä, vieläpä lämpimästi puristit kättäni.

Oikein tuttaviksi emme kumminkaan tulleet, ennenkuin


jouduimme molemmat yhteen hommaan. Kylään oli
toimeenpantava seuranäytelmä, ja kumpikin saimme
osamme. Harjoteltaessa minä, joka pienestä saakka olen
käynyt teatterissa, pian anastin itselleni johtavan aseman,
neuvoilin, määräilin, näyttelin, miten kukin rooli oli tehtävä.
Näyttelijöinä oli sekä herras- että maalaisväkeä, mutta
huomasin pian, että sinä olit muita tarkkaavampi,
ymmärtäväisempi ja innostuneempi. Ja se oli sinulle hyvä
suositus minun silmissäni, vaikken suinkaan tullut ajatelleeksi,
että olin sinuun erityisesti kiintymäisilläni.

Kun sitten juhlapäivä oli tullut ja näytelmämme oli


onnellisesti suoritettu, saimme osaksemme runsaat kätten
taputukset, hyvä-huudot ja kiitokset. Jouduin tästä vähän
huumeeseen, sillä itsekkyyteni kuiski: sinulle tulee suurin osa
ylistyksestä. Rintani tuntui keveältä ja ikäänkuin paisuneelta,
mutta mieleni oli rauhaton ja minä halusin yksinäisyyteen
haaveilemaan. Tuvassa tanssittiin teatterin jälkeen, mutta
pian minä sieltä pujottausin ulos puutarhaan, jonne houkutteli
hohtava kuuvalokin.

Harhaillessani ruohikoilla ja hiekkakäytävillä tunsin äkkiä


jonkun takaa tarttuvan käsivarteeni ja kuulin sinun äänesi
kuiskaavan:

— Etsin sinua. Arvasin sinun olevan täällä ulkona. Tuvassa


oli liiaksikin lämmin.

— Etsitkö minua? toistin melkein säpsähtäen, ja tiedätkö mitä?


Vaikka olin ajatellut kaikkea muuta kuin sinua, kävi samassa ilon
väre läpi ruumiini.

— Niin, minä tahdoin vielä yksityisesti kiittää sinua, Eero,


siitä, että teatterimme onnistui niin hyvin. Se on kokonaan
sinun ansiosi. Minä olin ollut niin levoton itseni tähden.

Ah, kuinka tuo kiitoksesi teki minulle hyvää. Se haihdutti


levottomuuden rinnastani — haihdutti itsekkyydenkin.

Ja nyt seurasi lumoava hetki. Muistatko, Aarno, tuota yötä?


Istuimme syrjäisessä lehtimajassa puutarhan toisessa päässä,
kuuhut heitti hopeansa lehvistön läpi, etäältä soivat valsin
sävelet hyväilevän suloisina. Puhelimme ensin illan
tapahtumista, molemmat olimme innostuneet
näytelmätaiteeseen ja haaveksimme näyttelijä-elämästä,
mutta yhtäkkiä käännyin suruiseksi ja rupesin kertomaan
itsestäni. En tiennyt oikein, mitä tein. Kerroin olevani ilman
ystäviä, ei ollut koulussa toverieni joukosta kukaan minusta
pitänyt, semmoisesta yksinkulkijasta ja haaveksijasta kuin
minä olin. Sentähden välistä orpo kaipasinkin ystävää, jolle
olisin voinut tunteeni ja tuumani uskoa.

En unohda koskaan sinun osanottavaa ja lohduttavaa


katsantoasi, kun laskit kätesi hiljaa hartialleni ja hellästi
lausuit:

— Ne toverisi eivät sinua tunne, Eero. Minä pidän sinusta.

Kuinka tuo tunnustus teki minut onnelliseksi, Aarno. En


keksinyt vastausta mitään, vaan ojensin sinulle käteni. Ja
kauvan, kauvan istuimme ääneti ja kuuntelimme kaukaista
soittoa. Sitten me kuin yhteisestä päätöksestä nousimme ja
palasimme tupaan.

Mutta kumma, seuraavina päivinä ujostelimme toisiamme


emmekä etsineet tilaisuutta puhua kahden kesken. Vasta
viikon perästä sattui itsessään vähäpätöinen tapaus, joka oli
omansa ratkaisemaan suhteemme.

Olimme lähteneet toisen kylän huveihin, tällä kertaa


vieraina. Näytännön ja muun ohjelman loputtua oli
tavanmukaiset tanssit, joihin sinä hyvänä hyppääjänä innolla
otit osaa, minun parhaasta päästä katsellessani, millä
taitavuudella ja kestävyydellä sinä pyöräytit tyttölöitä, tuttuja
ja tuntemattomia. En kuitenkaan yksinomaan ihmetellyt,
ihaillut; tunteihini sekottui vähän katkeruuttakin, kun sinä niin
hartaasti hääräilit muitten kanssa etkä näyttänyt minusta
yhtään välittävän. Olin mielestäni syrjäytetty, hylätty ja
kaipasin pois tästä meluavasta joukkiosta. Hain itselleni
tyyssijan avatun akkunan laudalla, josta sain ikäänkuin etäältä
seurata silmilläni karkelevan kansan keikkauksia ja nähdä
sinunkin ponnistuksesta punottavia poskiasi, kun sinä kiidit
ohitseni, käsi vankasti kiedottuna tytön vyötävyksille. Mutta
silmänräpäyksessä kaikki muuttui, kun kallistuin taaksepäin
ulos ikkunasta, toisella kädellä pitäen kiinni keskipylväästä.
Siinä ympäröi minua synkkä syysyö, jonne jyske ja melu
kuului paljon heikommin. Mutta se oli rauhaisa ja viileä ja
kuunteli myötätunnolla sydämeni valitusta. Oli minulle
jonkunlainen nautinto ajatella, että "tuolla nuo ihmiset pitävät
lystiä eivätkä aavista, että heidän keskellään on yksi, jonka
mielestä se kaikki on tyhjää leikkiä".

Aurinko teki jo nousua, kun lähdimme kotia ajamaan. Meitä


oli viisi henkeä samoilla rattailla. Takalaudalla istui kaksi
tyttöä, edessä istuimme sinä, minä ja eräs meidän kylän
poika. Aamu-ilma oli kolea ja kostea ja kylmä meitä puistatti,
kun olimme ilman päällysvaatteita. Koetimme sentähden
pysytellä lämpiminä laulamalla ja hoilottamalla. Lienemme
näyttäneet aika markkinajoukolta, kun ajaa hyryttelimme
kivistä tietä, täyttä kurkkua huutaen ja laulaen, haastellen ja
nauraa hohottaen. Muistatko, kuinka ylimielisen hilpeitä
olimme? Siitä huolimatta piili sydämessäni yhä sama
epämääräinen kaiho.

Yhtäkkiä pälkähti päähäni kysyä sinulta:

— Paleletko, Aarno?

— Vähäisen, vastasit, ja samassa kiedoin käteni vyötäisillesi


ja sanoin luottavasti:

— Näin saat nähdä, että lämpenet.


Silloin, tiedätkö, tapahtui minulle kumma. Kaikki epäselvä ja
etsivä ikävä häipyi sielustani, ja minä ymmärsin, että sinä
olitkin kaihoni esineenä. "Sitähän minä tahdoinkin, että olisin
varma sinun ystävyydestäsi, että saisin olla kahden kesken
sinun kanssasi, purkaa sinulle sydämeni, kertoella sinulle
ihanteistani ja aatteistani, ja että sinä kuuntelisit sanojani
mielihyvällä, katsoisit minuun totisilla, hellillä silmilläsi ja
laskisit kätesi hartialleni!" Niin, minä ymmärsin, että rakastin
sinua, ja olin sanomattoman onnellinen.

Ummistin silmäni, unohdin laulaa, unohdin, missä olin, kun


toinen tytöistä nykäsi minua selkään ja huusi:

— Eihän se Eero enää laulakkaan!

Samassa käännyit sinäkin minun puoleeni ja kysyit puoleksi


kummeksuen:

— Todellako nukuit?

— Nukuin? toistin närkästyneenä, mutta lisäsin kiireesti: —


no, jos olisinkin, kun te niin makeasti kehtolaulua
hyrähytitte…

Muiden nauraessa vetäsin käteni pois vyötäisiltäsi.


Kysymyksesi oli minua loukannut, en tiedä miksi. Tuntui vain
yhtäkkiä, ettet sinä minua ymmärtänytkään. Minäkö olisin
nukkunut! Vähänpä arvoa olisin sitten läsnäolollesi pannutkin.
Mutta tovin kuluttua hiipi sydämeeni taas entinen ikävä, ja nyt
siihen oli yhtynyt katumuskin: kaduin, että olin ajatuksissani
ollut niin äkkipikainen sinulle. Ehkä se kysymyksesi olikin
aivan viaton — ei, aivan ajattelematon. Ehkä sinä puolestasi
nyt olit loukkaantunut minuun, kun niin äkkiä vedin käteni
pois… Näitä ajatellessani olin koettanut ottaa osaa muitten
iloon. Nyt käännyin sinuun, ja kas, katsantosi olikin
muuttunut. Näytit hajamieliseltä, olit jättänyt ohjakset
Väinölle. Kuinka ihmissydän on julma ja itsekäs: tätä
nähdessäni minä riemastuin ja sydämeni sykki. Taas oli ikävä
poissa ja hetken sinua katseltuani kuiskasin:

— Minun on kylmä.

Sinä säpsähdit, katseemme kohtasivat toisiaan — ja silmäsi


säihkyivät. Sanaa sanomatta kiedoit käsivartesi minun ympärini.

Sillä hetkellä tapahtui meidän äänetön liittomme. Muistatko?


Aamuaurinko loisti kirkkaana, suurena, ihanana…

Meidän ystävyytemme oli alkanut. Kylään saavuttuamme


kun minä hyppäsin rattailta poiketakseni kotiin, kysyin sinulta,
aivan kuin se olisi ollut jokapäiväisin asia maailmassa:

— Lähdetäänkö päivemmällä kävelemään?

— Lähdetään. Mihin aikaan? sinä vastasit yhtä huolettomasti.

— Tule nukuttuasi minua noutamaan.

— Hyvä.

Ja me läksimme pitkälle kävelylle, ja se oli meidän


ensimäinen… Ja kuinka meiltä puhetta riitti — ihan
äärettömiin! En muista enää, mistä oli kysymys, sen vain
muistan, että olin kuin hehkuva tulimeri, joka kauvan on ollut
maan poveen suljettuna, mutta vihdoin murtaa kahleensa ja
syöksee vapauteen, puoleksi hengetönnä pitkästä
odotuksesta. En ollut koskaan ennen puhunut sydämeni
kyllyydestä, en ollut antanut kenenkään aavistaa, mitä
tunteita minussa liikkui — nyt ne nousivat yli äyräittensä, nyt
sanat tulvivat suustani, ja kerroin kaikki salaisuuteni sinulle —
sinulle, Aarno. Sinä olit ensimäinen, sinä olit ainoa.

Sadekuuro meidät yllätti. Poikkesimme tieltä ikivanhan,


pilvenkorkuisen "herraskuusen" suojaan. Siellä seistessämme
ja katsellessamme toisiamme hymyilevin silmin, sanatulva
äkkiä loppui kesken, puheemme taukosi. Aivan kuin
hämmästyimme, ja molempain silmistä loisti sama kysymys:

— Sinäkö se nyt olet minun ystäväni, minun uskottuni!

Ja sitten silmämme lisäsivät:

— Kaunishan sinä oletkin!

Ja huulemme vetäysivät hymyyn, ja sulan riemun hurmaamina


heittäysimme toistemme kaulaan ja suutelimme…

Ja se se nyt oli kertomukseni kahdesta pojasta, jotka tulivat


ystäviksi.

Koko tämä mennyt vuosi, Aarno, on ollut kuin autereinen


kesäpäivä, kuin onnen kultainen tarina, josta lapsina
unelmoimme. Kuinka elämä sentään on ihana ja maailma
mielityinen! Kuinka ihmiset lienevät hyviä ja jaloja! Mutta jos
tässä elämässä on suruja ja murheita, niin minä vain sanon:
tulkaa, en teitä pelkää. Molempain meidän puolesta minä
rukoilen: jospa voisimme tulla tämän elämän ja tämän
ihmiskunnan, tämän maan ja tämän kansan arvoisiksi, jospa
voisimme imeä tästä elämästä kaikki mikä on voimallisen
suurta ja tenhoavan kaunista, että, kun päivämme kerran
päättyvät, tätä maata palvellen, tämän kansan onnen eteen
työskennellen kuoloon kaatuisimme.

Huomenna kun tapaamme, saat sinä tämän kirjeeni. Se on


sinulle kirjotettu, se on sinulle omistettukin

ystävältäsi Eerolta.'

Tätä vanhaa muistiinpanoa lukiessaan Eero hymyili, mutta hänen


silmänsä olivat kyyneltyneet. "Olenhan ollut onnellinen minäkin", hän
ajatteli, "olen, olen. Ei aavista Aarnokaan, mitä tähän olen
kirjottanut, en tullut sitä hänelle näyttäneeksi. Enkä näytäkkään.
'Tempi passati' nuo ovat. Mutta minä olen sama vielä, samaksi jään.
Yhtä lämpimästi rakastan sinua, Aarno, kuin ennenkin, yhtä
lämpimästi teitä kaikkia." Ja niinkuin punertava, lemmenvärinen
ruusu huokuu aistimiin tenhoavaa tuoksua, niin tuoksahti nyt
mieleen suloinen rauha hellivästä sydämestä.

Eero sammutti kynttilän ja otti viulunsa kirjahyllyn päältä. Jousi


kädessä hän hiljaa näpitteli ja viritti kieliä ja asetettuaan
äänenhimmentäjän paikoilleen, rupesi soittamaan. Sävel sävelen
perästä virtasi viulusta huoneen hämärään hiljaisuuteen,
muodostuen tunnelmikkaaksi ja viehkeäksi soitoksi. Tämä Bach'in
Gavotte ja Musette oli Eeron lempikappaleita, ja hän keijuttikin
koneestaan aivan kuin perhosen siivillä tuon keposen Musette'n.

Hän soitti vielä muita saman mestarin sävellyksiä, ja kuta


kauvemmas hän soitti, sitä enemmän kiihtyi ja innostui hänen
mielensä. Voimakkaina ja raikkaina kaikuivat äänet viulun kielistä,
kun viippaileva käsi niitä jousella kosketteli. Pelkoa ei ollut liioin, että
talonväki häiriytyisi, koska se makasi tuvan puolella rakennuksen
toisessa päässä.

Silloin kuului äkkiä porstuan puolelta jyskettä ja narinaa, kun ovea


auki temmottiin, ja heti sen perästä ääniä ja askeleita. "Joko nyt
vihdoin kotiutuvat!" ajatteli Eero ja keskeytti oitis soittamisensa.
Laskettuaan rakkaan viulunsa hellävaroen sen koteloon, hän katsahti
kelloonsa ja jäi ihmettelemään, kun se jo näkyi kahta käyvän. "Missä
ovat Aarno ja Tuomo olleet?" iski ajatus kuin salama hänen
mieleensä.

Samassa tulijat aukasivat salinsa oven ja Eero kuuli Tuomon


puoliääneen kuiskaavan toverilleen:

— Hs, ettei Eero herää…

Joku astui saliin ja toinen kömpi perässä.

— Viis siitä! sopersi Aarnon ääni. — Eero är vår vän, etkö


ymmärrä, han är vår vän, amicus noster est… Kuulehan, Tuomo,
minä kuulin viulunsoittoa.

— Mitä vielä! kuului taas Tuomo sanovan, — onhan Eeron


kamarissa pimeä.

— Jo, men jag hörde…

— Ole vaiti… Missä täällä on tulitikut?

Eero oli vetäytynyt syrjään, ettei näkynyt eikä nähnyt. Kaamea


tunne kouristi hänen sydäntään, hän pidätti henkeään ja kylmä hiki
tuntui pursuvan otsasta.
Raapattiin tulta ja valo välähti huoneeseen.

— No, eihän täällä minun pöydälläni olekkaan kynttilää…

— Minulla pitäisi olla… Habeo, habeo… mitä kynttilä taas on


latinaksi?

— Kuule, mitä sinä oikein olet juonut, Aarno?… Minä en ole yhtään
hutikassa…

— Luuletko sitten minun olevan?… En yhtään, en yhtään,


veikkoseni. Tämä poika on vain vähän iloisella tuulella… bei guter
Laune, etkö muista?… Kyllä se Harryn luokkatoveri Irma sentään on
hiton soma tyttö, vai mitä sinä sanot, Tuomo?

— Onhan se!

— Niin, onhan se. Est, est… kuinka se Caesarin lause taas kuuluu?

— Mikä?

— No se Caesarin lause… Men låt vara! Kun ei muistu, niin ei


muistu… Ihan minä olen korvia myöten pikiintynyt siihen Irmaan,
ganz verliebt…

— Kuule, Aarno, ei tämä käy päinsä. Millä hetkellä hyvänsä Eero


voi herätä, ja silloin on piru merrassa. Ole hiljaa nyt ja riisu päältäsi
— jos osaat.

— Ettenkö osaisi! Ole huoleti… Mutta johan sanoin, että Eero on


ystävämme, amicissimus est. Ei hän pahastua saa…

— Kun saisin tuon oven kiinni lykätyksi…


Eeron asema oli käynyt yhä tukalammaksi. Hän olisi tahtonut
pujahtaa vuoteeseen toisten tietämättä ja olla nukkuvinaan, mutta
sänky oli toisella puolella huonetta. Kun Tuomo lähestyi ovea sitä
sulkeakseen, teki Eero äkillisen päätöksen ja astui rohkeasti
kynnykselle. Sinne hän jäi seisomaan kalman kalpeana ja hänen
silmäinsä katse oli kuin vainotun hirven.

Tuomo, joka oli takitta ja sukkasilla, pysähtyi kuin naulattu


keskelle lattiaa, ja hämmästys, kauhistus kuvastui hänen
kasvoissaan. Aarno istui taaempana sänkynsä reunalla ja yritti
paraikaa vetämään kenkiä jaloistaan, mutta kun huomasi Eeron, jäi
häneen tuijottamaan suurilla silmillään, joissa oli juopuneen puoleksi
tajuton ilme.

Kotvan aikaa nuo kolme ystävää katselivat toisiaan, ja ainakin


Eeron ja Tuomon rinnoissa tunteet riehuivat. Mutta sitten Eero laski
katseensa maahan ja tarttui sanaakaan sanomatta oven kahvaan,
astui takaisin kamariinsa ja pani oven säppiin jälkeensä. Tämän
tehtyään hän hoiperteli sängyn luo ja heittäysi pitkäkseen
vuoteellensa.

Silmiään hän ei saattanut ummistaa. Hän yhä näki edessään


kauhistuneen Tuomon ja puoleksi tajuttoman Aarnon, ja hänen
sydämensä kouristui tuskasta. "Tämäkö vielä piti tapahtuman!
Tämänkö tähden he siis ovat minut hylänneet, tämänkö tähden
väsyneet meidän uutteraan elämäämme!"

Ja nyt tulvi sanomaton katkeruus mieleen. "Oi, tätä yhteiskuntaa,


tätä sivistystä ja kulttuuria — mille teille se ihmislapsia viekottelee.
Tämä nyt on se ylistetty yliopistolukujen harjottaminen, 'oman
itsensä voittaminen', ahkeraksi, järkeväksi rupeaminen ja epävarman
hutiloimisen heittäminen. Luopuneet he ovat minusta ja minun
leivättömistä ihanteistani, alistuneet ylivoiman alle, muuttaneet
mielensä maailman mukaan; kunnioitettaviksi kansalaisiksi ovat
tulleet, — cives academici —, kansalaisiksi, jotka täyttävät
velvollisuutensa ja samalla ymmärtävät, että se on epäämätön oman
menestyksen ehto, paras keino itse kunniaan kohota. Lapsellisen
haaveilemisen ovat hylänneet, ovat omistaneet miehuullisen
vakavuuden, ja maailma on heti valmis heitä ilolla tervehtimään…
Niin, niin, iloitse, maailma, tämähän on sinun mielesi mukaista…"

Äkkiä valtasi Eeron kummallinen liikutus. Hän olisi tahtonut itkeä,


mutta ei voinut. Sydäntä vain ahdisti.

"Minä, joka olin toivonut heistä aivan toista! Olin toivonut, että he
kaikissa tapauksissa säilyttäisivät pyhänä uskonsa puhtauteen,
siveyteen, miehuuteen. Olin toivonut, etteivät he luopuisi hyvästä,
jos kohta luopuivat minusta ja minun pyrinnöistäni…

"Paljon parempi olisi ollut, jos heistä olisi tullut suutareita,


salvumiehiä, torppareita tai renkiä…

"Ruumiillinen työ olisi ollut kunniallinen, rehellinen, puhdas, se olisi


varjellut heitä pahasta! Sen turviin paeta olisi ollut tuhat vertaa
lujempi kuin yliopistojen ja akademiojen…

"Mutta he sitä halveksivat… He valitsivat 'herrojen' tien…"

Ja hänen sydämeensä hiipi sääli langenneita ystäviään kohtaan.

Eero kyllä kuuli, että Aarno pyrki sisään, että hän koputti ovelle ja
sammalti jotakin Tuomolle, että hänen kiihkonsa yltyi jostain tämän
vastauksesta ja että hän oli vähällä ruveta meluamaan, mutta kun
sitten äkkiä kaikki hiljeni, ja Tuomo arvattavasti sai Aarnon
luopumaan aikeestaan, ei Eerokaan hievahtanut paikaltaan, makasi
siellä vain synkissä mietteissään ja surunvoittoisissa tunteissaan,
kunnes vihdoin nukkui levottomaan uneen.
VI.

Aamulla Eero heräsi myöhemmin kuin tavallisesti. Päivä paistoi


korkealta huoneeseen ja linnun virkeätä viserrystä kuului ikkunan
takaa, mutta elämä tuntui yhtäkaikki Eerosta harmaapilviseltä ja
painostavalta. Verkalleen hän nousi ja pukeutui; aukaisi oven
varovaisesti ja hiipi ulos. Salissa oli kaikki hiljaista. Pojat vielä
nukkuivat tai olivat nukkuvinaan. Eero lähti aamukävelylle.

Suuruspöydässä ei puhuttu sanaakaan, tuskin tervehdittiin. Aarno


ja Tuomo näyttivät synkiltä, vaivaantuneilta. Ukkosta oli ilmassa,
jokainen vältti toisten katseita.

Aterian jälkeen Eero sulkeutui suojaansa, ja päivemmällä hän


kuuli, että ystävät viereisessä huoneessa rupesivat keskustelemaan
matalalla äänellä. Mistä heidän puheensa kävi, sitä hän ei kuullut,
mutta oli kerran erottavinaan oman nimensä sanojen seasta ja arvasi
muutenkin, että keskustelu koski häntä ja eilistä tapahtumaa.

Kun sitten tuli käsky päivällisille ja kaikki kolme taas olivat koolla,
huomasi Eero oitis, että Aarnon ja Tuomon käytös oli vapaampi kuin
aamulla, jopa yrittivät lausua jonkun ystävällisen sanankin. Eero
kuitenkin pysyi totisena ja mykkänä ja tunsi miltei loukkaantuvansa
Welcome to Our Bookstore - The Ultimate Destination for Book Lovers
Are you passionate about testbank and eager to explore new worlds of
knowledge? At our website, we offer a vast collection of books that
cater to every interest and age group. From classic literature to
specialized publications, self-help books, and children’s stories, we
have it all! Each book is a gateway to new adventures, helping you
expand your knowledge and nourish your soul
Experience Convenient and Enjoyable Book Shopping Our website is more
than just an online bookstore—it’s a bridge connecting readers to the
timeless values of culture and wisdom. With a sleek and user-friendly
interface and a smart search system, you can find your favorite books
quickly and easily. Enjoy special promotions, fast home delivery, and
a seamless shopping experience that saves you time and enhances your
love for reading.
Let us accompany you on the journey of exploring knowledge and
personal growth!

ebooksecure.com

You might also like