18 練習問題
3. i2≤nである間は,次の手順4-5を繰り返す。
4. もし,nでiで割り切れたら「nは素数ではありません」とプリントして3の繰り返しを終了する。
5. そうでなければiをi+ 1にする。
6. もし3の条件全てが偽であったら,「nは素数です」とプリントする。
•ファイル名:while primeQ.py
1 # * c o d i n g : utf 8 *
-2 n = i n p u t(’ I n p u t an i n t e g e r ( >1): ’) # 数 を 入 力 さ せ て , そ の 数 を 変 数nに 入 れ る
3 i = 2 # i = 2 と お く
4 w h i l e i * i <= n : # i * i≦nな ら 以 下 を 繰 り 返 す
5 if n % i == 0: # も し nがiで 割 り 切 れ た ら
6 p r i n t n , ’ is not a p r i m e . ’ # nは 素 数 で は な い と プ リ ン ト
7 b r e a k # w h i l e文 抜 け て1 2行 目 以 下 へ 進 む
8 e l s e:
9 i += 1 # iの 値 を 一 つ 増 や す
10 e l s e: # i * i > n と な っ た ら
11 p r i n t n , ’ is p r i m e . ’ # nは 素 数 で あ る 12
13 p r i n t ’おわり’
実行結果の例 Input an integer: 1237
1237 は素数です。
おわり
実は上のプログラムではn= 1が素数と判定されてしまいます。
18 練習問題
18.1 問題:素数判定プログラム
上のプログラム(while primeQ.py)を修正し,n= 1が素数でないと判定されるようなプログラムを作り なさい。
次がプログラムの例です:
•ファイル名:gcd.py
1 a = i n p u t(’ I n p u t an i n t e g e r : ’) 2 b = i n p u t(’ I n p u t an i n t e g e r : ’) 3 w h i l e * * * * * * * :
4 * * * * * * * * * * 5 * * * * * * * * * * 6 * * * * * * * * * * 7
8 p r i n t ’ g r e a t e s t c o m m o n d i v i s o r is ’, a
上の*****の部分を考え,プログラムを完成させなさい。
19 リストの操作とリスト内包表記
19 リストの操作とリスト内包表記
いろいろなデータをまとめて取り扱うときに便利なのがリストです。リストとは[3,6,3,9]のように,い くつかの要素を括弧の中に並べたものです。短いリストであれば,次のように直接的に書くことで定義し ます。
1 > > > a = [1 ,3 ,2 ,4]
2 > > > a
3 [1 ,3 ,2 ,4]
さらに,リストに要素を付け加えるには,appendメソッドを使います。
1 > > > a . a p p e n d (7)
2 > > > a
3 [1 ,3 ,2 ,4 ,7]
もう少し多様なリストをある種のパターンで生成するためには,for文などの繰り返しの処理を使って要素 を付け加えます。次の例を見てみましょう。
1 aa = [] # a aを 空 の リ ス ト と す る
2 for i in r a n g e( 1 0 ) : # iを0か ら9ま で 動 か し て
3 aa . a p p e n d ( i * i ) # i * iを リ ス トaに 付 け 加 え る 。
4
5 p r i n t aa # a aを プ リ ン ト す る
実行結果の例 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
上では,空のリストにi2 (i= 0,1,2,· · ·,9)を付け加える事によって,平方数からなるリストを生成していま す。次に1,9,25,49,81,· · · と奇数の平方数からなるリストをfor文を使って作ってみましょう。
1 bb = [] # b bを 空 の リ ス ト と す る
2 for i in r a n g e( 2 0 ) : # iを0か ら1 9ま で 動 か し て
3 if i %2 == 1: # も し iが 奇 数 な ら
4 bb . a p p e n d ( i * i ) # i * iを リ ス トaに 付 け 加 え る
5
6 p r i n t bb # b bを プ リ ン ト す る
実行結果の例 [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
Pythonにはリスト内包表記という非常に便利なリストの生成法があります。リスト内包表記を使えば,上
のようなリストをたった一行で作ることができます。リスト内包表記を使って上と同じリストを作って表示さ せるプログラムがこちらです:
1 cc = [ i * i for i in r a n g e( 1 0 ) ] # リ ス ト 内 包 表 記 2 p r i n t cc
実行結果の例 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
結果は上と同じですが,リストを簡潔に定義することができました。さらにリスト内包表記で要素を生成する ときに条件を付けることもできます。上で作ったリストbbは次のように簡潔に作ることができます。
1 dd = [ i * i for i in r a n g e(2 0 ) if i % 2 = = 1 ] 2 p r i n t dd
実行結果の例 [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
さらに,次のように二つの変数を動かして要素を生成することもできます:
1 lis = [’ a ’, ’ b ’, ’ c ’]
2 ee = [ ( i , j ) for i in r a n g e(1 ,5) for j in lis ] 3 p r i n t ee
実行結果の例 [(1, ’a’), (1, ’b’), (1, ’c’), (2, ’a’), (2, ’b’), (2, ’c’),
(3, ’a’), (3, ’b’), (3, ’c’), (4, ’a’), (4, ’b’), (4, ’c’)]
20 関数
あるまとまった処理を単純に繰り返すときにはforやwhileで繰り返せばよいのですが,その処理をいろ んな場所で自由に呼び出して使いたいときには関数を使うのが便利です。関数はひとかたまりの処理に名前を 付けて,簡単に使い回しできるようにしたものです。関数を使うことで一回書いたコードを再利用でき,ス マートで読みやすいプログラムを作ることができるようになります。
図6 関数でプログラムを再利用
INPUT x
FUNCTION f:
OUTPUT f(x)
図7 関数のイメージ
20.1 関数の定義のしかた
関数の定義
1 def 関 数 名(引 数) :
2 [処 理 Xを 記 述 し た ブ ロ ッ ク] # 関 数 が 実 行 す る プ ロ グ ラ ム
3 r e t u r n [戻 り 値] # 戻 り 値 が 必 要 な い 場 合 は 省 略 可 能
• 関数はdef文で定義します。
• defの後に関数名と引数を書いたら右端にはコロン『:』を付けます。
• 関数の定義が終わるまでインデントを保つ。
• 関数名の大文字と小文字は区別されます。
• 引数や戻り値は不要なら省略できます。
それでは次の例題を見てみましょう。
•ファイル名:func1.py
20.1 関数の定義のしかた 20 関数
1 def g r e e t i n g (): # こ こ が
2 p r i n t " I ’ m fi n e . " # 関 数 の 定 義 3
4 p r i n t ’ How are you ? ’ # How are you ?と 表 示 す る
5 g r e e t i n g () # 関 数 を 呼 び 出 す
実行結果の例 How are you?
I’m fine.
上のプログラムではgreeting()は呼び出されたらprint "I’m fine"を実行する関数です。関数は定義さ れた時点では実行されず,呼びだされたときに動きます。この関数は引数も戻り値も持ちません。
次に引数と戻り値(return)があるプログラムの例を見てみましょう。
•ファイル名:func2.py
1 def s a n j o u ( a ): # 関 数 名 はs a n j o u, 引 数 はa 2 r e t u r n a * a * a # aの 3 乗 を 返 す
3
4 p r i n t s a n j o u (2) # 返 さ れ た8を プ リ ン ト す る 5 p r i n t s a n j o u (3) # 返 さ れ た2 7を プ リ ン ト す る 6 b = s a n j o u ( 1 ) + s a n j o u ( 2 ) + s a n j o u ( 3 ) + s a n j o u (4) 7 p r i n t b
実行結果の例 8
27 100
sanjou( )は引数の三乗を返す関数ですが,上のように返された値をプリントしたり代入したりすることが
できます。次の例では引数aが奇数ならodd,偶数ならevenを返す関数を定義しています:
•ファイル名:func3.py
1 def g u u k i ( a ):
2 if a %2 == 0: # も し aが 偶 数 な ら
3 r e t u r n ’ ev e n ’ # e v e nを 返 す
4 e l s e: # そ う で な け れ ば
5 r e t u r n ’ odd ’ # o d dを 返 す
6
7 p r i n t g u u k i (1232) , g u u k i ( 9 9 )
実行結果の例 even odd
次にもう少し実用的な関数を作ってみます。西暦n年に対してその年が閏年ならTrueを,そうでなければ
Falseを返す関数uruuQを作ります。さらに西暦1000年から2017年までの閏年をすべて表示します。
•ファイル名:func4.py
1 def u r u u Q ( n ):
2 if n % 4 0 0 == 0:
3 r e t u r n Tr u e
4 el i f n % 1 0 0 == 0:
5 r e t u r n F a l s e
6 el i f n %4 == 0:
7 r e t u r n Tr u e
8 el s e:
9 r e t u r n F a l s e
10
11 for i in r a n g e( 1 0 0 0 , 2 0 1 8 ) :
12 if u r u u Q ( i ): # も し i年 が 閏 年 な ら
13 p r i n t i , # iを プ リ ン ト す る
実行結果の例 1004 1008 1012 1016 1020 1024 1028 ... 1984 1988 1992 1996 2000 2004 2008 2012
次に羊を好きなだけ数える関数を定義してみます:
•ファイル名:func5.py
1 # * c o d i n g : utf 8 * -2 def C o u n t S h e e p s ( a ):
3 for i in r a n g e(1 , a + 1 ) : # iを1か らaま で 繰 り 返 す
4 p r i n t ’羊が’ + str( i ) + ’匹’ # 羊 がi匹
5
6 C o u n t S h e e p s ( 4 5 ) # 関 数 を 呼 び 出 す
実行結果の例 羊が1匹
羊が2匹
・・・
・・・
羊が45匹
関数を別の変数に代入することも出来ます 1 def no b u ():
2 p r i n t ’ De a r u k a ’ 3
4 oda = n o b u # 関 数n o b uを 新 た な 変 数o d aに 代 入
5 oda () # o d aを 実 行
実行結果の例 De aruka