変数,文字列,数

この節では,情報を変数に格納することを学びます。データには二種類,文字の集まりである文字列と数値データとがあります。

変数

変数には値が入ります。

message = "Hello Python world!"
print(message)
Hello Python world!

変数には値が入ります。変数の値はいつでも変更できます。

message = "Hello Python world!"
print(message)

message = "Python is my favorite language!"
print(message)
Hello Python world!
Python is my favorite language!

名前の付け方の決まり

  • 変数名には文字,数字とアンダスコア(_)しか使えません。変数名は文字かアンダスコアで始めることができますが,最初の文字に数字を使うことはできません。
  • 空白文字を変数名に使うことはできないので,代わりにアンダスコアを用います。例えば,student_nameを"student name"の代わりとします。
  • Pythonの予約語は変数名に使えません。
  • 変数名はあまり長くならない程度に内容をよく表すものにしましょう。例えば,mc_wheelsは単なる"wheels"やnumber_of_wheels_on_a_motorcycleよりも良い名前です。
  • 小文字のlと大文字のOは,それぞれ数字の1と0とまぎれやすいので注意しましょう。

NameError

変数に関連するエラーは,どこかで遭遇することになるでしょう。次のコードを見て,なぜエラーが生じたのか考えてみましょう。

message = "Thank you for sharing Python with the world, Guido!"
print(mesage)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/home/ehmatthes/development_resources/project_notes/intro_programming/notebooks/<ipython-input-12-7966723379c3> in <module>()
      1 message = "Thank you for sharing Python with the world, Guido!"
----> 2 print(mesage)

NameError: name 'mesage' is not defined

エラーメッセージを一通り読んでみましょう。まず,エラーはNameErrorだと分かります。次にエラーの原因となったファイルが分かります。右矢印が示すのは,該当するファイルの中のエラーが行です。続いて具体的なメッセージ"name 'mesage' is not defined"(名前 'mesage' が定義されていません)が表示されています。

すでにエラーの原因を特定できた方もいることでしょう。messageの綴りが異なっていました。"message"でも"mesage"でも構いませんが,変数の綴りを毎回一致させなくてはなりません。

これはとても重要なことです。これを利用すれば,"name"には単一の名前が含まれ,"names"にはたくさんの名前が入っているというように使い分けることが可能になります。

変数名を全て一致させれば,NameErrorを直せます。

message = "Thank you for sharing Python with the world, Guido!"
print(message)
Thank you for sharing Python with the world, Guido!

Guido van RossumはPython言語を20年以上も前に作り出した人物で,Pythonの優しい終身の独裁者とみなされています。GuidoはPython言語のコアの大きな変更全てに今でも許可を出しています。

練習問題

Hello World - 変数

"Hello World"を好きなメッセージに変え変数に格納して,印字してみましょう。

一つの変数, 二つのメッセージ:

  • メッセージを変数に格納して,それを印字します。
  • 新しいメッセージを同じ変数に入れ,新しいメッセージを印字します。

<a id~"Strings"></a>

文字列

文字列は文字が集まったものです。以下に例を示しながら文字列を説明します。

一重及び二重引用符

文字列は一重あるいは二重引用符で囲みます。

my_string = "This is a double-quoted string."
my_string = 'This is a single-quoted string.'

二重引用符で囲めば,文字列中に引用を含めることができます。

quote = "Linus Torvalds once said, 'Any program is only as good as it is useful.'"

小文字・大文字の変換

文字列の小文字・大文字は簡単に変えられます。思い通りに表示できます。

first_name = 'eric'

print(first_name)
print(first_name.title())
eric
Eric

多くの場合,データを小文字で保存し表示する際に変更すると良いようです。タイプミスが見つけやすく,'eric', 'Eric', 'ERIC'が別人とされるのを防げます。

よく使われるのは lower, title, upperです。

first_name = 'eric'

print(first_name)
print(first_name.title())
print(first_name.upper())
first_name = 'Eric'
print(first_name.lower())
eric
Eric
ERIC
eric

変数名.アクション名()という形式をよく見かけます。括弧は空のことも値が入ることもあります。

variable_name.action()

という例ではactionはメソッドの名前です。メソッドは変数に対して何らかの作用を施すものです。'lower', 'title', 'upper'は,全てPython言語に組み込まれている関数で文字列に作用します。後で自分でメソッドを書く方法を習います。

文字列の結合(連結)

文字列を結合はとても便利で,表示したいメッセージやページの一部を作ることができます。ここでも例を見ながら理解しましょう。

first_name = 'ada'
last_name = 'lovelace'

full_name = first_name + ' ' + last_name

print(full_name.title())
Ada Lovelace

プラスの記号は二つの文字列を一つに結合し,「連結」と呼ばれています。プラス記号は,メッセージを作るためにいくつ使っても良い。実際,多くのウェブページは大きな文字列で,文字連結を積み重ねて作られたものです。

first_name = 'ada'
last_name = 'lovelace'
full_name = first_name + ' ' + last_name

message = full_name.title() + ' ' + "was considered the world's first computer programmer."
print(message)
Ada Lovelace was considered the world's first computer programmer.

Ada Lovelaceが初耳なら,WikipediaComputer History Museumに何が書かれているか読んでみると良いでしょう。彼女の人生と業績は,技術分野に関わる女性を支援するAda Initiativeに示唆を与えました。

空白文字

「空白文字」という用語は,コンピュータは認識するが人間には見えないものを指します。空白文字の代表は,スペース,タブ,改行です。

スペースは,コンピュータを使ったことがあれば簡単に入力できますね。タブと改行は特別な文字の組合せで表します。

二つの文字からなる組合せ"\t"は文字列中でタブを表します。タブは文字列中のどこでも使うことができます。

print("Hello everyone!")
Hello everyone!
print("\tHello everyone!")
	Hello everyone!
print("Hello \teveryone!")
Hello 	everyone!

組合せ"\n"は文字列中で改行を表示します。改行も文字列中のどこでも使うことができます。

print("Hello everyone!")
Hello everyone!
print("\nHello everyone!")
Hello everyone!
print("Hello \neveryone!")
Hello 
everyone!
print("\n\n\nHello everyone!")


Hello everyone!

空白文字の除去

テキストボックスでユーザに文字入力してもらったテキストを使うことが多くあると思います。余計な空白文字をテキストの先頭や末尾につけてしまうことはよくあります。空白文字には,スペース,タブ,改行がありましたね。

多くの場合,良い方法は先に文字列から空白文字を取り除くことです。例えば,ユーザがログインする際,'eric 'を'eric"としてシステムに存在するか確かめようとすることができます。

空白文字は,先頭,末尾,または両方から除去できます。

name = ' eric '

print(name.lstrip())
print(name.rstrip())
print(name.strip())
eric 
 eric
eric

何が起きているか分りにくいので,次のようにすると分かりやすいかもしれません。

name = ' eric '

print('-' + name.lstrip() + '-')
print('-' + name.rstrip() + '-')
print('-' + name.strip() + '-')
-eric -
- eric-
-eric-

練習問題

誰々が言った

  • 好きな名言を変数に入れてください。適切な出だしをつけて変数に格納します。例えば,"Ken Thompson once said, 'One of my most productive days was throwing away 1000 lines of code'" この名言を印字しましょう。

ファーストネームの大文字・小文字

  • あなたのファーストネーム(名)をローマ字の小文字で変数に格納しましょう。
  • その変数を小文字,最初の文字だけ大文字,全て大文字で印字しましょう。

フルネーム

  • あなたのファーストネームとファミリーネームを別の変数に格納して,結合してフルネームを印字しましょう。

人の紹介

  • 尊敬する人を選んで,その人のファーストネームとファミリーネームを別の変数に格納しましょう,
  • 連結を使い,その人に関する文を作り,文を変数に格納しましょう。
  • 文を印字しましょう。

名前の前後の空白の除去

  • あなたのファーストネームを変数に格納します。ただし,名前の前後に少なくとも2種類の空白文字を含めてください。
  • あなたの名前を格納されたまま印字してください。
  • 空白文字を左から,次に右から,最後に両側から除去して印字しましょう。

数値

Pythonで簡単な数値データを扱うことはそれほど難しいことではありませんが,知っておくべきことがいくつかあります。

整数

整数を使う基本演算は全て行うことができ,期待通りのふるまいをします。和と差の記号には,それぞれ+と-を使います。積は*,商は/を,累乗には**を使います。

print(3+2)
5
print(3-2)
1
print(3*2)
6
print(3/2)
1.5
print(3**2)
9

括弧を使えば,演算の順序を変えることができます。

standard_order = 2+3*4
print(standard_order)
14
my_order = (2+3)*4
print(my_order)
20

浮動小数点数

浮動小数点数とは,小数点がついた数のことです。ほとんどのばあい,浮動小数点数は小数と同じだと考えて構いません。

print(0.1+0.1)
0.2

ところが,時々小数部がとても長くなることがあります。

print(0.1+0.2)
0.30000000000000004

これが起こるのは,コンピュータの内部での数の表し方が原因です。つまり,Python自体とは関係ありません。簡単に言うと,人間は10の倍数を使っているので1/10に2/10を足したものは単に3/10です。これに対し,コンピュータは2の倍数を使っています。したがって,コンピュータは0.1を2の倍数で,0.2も2の倍数で,それらの和も2の倍数で表さねばなりません。0.3は厳密に2の倍数で表すことはできないので,0.1+0.2の結果のようになったというわけです。

Pythonはこのような現象を可能な限り見せないようにします。当面気にしないでおきましょう。結果をきれいにする方法は少し後で学びますので,あわてないでください。

print(3*0.1)
0.30000000000000004

Python 2.7での整数

Python 2とPython 3の数の取り扱い方には違う点があります。Python 2では二つの整数の商は常に整数ですが,Python 3は常に浮動小数点数を返します。整数の商が整数になるときは同じですが,答えが小数になるときは随分と違う結果になります。

Python 2.7での商

# Python 2.7
print 4/2
2
# Python 2.7
print 3/2
1

Python 3.3での商

# Python 3.3
print(4/2)
2.0
# Python 3.3
print(3/2)
1.5

計算結果が期待通りにならないときや,意味をなさないときは,使っているPythonのバージョンの整数の扱いが思ったものとは異なっていないか確認しましょう。

練習問題

算術

  • 和,差,積,商,累乗の各基本演算について少なくとも一つの計算を行い,結果を印字するプログラムを書いてください。

計算の順序

  • 計算の順序によって結果が変わる計算を考えてください。
  • 標準的な計算の順序に従った計算の結果を印字しましょう。
  • 括弧を使って計算の順序を変えてください。この計算の結果を印字しましょう。

長い小数

  • 筆算では0.1+0.2=0.3となります。Pythonでは0.1+0.2=0.30000000000000004となるのでした。
  • このように長い小数になる例を他にも一つ以上見つけてください。

Python 2かPython 3か

  • 整数の商を使って,使っているPythonインタプリタがPython 2かPython 3か確認しましょう。

発展問題

几帳面な計算

  • 5つ以上の異なる計算をして,別々の変数に入れてください。各演算を最低1回は使ってください。
  • 「5+7の計算結果は12です」のような説明のついた文を印字しましょう。

几帳面な計算順序

  • 上の練習問題,計算順序の続きです。
  • 単に結果を印字するのではなく,結果のまとめを説明するように印字してください。行われた各計算とその計算の結果の両方を表示しましょう。括弧を使ってどのように計算を変更したか説明しましょう。

長い小数 — パターン

  • 筆算では,0.1+0.2=0.3です。Pythonだと,0.1+0.2=0.30000000000000004でした。
  • この例のように長い小数になる計算をいくつか見つけましょう。どのような数字を使うと長い小数になるのかパターンを見つけてみましょう。

Python 2とPython 3

  • 3/2をPython 2で一回Python 3で一回評価するようにコンビュータを設定する方法はあるでしょうか。
  • (ヒント)フォームを読んでパッケージから何をインストールして何をしないかを調べるのが好きでなければ,あまりこれに時間をかけないで結構です。

単にPython 2とPython 3を使ってみたいだけなら,pythontutor.comで簡単にできます。"Start using Online Python Tutor now"をクリックしたら,テキストボックスからサンプルコードを削除して自分のコードを書いてください。そのページには,テキストボックスの下にドロップダウンリストがあり,Pythonのバージョンが選べます。"Visualize Execution"クリックすると,コードが実行されます。次のページでは,"Forward"をクリックしてコードを1行毎に実行したり,"Last"をクリックしてプログラム全体を実行したりすることができます。

コメント

ややこしいコードを書くようになると,解きたい問題に対する答えを出すプログラムを書くことに多くの時間を費やすようになります。アイディアが出てからも,自分のコードの問題点を解決することや方法全体を再検討することにかなりの時間がかかります。

コメントには,コードではない英語などをプログラム中に書くことができます。Pythonインタプリタは,#で始まる行全てを無視します。

# This line is a comment.
print("This line is not a comment, it is code.")
This line is not a comment, it is code.

良いコメントとは

  • 簡潔であるが,漏れがないもの。ほとんどのコメントは,文で書くべきです。
  • 考え方を説明するもので,後日コードを見たときに問題に対してどのように取り組んだかが理解できるもの
  • コードの中で特に難しい部分を説明するもの

コメントが必要な場合

  • コードを書く前にそれについて考えるとき
  • どのように問題に取り組んだか忘れそうなとき
  • 問題の解法が複数あるとき
  • 問題に対する考え方を他の人が思いも寄らなさそうなとき

良いコメントを書けることは,良いプログラマである証拠です。プログラミングに本気で取り組むなら,コメントをすぐに使い始めましょう。コメントの例は,ノートブックを参考にしてください。

練習問題

最初のコメント

  • 最も長く,難しい,あるいは最も興味のあるプログラムを今まで書いたものの中から選んでください。そのプログラム中に,最低ひとつのコメントを書きましょう。

Pythonの哲学

Pythonコミュニティは,とても大きく多様です。Pythonは,科学,医学,ロボット工学,インターネットその他考えられる様々な分野で使われています。このような多様な人々が皆で考えて,どのようにプログラムを書くべきかという共通認識が形成されました。PythonやPythonプログラマのコミュニティを理解しようとするなら,Pythonプログラマの考え方を学ぶのが良いでしょう。

指導原理は言語に書き込まれており,簡単に読むことができます。

import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

いろいろと書かれている中から,いくつか取り上げてプログラミング初心者にどのような示唆が与えられるか考えてみましよう。

Beautiful is better than ugly.
美は醜に勝る。

Pythonプログラマは,良いコードはきれいに書けることを認識しています。問題,特に難しい問題に対して,とても洗練されている,あるいは効率的な解決法を示せば,Pythonプログラマ仲間からあなたの仕事は尊敬を受け,美しいとまで称されるでしょう。質の高い技には美が備わっているのです。

Explicit is better than implicit.
明示は暗黙に勝る。

何をしているかはっきりしている方が,理解が困難な近道よりも良いとされます。

Simple is better than complex.
Complex is better than complicated.
単純は複雑に勝る。
複雑は難解に勝る。

コードは可能な限り簡潔に,ただしときには本当に困難な問題を引き受けて簡単な解決法が見つからないことがあることも覚えておきましょう。そのような場合は複雑さを許容し,難解を避けましょう。

Readability counts.
読みやすさは重要。

面白く有用なプログラムは,今日完全に一人で全体を書いて維持されていることはほとんどありません。コードを書くときは他の人ができるだけ簡単に読めるようにし,自分でも読んで理解することが今から半年後にもできるようにしましょう。良いコメントをコードに書いておくこともこれに含まれます。

There should be one-- and preferably only one --obvious way to do it.
一つのできればただ一つの最良と思える方法があることが望ましい。

大抵問題の解決法には多数のやり方があることがプロクラミングでは普通です。でも,ほとんどの問題は定番の確立した方法があります。複雑さは必要なときにとっておいて,可能な限り最も単純な方法で解決しましょう。

Now is better than never.
とりあえずはやらないよりまし。

最初から完璧なコードを書ける人はいません。思いつきがあって,それを実装したいとき,書いてみて動かしてみましょう。リリースして他の人に使ってもらい,着実に改善していけば良いのです。

総合発展問題

プログラミングについてかなりのことをこれまで学んできましたが,まだ不足で何か作り出せるところまで到達していません。次のノートブックでは,もっと面白くなり,総合発展問題は長くなります。

ここまで学んだこと

  • このノートブックで一度は学んだことを使うプログラムを書いてください。
  • プログラムの各部分に対してコメントを書きましょう。
  • プログラムがすることそれぞれに,最低1行の出力をしてプログラムが何をしたか説明してください。
  • 例えば,ある行はあなたの名前を何らかの空白文字を含む変数に格納して,次の行は名前から空白文字を削除します。
# I learned how to strip whitespace from strings.
name = '\t\teric'
print("I can strip tabs from my name: " + name.strip())
I can strip tabs from my name: eric

Pythonコミュニティを探検する

前に述べた通り,Pythonコミュニティはとても勢いがありたようです。いくつか情報源を紹介しますので,探検して見てください。

  • Pythonウェブサイト

    Pythonウェブサイト本家は今ところおそらくあまり面白くないかもしれませんが,すばらしい情報源であることは学ぶに連れて分かります。

  • PyCon

    Pythonカンファレンス (PyCon) はすばらしいイベントで,コミュニティは新しいプログラマは大歓迎です。このイベントは世界各地で一年中行われています。どれかに参加する機会があれば,学ぶことがたくさんあり,本当に面白い人たちに出会えることでしょう。

  • PyLadies

    女性と少数派は技術畑には少ないのが現状で,プログラミングの世界もこの点について差はありません。しかし,Pythonコミュニティは,女性と少数派に対して最も親切で協力的なプログラミングコミュニティの一つです。多くのグループが女性と少数派をプログラミングを始めてもらうことを目的としていますし,Python関連のイベントで明示されている行動規範として明示されているものが多数あります。

    PyLadiesはこのような団体の中で最も有名なものの一つです。とてもすばらしい情報源なので,何をしていて何を提供しているか調べてみてください。

  • Pythonユーザグループ

    Pythonプログラマが何人かいれば,グループを作ろうという話になるだろうと思います。Pythonユーザグループは,定期的に地域で開かれる集会です。ユーザグループの一覧を見て近くにないか探してみましょう。