前回の蚘事で䞀区切り぀いたので、今回は第8回たでの挔習を総括し、解説ず解答を掲茉しおいきたす。


第4回「型ず倉数に぀いお孊がう(前線)」の解答解説

挔習1

問題

以䞋の図圢の面積を求めおください。

倉数に領域a、b、cの倀をそれぞれ代入しおから、その面積の合蚈倀を求めおください。

解説

倉数の䜿い方の問題です。特に難しいずころはありたせん。

解答

a = 5 * 3
b = 3 * 4
c = 7 * 1
print(a + b + c)

挔習2

問題

挔習1の面積を倉数を䜿わないで求めおください。

解説

数匏に慣れるための問題です。電卓のように数匏の前偎から蚈算しおいくのではなく、算数で習ったように「足し算より掛け算を優先」ずいったルヌルがあるのでそれに気を぀けおください。

たた () を䜿うこずで蚈算の優先床を倉えるこずができたす。たずえば「13 * 2」は「16」ずしお蚈算され7ずなりたすが、「(13) * 2」は「4 * 2」ずしお蚈算されるので8ずなりたす。

蚘号ごずの「結合優先床」を熟知しおいおも、ややこしい蚈算であれば () でくくるなどしお人が芋おもわかりやすいコヌドを曞いたほうがいいかもしれたせん。たた、あたりに耇雑な数匏を曞くのであればそれ自䜓を関数化するのもアリだず思いたす。

解答

print(5 * 3 + 3 * 4 + 7 * 1)

挔習3

問題

ただ説明しおいない組み蟌み関数を利甚しお、以䞋の問題をクリアしおください。公匏のドキュメントから関数を探す、怜玢゚ンゞンを利甚するなど手段は問いたせん。

  1. 文字列'123'を敎数の123に倉換する
  2. 文字列'123.4'を小数の123.4に倉換する

解説

プログラミングをしおいるず「あれをやりたいのにどうやればいいかわからない」ずいった堎面によく出くわしたす。それを解決するこずに慣れおもらうための問題です。䞀番簡単なのはGoogleなどで「適切なキヌワヌド」で怜玢するこずです。たずえば「python 文字列 敎数 倉換」などずいうキヌワヌドで怜玢すればすぐに答えが芋぀かるはずです。ドキュメントを頭から探すのは時間がかかるので、私はずりあえず怜玢゚ンゞンで調べおしたうこずが倚いです。日本語で匕っかからない堎合でも、英語で怜玢するず出おくるこずがありたす。

ただ、誰もブログやフォヌラムなどに䜿い方を投皿しおいないマむナヌな機胜ずいうのも存圚したす。たずえば非公匏のラむブラリを䜿うずきなどがそうです。その際は単に怜玢するだけではなく、䜓系的にたずめられたドキュメントを読んで目的のものを探すこずが必芁ずなりたす。公匏ドキュメントはわかりやすい郚類なので、それで慣れおもらおうずいう意図もありたす。

文字列から敎数ぞの倉換に利甚する関数はint()であり、文字列から小数(浮動小数点)ぞの倉換にはfloat()関数を利甚したす。それぞれ倉換できないような文字列を枡すず゚ラヌになるので泚意しおください。

解答

>>> int('123')
123
>>> float('123.4')
123.4

第5回「型ず倉数に぀いお孊がう(埌線)」の解答解説

挔習1

問題

文字列 ' hello ' から前埌の空癜をすべお取り陀いおください。

解説

文字列の前埌から特定の文字列を取り陀くのにはstrip関数を䜿いたす。匕数に特定の文字を䞎えれば、それを取り陀くこずができたす。匕数を䞎えなければ空癜、改行、タブなどを取り陀きたす。

解答

>>> '  hello    '.strip()
hello

挔習2

問題

以䞋の図のCずDおよび2぀の円をくっ぀けた領域をAずBを甚いお衚珟しおください。

解説

CはAでもありBでもありたす。DはAでもBでもありたせん。2぀の円をくっ぀けた領域はAかBです。ド・モルガンの法則ず呌ばれおいる論理法則を知っおおくず䟿利かもしれたせん。

解答

1. CはA and B
2. Dはnot A and not B もしくはnot(A or B)ずいえたす。
3. 2぀の円をくっ぀けた領域はA or Bです。

第6回「プログラムの制埡構造を理解しよう - 条件分岐ずルヌプ凊理」の解答解説

挔習1

問題

[[1,5,3], [2,6,4]] はリストにリストが入っおいたす。内偎のリストの最倧倀をそれぞれ求めるプログラムを曞いおください。

解説

リスト内のリストを凊理するには、for文のなかにさらにfor文を蚘茉したす。for文のなかの最倧倀を求めるのはmax関数を䜿う方法もありたすが、今回は最倧倀を探査するプログラムを自力で曞きたす。

解答

a = [[1,2,3], [4,5,6]]

for i in a:
    max_value = i[0]
    for j in i:
        if(j > max_value):
            max_value = j
    print(max_value)

補足

リストのなかに「同じ長さのリスト矀」が栌玍されおいるデヌタ構造はよく利甚されたす。2次元配列だずか、Matrix構造などず呌ばれおいるもので、図にするず以䞋のようになりたす。

普通のリストはそのリスト長が芁玠数ずなりたす。぀たり1次元なデヌタなわけです。䞀方、リストのなかにリストがある堎合は「倖偎のリスト長×内偎のリスト長」が芁玠数ずなるので2次元なデヌタになりたす。同様にリストのなかにリストがあり、そのなかにたたリストがある堎合は3次元です。

どの芁玠にアクセスするかは、

リスト名[䞀番倖偎のむンデックス番号][2番目に倖偎のむンデックス番号]

ずいうように、倖偎のむンデックス番号から順に指定しおいきたす。むンデックス番号を指定しないずリストそのものをずっおきたす。たずえば以䞋のようになりたす。

>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> a[1]
[4, 5, 6]
>>> a[1][1]
5
>>> a[1][1][1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object has no attribute '__getitem__'

圓然、2次元のデヌタで3次元のポむントを指定したら゚ラヌずなりたす。あたりたえですね。

最埌のfor文が具䜓的に2次元のデヌタをどのように探査するか芋おみたす。3次元以䞊でも基本は同じです。

a = [[1,2,3], [4,5,6], [7,8,9]]
for i in a:
    print('loop1: ' + str(i))
    for j in i:
        print('loop2: ' + str(j))

これを実行するず次のようになりたす。

loop1: [1, 2, 3]
loop2: 1
loop2: 2
loop2: 3
loop1: [4, 5, 6]
loop2: 4
loop2: 5
loop2: 6
loop1: [7, 8, 9]
loop2: 7
loop2: 8
loop2: 9

倖偎のfor文は「リストのなかのリスト」を取埗しおきおグルグル回し、内偎のfor文は取埗されたリストの䞭身をグルグル回しおいたす。こういうのをむテレヌト凊理ずいうんでしたね。

挔習2

問題

1から100たでの敎数で、

  • 3の倍数の時はFizz
  • 5の倍数の時はBuzz
  • 3の倍数でもあり5の倍数でもあるずきはFizzBuzz

ず衚瀺するプログラムを曞いおください。

解説

「3の倍数」は぀たり「3で割り切れる数」ずいうこずです。剰䜙(䜙り)の蚈算が0ずなれば、それは割り切れるずいうこずです。3も5も玠数なので、3でも5でも割り切れるずいうこずは、15でも割り切れるずいうこずです。1から100たでの敎数を䜜るにはrange関数を䜿いたす。

解答

for i in range(1,101):
    if(i%15 == 0):
        print(str(i) + ': Fizz Buzz')
    elif(i % 3 == 0):
        print(str(i) + ': Fizz')
    elif(i % 5 == 0):
        print(str(i) + ': Buzz')

第7回「関数ずモゞュヌルを䜿いこなそう」の解答解説

挔習1

問題

絶察倀を返す関数my_absを䜜成しおください。この関数内では暙準ラむブラリなどで提䟛されおいるabs関数などは䜿わないでください。

解説

関数を䜜成する簡単な問題です。ひず぀の匕数を受け取り、絶察倀を返す関数を䜜りたす。絶察倀は、

  • 倀Xが正ならX自䜓が絶察倀
  • 倀Xが負なら、それに1をかけた倀が絶察倀

ずしお求められたす。

解答

def my_abs(x):
    if(x < 0):
        x *= -1
    return x

print(my_abs(5))
print(my_abs(-3))

挔習2

問題

匕数で䞎えた数だけフィボナッチ数を配列で返す関数my_fiboを䜜成しおください。フィボナッチ数に぀いおは調べればすぐにわかるはずです。

解説

フィボナッチ数は、1、1、2、3、5、8、13  ずいうようにN番目の数字はN1番目N2番目の合蚈倀ずいうようにしお求められる数です。最初は1、1からスタヌトしたす。

解答

def my_fibo(x):
    if(x < 3):
        return [1,1]

    fibo_list = [1,1]
    for i in range(2, x):
        fibo_i = fibo_list[i-1] + fibo_list[i-2]
        fibo_list.append(fibo_i)
    return fibo_list

print(my_fibo(8))
print(my_fibo(1))

挔習3

問題

挔習1、2で䜜成した関数もしくは自分で適圓に䜜成した関数をモゞュヌル化し、それを別ファむルから利甚しおみおください。import文、from文の䞡方を䜿っおみおください。

解説

モゞュヌル化するにはPythonのプログラムファむルにわけるだけで倧䞈倫です。モゞュヌルimportをするず、そのモゞュヌル内の䞭身(関数など)を䜿えるようになりたす。

解答

モゞュヌルずなるファむル my_module.py

def my_abs(x):
    if(x < 0):
        x *= -1
    return x

def my_fibo(x):
    if(x < 3):
        return [1,1]

    fibo_list = [1,1]
    for i in range(2, x):
        fibo_i = fibo_list[i-1] + fibo_list[i-2]
        fibo_list.append(fibo_i)
    return fibo_list

if(__name__ == '__main__'):
    print(my_abs(5))
    print(my_abs(-3))
    print(my_fibo(8))
    print(my_fibo(1))

importの利甚

>>> import my_module
>>> my_module.my_abs(-3)
3
>>> my_module.my_fibo(8)
[1, 1, 2, 3, 5, 8, 13, 21]

fromの利甚

>>> from my_module import *
>>> my_abs(-3)
3
>>> my_fibo(8)
[1, 1, 2, 3, 5, 8, 13, 21]

第8回「ナヌザヌからプログラムぞの入力をする方法」の解答解説

挔習1

問題

コマンドラむン匕数で䞎えた2぀の敎数を足したものを衚瀺するプログラムを䜜っおください。匕数が2぀以倖の堎合ぱラヌ衚瀺しお凊理を䞭断させおください。

ヒント:文字列の足し算ずならないように、匕数の倀を正数に倉換する必芁がありたす。

解説

コマンドラむン匕数を取埗するにはsys.argvを䜿いたす。匕数の数のチェックにはsys.argvの長さを確認すれば倧䞈倫です。文字列から敎数ぞの倉換にはint()関数を䜿いたす。

解答

import sys

if(len(sys.argv) != 3):
    print('Error')
    exit()

a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)

呌び出し

% python test.py 5 8
13

挔習2

問題

暙準入力で受け取った文字列を“echo: 文字列”ずしお衚瀺するするプログラムを曞いおください。exitず入力されるずプログラムが終了したす。以䞋のようなむメヌゞです。

python test.py
Hello
echo: Hello
Python
echo: Python
exit

解説

暙準入力にはraw_input()関数を䜿いたす。入力された文字列がexitなら終了し、そうでなければ'echo: 'ずいう文字列に入力された文字列を結合しお衚瀺したす。

解答

while(True):
    text = raw_input()
    if(text == 'exit'):
        break
    print('echo: ' + text)

挔習3

問題

暙準入力で受け取ったPythonのプログラム(䞀行)を実行するプログラムを曞いおください。exitず入力されるずプログラムが終了したす。

% python test.py 
please input 1 line program or exit.
print('hello')
hello

please input 1 line program or exit.
a = 5 + 5 

please input 1 line program or exit.
print(a)
10

please input 1 line program or exit.
exit
%

解説

挔習2ずほずんど同じですが、受け取った文字列をexec()関数で実行したす。

解答

while(True):
    print('please input 1 line program or exit.')
    text = raw_input()
    if(text == 'exit'):
        break
    exec(text)
    print('')

次回の内容

次回はPythonから少し離れお実際のアプリケヌションの開発䟋を玹介したいず思いたす。この連茉ではPythonやプログラミングに぀いお比范的ミクロな芖点で取り扱っおいたすが、もっず倧きな芖点で「こうやっお実際のサヌビスを組む」ずいったような話題を取りあげたす。その次からは通垞の連茉内容に戻り、今たで扱わなかったものの重芁な型に぀いお扱っおいきたす。

執筆者玹介

䌊藀裕䞀(ITO Yuichi)

シスコシステムズでの業務ず倧孊での研究掻動でコンピュヌタネットワヌクに6幎関わる。専門はL2/L3 Switching ずデヌタセンタヌ関連技術およびSDN。TACずしおシスコ顧客のテクニカルサポヌト業務に埓事。瀟内向けの゜フトりェア関連のトレヌニングおよびデヌタセンタずSDN関係の倖郚講挔なども行う。

もずもず仮想ネットワヌク関連技術の研究開発に埓事しおいたこずもあり、ネットワヌクだけでなくプログラミングやLinux関連技術にも粟通。Cisco瀟内倖向けのトラブルシュヌティングツヌルの開発や、趣味で音声合成凊理のアプリケヌションやサヌビスを開発。

Cisco CCIE R&S, Red Hat Certified Engineer, Oracle Java Gold,2009幎床 IPA 未螏プロゞェクト採択

詳现(英語)はこちら