乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

Pythonではリストの中で
様々な処理を内包することができます

元のリストを2倍する様な処理を考えた場合 
(1から5までの数値を倍にしてリストに追加) 
dataList = [1,2,3,4,5]
newData = []
for d in dataList:
  newData.append(d * 2)
print(newData)
[2, 4, 6, 8, 10]

for文ではこのようになりますが
リスト内包表記で記述するともっと簡潔にできます 
dataList = [1,2,3,4,5]
newData = [d * 2 for d in dataList]
print(newData)
[2, 4, 6, 8, 10]


リスト作成の条件にfor文を使って
リストを作成し、結果は同じでも記述が楽です

さらにif文も追加します
(1から10までの偶数を
2倍の数値にしてリストに追加する)
dataList = range(1,11)
newData = []
for d in dataList:
    if d % 2 == 0:
        newData.append(d * 2)
print(newData)
[4, 8, 12, 16, 20]

この様な条件も次のようになります
dataList = range(1,11)
newData = [d * 2 for d in dataList if d % 2 == 0]
print(newData)
[4, 8, 12, 16, 20]


ちなみに似た様な書き方でラムダ式というのがありますが
今回は割愛し後述します

前回の九九も
リスト内表記で簡潔に記述することができます
print ('\n'.join([''.join(['%3d'%(i*j) for i in range(1,10)]) for j in range(1,10)]))
  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  5 10 15 20 25 30 35 40 45
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81

(windowsの場合は \ を ¥ に変えてください)
二重for文の結果(i * j)をjoinで連結し
\n をjoinして改行しています
最初のループが終わった時に改行されるようにしている所に
注意しましょう

ちなみにリスト内包表記は
速度面でも有利なようです
下記は1万回ループ処理をした結果を測ったものです
%%timeit
e_1 = []
for i in range(10000):
    e_1.append(i)
1000 loops, best of 3: 881 µs per loop

%%timeit
e_1= [i for i in range(10000)]
1000 loops, best of 3: 367 µs per loop

%%timeit は速度を測れます
リスト内包表記は速度面でも有利なため
覚えておくと便利です


while文と同じ様に
Pythonでは他の言語と同じく
繰り返し処理を行う文としてfor文が
備わっています

基本的な構文は

for 変数 in オブジェクト:
  実行する処理

このようになります

実行する処理の部分はインデントで
字下げを行うことが必要になります

whileとの違いは
何回処理をするかがあらかじめ決まっていることです
オブジェクトの個数分だけ処理が行われます

オブジェクトにはリストやrange関数が良く用いられます
for v in range(5):
    print(v)
0
1
2
3
4

この場合range関数の結果は0から5の手前までになるので
変数vには0から4までが格納されることになります

if分と組み合わせると
for v in range(1,41):
    if v%3 == 0 or '3' in str(v):
        print(v)
3
6
9
12
13
15
18
21
23
24
27
30
31
32
33
34
35
36
37
38
39

昔流行った「3の倍数と3が含まれる数」
の場合に処理をする際にはこうなります
1から40まで処理を行うのでrangeの引数は(1,41)となります

リストを回数部分に指定できます
friendList = ['チョッパー','ゾロ','ナミ','ウソップ','サンジ']
for friend in friendList[2:4]:
    print(friend)
ナミ
ウソップ

リストの全てを条件にするのでなく
スライスで区切ればその中の一部だけを取り出して
繰り返し処理を行うこともできます

リストの1番目を取り出す場合の指定がlist[0]になるため
この場合はリストの3番目から5番目の手前までが
繰り返しの対象になっています


制御文の使い方


for文の処理内で制御することもできます
その際に使われるのが
・else
・break
・continue
です

まずelse文の処理はwhile文と同じく
for文の処理が終わった後に1度だけ実行されます
breakでfor文の処理を抜けた場合は実行されません

continueは処理を途中で飛ばし
ループの最初に戻ります
friendList = ['チョッパー','ゾロ','ナミ','ウソップ','サンジ']
_num = len(friendList)
for i in range(_num):
    if i%2==0:
        print(friendList[i])
    else:
        continue
        print(friendList[i])
else:
        print('終わり')
チョッパー
ナミ
サンジ
終わり

この場合途中の処理は飛ばされていますが
最後にelse文の処理は実行されます

for文の中にfor文を入れ子(ネスト構造)にすることもできます
for i in range(1,6):
    for h in range(1,6):
            print(str(i * h) + '\t', end="")
    print('\n')
1	2	3	4	5	

2	4	6	8	10	

3	6	9	12	15	

4	8	12	16	20	

5	10	15	20	25	

九九計算も簡単にでき、rangeの数値を増やせば
結果も増やせます

出力に関して
「\n」(windowsでは¥n)は改行
「\t」(windowsでは¥t)はタブ区切り
になります

 

Pythonでは処理を繰り返し行う際に用います

while文では、条件式が真(true)の間
処理の繰り返しを行います

while文の基本構文は以下です

while 条件式:
  条件式が真の時に実行する処理
else:
  条件式が偽の時に実行する処理

条件を満たしている場合は繰り返し処理が行われ
条件を外れた場合にelse文の処理が行われます

以下のようになります
a, b = 0, 1
while b < 10:
    print(b)
    a, b = b, a+b
else:
    print('end')
1
1
2
3
5
8
end


上記はフィボナッチ数列を求める処理ですが
while文の条件(b < 10)が真の間は処理が続き
(b < 10)の条件が外れた場合に
else文の処理が一度だけ行われます
なおelse文については省略可能です

また途中で break文を実行することにより
処理のループを途中で抜けることもできます
この場合else文の処理は行われません
a, b = 0, 1
while b < 10:
    print(b)
    a, b = b, a+b
    if b==5:
        print('break')
        break
else:
    print('end')
1
1
2
3
break

条件が続く限り処理をしたいという場合は
while文を用いますが
いつまでたっても条件を満たしてしまう場合は
永久ループになってしまうので
必ず抜けられる様にしておきましょう


さて
Pythonに関わらず制御構文は
プログラミングの基本になり
if文はその中でも最もよく使うものです

日本語で表すと
もし(ある条件に合致したら)
ああして
もし(ある条件に合致したら)
こうして
それではなかったら
  こうする

こんな感じです

if文の基本構文は以下になります

if  条件1:
結果1
elif 条件2:
結果2
else:
その他結果


結果の部分はインデントといって
行の始めをスペース4つやタブで後ろに下げておく
必要があり、ない場合はエラーになります

ifの条件に合致したら結果1を返し
elifの条件に合致したら結果2を
当てはまらなけらばその他結果を返します

elifは条件の数だけ増やすこともでき
無くても実行できます
else文の必要が無ければ省略できます

次のような使い方をします
JKmanager = 17
print("もし高校野球の女子マネージャーが%d歳だったら" % JKmanager)

if JKmanager < 20:
    print('未成年')
else:
    print('合法')
もし高校野球の女子マネージャーが17歳だったら
未成年

条件文は真偽値をとる文で指定することができます

例えば文字列の値の一致、不一致
数値の比較での大小や一致、不一致
関数の戻り値
ono = 'おのののか'
nono = 'の'
if nono in ono:
    print ('お' + nono * ono.count(nono) * 2 + 'か')
おののののののか

前述の文字列判定を使うと
文字の有無が真偽値で返ってくるので条件文に使えます


演算子について


if文に合わせて使われるのが
比較演算
論理演算

です

まずは比較演算子から

演算子記述例意味
==a == bbがaに等しい
!=a != bbがaに等しくない
>a > bbよりaが大きい
>=a >= bbよりaが大きいか等しい
<a < bbよりaが小さい
<=a <= bbよりaが小さいか等しい

値を比較してその結果を返す為に使います
この場合はオブジェクトが持っている値を比較しています
条件に合致した場合はTrue,そうでない場合はFalseを返します

オブジェクトが同一かどうかの比較は
左辺 is 右辺
同一でないことを調べる場合は
左辺 is not 右辺
とします

次に論理演算です

演算子記述例意味
anda and baとbが共に真の場合に真
ora or baかbの少なくとも1つが真の場合に真
notnot aaが真の時に偽、偽の時に真

この場合は条件の組み合わせによってもたらされた結果が
正しいかどうかを判定します

論理積

左辺と右辺の式を双方を評価して
掛け合わせたものが全体の評価になります
実際のパターンは4通りで全体の評価は以下の通りになります
左辺右辺全体の式

使い方としてはこのように
JKmanager = 18
if JKmanager > 17 and JKmanager < 20:
  print ("JKマネージャー%dはちょうど食べごろです" % JKmanager)
JKマネージャー18はちょうど食べごろです

左辺、右辺の式を満たしていれば共に真の値が返り
両辺の値も真になります


論理和


論理和はどちらかが真の場合に真になります
これも4パターンあり評価は以下の通り
左辺右辺全体の式

使い方としてはこのように
JKmanager = 18
JDmanager = 20
if JKmanager > 19 or JDmanager > 19:
  print ("JKマネージャー%d , JKマネージャー%dどっちも行けます" % (JKmanager,JDmanager) )
JKマネージャー18 , JKマネージャー20どっちも行けます

否定

not演算子をつけると式の評価が逆になります
左辺全体の式

以下のようになります
JKmanager = 18
if not JKmanager < 17:
  print ("JKマネージャー%dは17未満ではありません" % JKmanager)
JKマネージャー18は17未満ではありません


if文の条件を構成する際には
最適な演算子を使って
判定を行うようにします


演算子の優先度

演算子には優先度が有り


(優先順位が高い)
  符号を表す単項演算子の + と -  ~x
  **
  *  /  %  //
  +  -
  <<  >>
  &
  ^
  |
  <  <=  >  >=  ==  !=  <>  is  is not  in  not in
  not
  and
  or
(優先順位が低い)
足し算よりも掛け算の方が優先度が高いのは数式と一緒です

優先度を変更するには括弧 ( ) でくくります
真偽値の判定の際も括弧でくくることにより判定条件を
変えることができるのでうまく使いわけましょう



どんな言語でも
文字列操作はプログラミングの基本になります

文字列型の関数(メソッド)は
たくさんあるので見ていきましょう

基本的にPythonの文字列は
部分的な書き換えができません

文字を入れ替えたい場合は
新たなオブジェクトとして
生成しなければなりません

そんな場合はreplaceメソッドを使います
replace('検索文字列','変更後の文字列')
musuka1 = '3分間待ってやる'
musuka1.replace('3','30')
'30分間待ってやる'

リストなどを連結する際はjoinメソッドが使えます
'連結する際に使う文字列'.join(変数名)
musuka2 = ['見ろ!', '人が', 'ゴミのようだ!']
','.join(musuka2)  
'見ろ!人が!ゴミのようだ'

繰り返しは * 演算子で指定回数を加えます
balsu = 'バルス'
balsu * 10
'バルスバルスバルスバルスバルスバルスバルスバルスバルスバルス'

文字列の中の文字をを検索したい場合はfindを使います
該当文字があれば0番目から始まる番号を返し、無ければ-1を返します
find('文字')
第二引数で検索を開始する位置を指定できます
find('文字',index)
s = 'abcdeffcabc'
index = s.find('b')  # indexは1(2文字目)
print(index)
index = s.find('b', 2)  # indexは9(10文字目)
print(index)
1
9


値の埋め込み

文字列に % 演算子で文字列やlist/tupleを与えると以下のように展開できます
aa = 'Python'
bb = 'いいかんじの言語です'
print ('%s は %s' % (aa, bb)) 
Python は いいかんじの言語です

%sの部分ですが、使う値の型によって変わります
  • %s - 文字列として展開
  • %d - 整数として展開
  • %f - 小数点数として展開
またリストやタプルを文字列にして現したい際は「 , 」を後につけないと
エラーで怒られるので 注意しましょう
strList = [1,2,3]
print ('listの値は: %s' % (strList,))
listの値は: [1, 2, 3]

辞書型を埋めることもできます
%の後にキーと値を指定します
dictA = dict(first='カツオ', family='磯野')
print ('僕の名は ・ ・ ・  %(first)s,  %(family)s  %(first)s' % dictA)
僕の名は ・ ・ ・  カツオ,  磯野  カツオ



 
前述のformatメソッドでも埋め込みができます
print ('{0}{1}{2}'.format('乙', 'Py','大好き'))
乙Py大好き


両端の空白削除

空白削除に strip, lstrip, rstripが使えます

strip :両端からスペース・タブ文字・改行(\rおよび\n)を削除した文字列を返す
lstrip:stripと同等の処理を左端のみに適用したものを返す
rstrip:stripと同等の処理を右端のみに適用したものを返す

spaceX = ' SpaceX '
print ('A' + s.strip() + 'B') 
print ('A' + s.lstrip() + 'B' ) 
print ('A' + s.rstrip() + 'B' )
ASpaceXB
ASpaceX B
A SpaceXB

大文字、小文字

uppper()とlower()で行います
print ('small'.upper() )
print ('BIG'.lower() )
SMALL
big


検索文字の有る無し


文字列の中に特定の文字があるかを判定する方法になりますが
何通りかあります

文字列.find('検索文字列')
検索文字列あればそのインデックスを返す
無ければ-1を返す

文字列.index('検索文字列')
検索文字列あればそのインデックスを返す
無ければ例外を返す

文字列.count('検索文字列')
検索文字列あればその個数を返す
無ければ0を返す

 '検索文字列' in 文字列
検索文字列があればTrue返す
無ければFalseを返す

statesX = 'ぶったね、二度もぶった。ぶったね親父にも打たれたことないに!!'
innerX ='親父'
print(statesX.find(innerX))
print(statesX.index(innerX))
print(statesX.count(innerX))
print(innerX in statesX)
16
16
1
True

恐らく一番楽なのは in を使う方法でしょう
状況に応じて使い分けてください

このページのトップヘ