正規表現での文字列の置換。まとめてやってしまえ!

import re

#適当な文字列
text = "sadlkajsffalaj*1asjkdlajsdal*2asdkaljdal*3" 

#置換セット
replace_list = [("\*.",""),("a","abc"),("b","dfskjkl"),("ckjsa","aaaa")]

for pare in replace_list:
    pattern = re.compile(pare[0])
    text = pattern.sub(pare[1],text)

print(text)

基本は↓これ

pattern = re.compile("置換したい文字")
text = pattern.sub("置換後の文字",text)

findall() を使った文字列の検索

文字列の中に何が幾つ含まれているかとか、特定の文字列の後にきている文字列を探したくなることがある。

そんな時は、reモジュールのfindall() を使って文字列を検索することができる。

findall()

“`
import re
text = ‘あかさたなはまやらわ’
search = re.findall(‘か’,text)
print(search)

“`

この場合、「か」が含まれている場合、「か」がリストに追加される。

特定の文字列の後にくる文字列も把握する

“`
search = re.findall(‘か.’,text)
print(search)

[‘かさ’]
“`
この場合、「か」とその直後にくる文字列「さ」がペアになって表示される。
では、二つ目の文字列まで把握したい場合は?
同様に、「.」を続けるだけで良い。

“`
search = re.findall(‘か..’,text)
print(search)“`

「か」もしくは「な」を探す

[python title=”Pythonコード”]
search = re.findall(‘か|な’,text)
“`
間に「|」を入れることで「か」もしくは「な」が含まれている場合にリストに表示される。

extend() でリスト同士を結合

append() で要素を追加することができるが、リスト自体をappendすると、リスト内リストになってしまう。

結合する方法

リスト同士の要素を結合する場合は、

“`
list1=[1,2,3]
list2=[4,5,6]
list1.extend(list2)

“`

ファイルの削除

ospythonを使ってブログを投稿できるようになったのはいいけど、
下書きフォルダから投稿済みのファイルを投稿済みのフォルダに移動させたかったのでメモ

下書きフォルダを

まずはディレクトリ下にdraftフォルダを設置。
次に、投稿済みファイルを格納するpostedフォルダを設置

ファイルを書き込み、保存する

適当にファイルを作ります

[code lang=py3]
with open('draft/sample.txt','w',encoding='utf-8') as file:
file.write('サンプルサンプル')

[/code]

これでとりあえずサンプルサンプルと書かれたファイルが保存されました。
with文で書くと、close()のし忘れがないため大変便利です。

次に、作ったファイルをコピーして、postedフォルダに保存させます。

[code lang=py3]
with open('draft/sample.txt','r',encoding='utf-8') as file:
copy_file=file.read()
with open('posted/sample.txt','w',encoding='utf-8') as file:
file.write(copy_file)
[/code]

これでファイルのコピーができました
最後に、
コピーした元のいらないファイルを削除します。これには
os.remove() を使います

[code lang=py3]
import os
os.remove(draft/sample.txt)

[/code]

以上で、ファイルの書き込み、移動、削除ができました。

##
全てのコード

[code lang=py3]
import os
with open('draft/sample.txt','w',encoding='utf-8') as file:
file.write('サンプルサンプル')
with open('draft/sample.txt','r',encoding='utf-8') as file:
copy_file=file.read()
with open('posted/sample.txt','w',encoding='utf-8') as file:
file.write(copy_file)
os.remove(draft/sample.txt)

[/code]

csvデータを読み込む時のメモ

csvを読み込む方法を探していたけど、なかなかpython3ように書かれた情報が見当たらなかったのでメモ。

“`
with open(‘all_data.csv’,’r’,newline=”,encoding=’utf-8′) as file:
csvin=csv.reader(file)
all_data=list(csvin)
“`

これでとりあえず情報を引き出すことができる。

whileとforによる反復処理

whileについて

if,elif,elseによるテストは、上から下に進むが、同じことをくりかえさなければいけない時は、whileが一番単純なループで使いやすいと思います。

[code lang=py]
count=1
while count <= 5:
print(count)
count+=1
[/code]

まず、countに1を代入し、whileループでは、そのcountが5以下の時にcountを表示させなさいという命令が下されている。
ここで重要なのは、print(count)した後に必ずcountに1をプラスしていることだ。
count+=1というのは、count=count+1と同義である。
つまりこのコードの実行結果は、

[code lang=text]
1
2
3
4
5
[/code]

となる。

breakによるループの中止

何かが起きる、または何かを行うまではループを続けたいが、いつそれが起きるかはっきりしない場合は、break文を持つループを作成する。

[code lang=py]
while True:
text=input()
if text=="end":
break
elase:
print(text)
continue
[/code]

これは、while以下のループがTrueの時(間違っていない時と考えればいい。)
テキストを入力させ、さらにif文で、「end」と入力した時はbreakする(=whileから外れる)ようにしてある。
そして、end以外の入力時は、入力したものをprintさせるようにしている。

しかし、いつもこんな感じでwhile文を書いて・・・とするのもワンパターンでよくない。

[code lang=py]
a=['あ','い','う','え','お']
[/code]

このリストにある[‘あ’,’い’,’う’,’え’,’お’]を順番にprintさせたい時、while文を書くとこうなる

[code lang=py]
num=0
while num < len(a):
print(a[num])
num += 1
[/code]

これでは、少々めんどくさい。for in を使えばもっと楽になる。

[code lang=py]
for content in a:
print(content)
[/code]

これは、リストaの中(in)にあるfor( each )contentを繰り返せという意味になる。eachがないせいでforが意味わからんことになってしまっている
しかし、この書きかたはかなりスッキリしているし、リストにどれだけの数の要素が含まれているのかわからなくても
一気に読み出してくれるところが大変お得感満載である。

文字列をfor in でprintさせると、1文字ずつが表示されていく。

辞書に置ける扱い方も同じような感じ。

[code lang=py]
student={'小学生':'6-12歳','中学生':'13-15歳','高校生':'16-18歳','大学生':'18-22歳'}
for st in student:
print(st)
[/code]

この結果は、キーが返される。

[code lang=text]
高校生
中学生
大学生
小学生
博士
大学院生
[/code]

キーではなく値を返したい場合は、リストの後に.values()つけてあげる

内包表記

これから、karanorisutowo
空のリストを作り、一つずつあ、い、う、え、おと加えていく作業を行う。
やっぱりやめた、わかりやすいように1,2,3,4,5と加えていく作業を行う。

[code lang=py]
num=[]
num.append(1)
num.append(2)
num.append(3)
num.append(4)
num.append(5)
print(num)
[/code]

[code lang=text]
[1, 2, 3, 4, 5]
[/code]

しかしこれでは、疲れてしまうし、もし10000まで入力しろと言われたら死んじゃう。
そこでfor文
これで
一気に1〜5までをリストに加えることができた。

さらには、内包表記によって、一行で済ませられる。

[code lang=py]
print(list(i for i in range(1,6)))
[/code]

[code lang=text]
[1, 2, 3, 4, 5]
[/code]

次はこの内包表記についてもう少し詳しく述べていくことにする。

リスト・辞書の使い方まとめ

list() について

リストをa=[1,2,3,4,5]のように指定できることはご存知だろう。

今回は、リストの中にリストを作ってみる。

[code lang=py]
a=['あ','い','う','え','お']
ka=['か','き','く','け','こ']
sa=list("さしすせそ")
ta=list('たちつてと')
na=list('なにぬねの')
ha=list('はひふへほ')
ma=list('まみむめも')
ya=list('や ゆ よ')
ra=list('らりるれろ')
wa=list('わ を ん')
[/code]

とりあえず、ひらがな五十音をそれぞれあ行から、ワ行までリストを作った。

ちなみに、list(‘かきくけこ’)と[‘か’,’き’,’く’,’け’,’こ’]

は同じ意味を持つ。

ここで、これらをまとめたリストを作成する

[code lang=py]
hiragana1=[a,ka,sa,ta,na,ha,ma,ya,ra,wa]
hiragana2=list(a+ka+sa+ta+na+ha+ma+ya+ra+wa)
[/code]

この二つのリストの違いはわかるだろうか

hiragana1は、リストをリストにしている。

hiragana2は、リストをまとめている。

print(hiragana1)
[['あ', 'い', 'う', 'え', 'お'], ['か', 'き', 'く', 'け', 'こ'], ['さ', 'し', 'す', 'せ', 'そ'], ['た', 'ち', 'つ', 'て', 'と'], ['な', 'に', 'ぬ', 'ね', 'の'], ['は', 'ひ', 'ふ', 'へ', 'ほ'], ['ま', 'み', 'む', 'め', 'も'], ['や', ' ', 'ゆ', ' ', 'よ'], ['ら', 'り', 'る', 'れ', 'ろ'], ['わ', ' ', 'を', ' ', 'ん']]

print(hiragana2)
['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', ' ', 'ゆ', ' ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', ' ', 'を', ' ', 'ん']

どちらが使いやすいかは、状況によって異なると思うけど、hiragana1はまとまりがあってわかりやすい。

ここで、さ行のsu

「す」を取り出したい時には、

[code lang=py]
print(hiragana1[2][2])
[/code]

このように記述する。

しつこいようだが、リストの順番は0から1番目となる。

リストの中身を書き換えたい時は、直接していてあげれば良い

[code lang=py]
a[0]= "阿"
print(a)
[/code]

[code lang=text]
['阿', 'い', 'う', 'え', 'お']
[/code]

リストに要素を追加する

リストに要素を追加したい時は、append() を用いる。

[code lang=py]
ka.append('が')
print(ka)
[/code]

[code lang=text]
['か', 'き', 'く', 'け', 'こ', 'が']
[/code]

ちなみに、リストをappend() すると、リストにリストが追加される。

[code lang=py]
sa.append(ta)

['さ', 'し', 'す', 'せ', 'そ', ['た', 'ち', 'つ', 'て', 'と']]
[/code]

inset() を使うと、最後尾ではなく指定のポジションに要素を追加することができる。

[code lang=py]
a.insert(2,"ゐ")
print(a)
[/code]

['阿', 'い', 'ゐ', 'う', 'え', 'お']

del を使えば、リストから要素を削除することができる。

[code lang=py]
del a[1]
print(a)

[/code]

[code lang=text]
['阿', 'ゐ', 'う', 'え', 'お']
[/code]

例えば

「く」が「か行」にあるが、何番目にあるかわからない場合、remove() を使って消すことができる。

[code lang=py]
ka.remove("く")
print(ka)
[/code]

['か', 'き', 'け', 'こ', 'が']

要素の在処をさぐる

「く」のように、どこにあるのかわからない場合、index() を使うことで何番目にあるのか知ることができる。

[code lang=py]
#サ行の「せ」を探す。
print(sa.index('せ'))

3
[/code]

しつこいようだが、3=4番目ということだ

しかし、「せ」を探して「た行」を当たってしまった場合、怒られてしまう。

いちいちエラーになっててはしょうがないので、こういう時、in を使って、True Falseのブール値を割り出す。

[code lang=py]
"せ" in ta

False
[/code]

Falseが帰ってきたので、「せ」はた行になかった。

では、hiraganaリストの中に「せ」が存在するのか、調べたい時にhiragana1かhiragana2どちらを使えば良いだろう?

答えは、hiragana2。こちらはすべての文字が一つずつリストになっているので、Trueが帰ってくる。

[code lang=py]
"せ" in hiragana2

True
[/code]

しかし、hiragana1で探すと、Falseが帰ってくる。

[code lang=py]
"せ" in hiragana1

False
[/code]

これは、hiragana1に「せ」というリストが存在しないから。「さしすせそ」というリストが認識されているためだ。

場合によってhiragana1とhiragana2を使い分けるとは、このことである。

というわけで、よくわからないものをリスト化して持ってきた場合、まず「in」を使って存在の有無を調べ、

次にindex() でそれがどこに存在するのか知るというのが真っ当な手順になる。

個数の割り出し

リストに同じ文字がいくつ含まれているのかを知るには、count() を使う。

[code lang=py]
print(hiragana2.count(" "))

4
[/code]

上記は、hiragana2に空白がいくつ含まれているか調べた。や行とわ行に2つずつあるので4とかえってきた。

文字列への変換

リストを文字列に変換するには、join() を用いる。

[code lang=py]
print(','.join(hiragana2))

あ,い,う,え,お,か,き,く,け,こ,さ,し,す,せ,そ,た,ち,つ,て,と,な,に,ぬ,ね,の,は,ひ,ふ,へ,ほ,ま,み,む,め,も,や, ,ゆ, ,よ,ら,り,る,れ,ろ,わ, ,を, ,ん

#こいつを綺麗にあ〜んまで並べたい時はさらに
print(','.join(hiragana2).replace(',','').replace(' ',''))

あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん
[/code]

ソート

なんとソート機能まである。

sorted(リスト)とするだけ。これで昇順になる。はたして、ひらがなはうまくいくだろうか。

一度最初の綺麗なあいうえお順にもどして、ばらばらに行を並べたhiragana3を作って試してみよう

[code lang=py]
hiragana3=sa+a+na+ka+wa+ta+ra+ma+ya+ha
print(sorted(hiragana3))

[' ', ' ', ' ', ' ', 'あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', 'ゆ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', 'を', 'ん']
[/code]

綺麗にならんだ!

ここでわかったのは、空白文字の方が優先順位が高いことだ。(どうでもいい)

もうひとつ、sort() を使うことができる。これは、リストそのものを書き換える。

[code lang=py]
hiragana3.sort()
print(hiragana3)

[' ', ' ', ' ', ' ', 'あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', 'ゆ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', 'を', 'ん']
[/code]

print(hiragana3.sort())としても、Noneとしか帰ってこない。

辞書

辞書(dictionary)はリストに似ているが

{key:値}のペアでリスト化されている。

それぞれのキーを参照すると、値が出てくるといった感じだ。

[code lang=py]
student={'小学生':'6-12歳','中学生':'13-15歳','高校生':'16-18歳','大学生':'18-22歳'}
[/code]

これは、小学生から大学生までの年齢を辞書に収めていることを示す。

まぁ僕みたいに2年も3年も回り道している人はズレてしまうけど。

[code lang=py]
#中学生の年齢を知りたい時print(student['中学生'])
print(student['中学生'])
[/code]

では、この辞書に大学生が存在しているのか知りたい時は、

[code lang=py]
'大学生' in student
[/code]

とすればよいが、ここで問題。

練習問題

大学生が辞書に含まれている時にその年齢も出してくれるプログラムを書きなさい。

解答

“`py
if '大学生' in student:
print(student['大学生'])
else:
print('見つかりませんでした')
“`

大切なのは、見つからなかった場合のelseもちゃんと書くこと。

ここで、大学生の年齢を18-24に広げたいとする。

[code lang=py]
student['大学生']="18-24"
print(student['大学生'])

18-24
[/code]

これでちゃんと書き換えられている。

辞書同士の結合

大学院生 23-24、博士 25-28を加えたいとする。

over_student={‘大学院生’:’23-24′,’博士’:’25-28′}

とすることで、追加の辞書を作成する。ここに、update() 関数を使ってstudentに加えてあげよう

[code lang=py]
student.update(over_student)
print(student)

{'高校生': '16-18歳', '中学生': '13-15歳', '大学生': '18-22歳', '小学生': '6-12歳', '博士': '25-28', '大学院生': '23-24'}
[/code]

これで無事、大学院生と博士がstudentの仲間入りを果たすことができた。

ここから、やっぱり博士はいらないや★と考える人がいたら、delを使って、同じように削除することができる。

[code lang=py]
del student['博士']
print(student)

{'高校生': '16-18歳', '中学生': '13-15歳', '大学生': '18-22歳', '小学生': '6-12歳', '大学院生': '23-24'}
[/code]

全てを消し去りたい時は、clear() 関数をつかう。

[code lang=py]
student.clear()
print(student)

{}
[/code]

キーの取得

辞書にどんなキーが含まれているのかわからなければ、その辞書は使い物にならない。

そんな時に使うのが、keys() 関数だ。keyではない、keysだ

[code lang=py]
#over_studentを加えたstudent辞書を使う
print(student.keys())

dict_keys(['高校生', '中学生', '大学生', '小学生', '博士', '大学院生'])
[/code]

これで、どんなキーが含まれているのか知ることができた(なんで大学院生が後に来てるんだろう)

このkeys() によって出したキーはlist() で囲むことによってリスト化することができる。

全ての値の取得

キーとは反対に値を知りたい時、values

を使うことで調べることができる。

[code lang=py]
student.values()

dict_values(['16-18歳', '13-15歳', '18-22歳', '6-12歳', '25-28', '23-24'])
[/code]

さらに、キーと値のセットを調べたい時は、items() を使う。

[code lang=py]
student.items()

dict_items([('高校生', '16-18歳'), ('中学生', '13-15歳'), ('大学生', '18-22歳'), ('小学生', '6-12歳'), ('博士', '25-28'), ('大学院生', '23-24')])
[/code]

本日はこれにて終了。

ディレクトリの操作

ディレクトリの作成

ディレクトリを作成するには、import osを使います。

“`
import os
os.mkdir("sample")
“`

これで、pythonを実行しているファイルと同じ階層にsampleというフォルダができます。

同じプログラムを実行すると、すでにありますと怒られてしまいます。
これを回避するには、try と except 構文を使うのが良いでしょう。
##

エラー回避の仕方

“`
import os
try:
os.mkdir("sample")
except:
print("すでに作成済みです")
“`

これを応用すれば、新しいフォルダをinput() で次々と作成していき、すでにある場合は教えてくれるプログラムを書くことができます。

“`
try:
new=input("フォルダ名:")
os.mkdir(new)
except:
print("すでに同じ名前のフォルダが存在します。")
“`

おまけ

さらに、すでに同じ名前のフォルダが存在します。と怒られた場合にフォルダ名を入力し直すwhile文も作っちゃいましょう。

“`
while True:
try:
new=input("フォルダ名:")
os.mkdir(new)
yn=input(‘続けてフォルダを作成しますか?(y/n):’)
if yn == "n":
break
else:
continue
except:
print("すでに同じ名前のフォルダが存在します。")
continue
“`

このようにしてあげれば、次々と新しいフォルダを作成しながら、エラーを回避することができるようになります。

変数、名前、オブジェクトについて

pythonでは、ブール値、整数、浮動小点数、文字列、関数、プログラムなどの全てがオブジェクトとして実装されています。
オブジェクトとはなんぞやという前に、こいつのおかげで、他の言語にはないような一貫性を持っているのがPythonです。

オブジェクトについて

オブジェクトとは、データを入れてある透明なプラスチックボックスのようなものだと思えば良いです。
オブジェクトにはブール値、整数などの****
データ型があり、そのデータで何ができるのかはによって決まります。
プラスチックボックスにワレモノと書かれていたら、それがどんなものなのかだいたい想像がつくのと同じようなことだと思えば良いです。
は、ボックスに入っているデータの値を変更できるかできないかも決められます。つまり、箱の中身を取り出して差し替えても良いかどうかですね。
これをミュータブル(変更可能)、イミュータブル(変更不可)と言います。
Pythonははっきりとした言語で、強く型付けされています。
これを英語で
Strong typingと言うらしいけど、強くキーボードを叩けと言う意味じゃない。

“`
a=7
print(a)
“`

“`7
“`

これはaと言う変数に7を代入したものになる。変数はただの名前ということに注意。
名前は、値そのものではなく、値の参照としての意味を持つ。
透明なボックスの表にaというラベルを貼り、中には7という数が転がっている感じ。
この箱に、bというラベルも貼りたければ、貼ることができる。
“`
a=7
b=a
print(b)
“`

“`7
“`

例えばコーディングをしている時にaってなんの型だったっけという場合は次のように確認することができる。
“`
type(a)
“`

“`class ‘int’“`

intというのは、整数値のことを指します。

変数として使えるのは次の文字列のみ

a-zの小文字

A-Zの大文字
数字の0-9
アンダースコア’_’

ハイフンは使えないので注意。
もう一つ、変数の頭に数字は使えない。あくまで、途中や終わりに付与できる。
また、FalseやNoneなどのPythonにもともと指定されている予約語にを変数として使うことはできない。

数値について

pythonには、整数や浮動小点数のサポートが組み込まれています。だから浮動小点数ってなんやねん。
浮動小点数とは、例えば1.12345とか、1.86e4です。普通の小数有りの実数だと思えばいいのね。たぶん。
数値同士を演算するための演算子は次に通りです。

“`+:加算
-:減算
*:乗算(掛け算)
/:除算(割り算)
//:整数の割り算(切り捨て)
%:剰余(余り) 例)7%3 1
**:指数 例)3**4 81
“`

基数について

整数は特別指定しない限り、10進数とみなさます。
Pythonでは、10進数以外に3種類の基数を置くことで2進数と、8進数と16進数を表現することができます。

“`0または0B=2進数
0oまたは0O=8進数
0xまたは0X=16進数
“`

“`
0b10
2
0o10
8
0x10
16
“`
と行った感じになる

型の変換

浮動小点数を整数に変換すると、小数点以下の部分が切り捨てられ、整数になります。
“`int(98.1231231)
98
“`
また、整数を整数に変換しても整数です。
“`
int(98)
98
“`
文字列は当然ながらintにできない
Pythonでは、64bit以上の数字を入力しても整数オーバーフローとならない。
Pythonでは、途方もなく大きな数字を表現できるようになった。

文字列について

文字列はシングルクオート(’)か、ダブルクオート(“)で囲んで書く。

もし複数行で書きたい場合は、このようにする

“`
”’
ほにゃららら
”’
もしくは、
"""
ほにゃらす
"""
“`

これをトリプルクォートというらしい。

ちな空文列**というものが存在する。

これは、空の文字列、つまり「なにもない」という文字列である。

“`


""

”””

""""""

“`

これはNoneとは違い、ちゃんと存在する文字列だということに注意。

##エスケープについて

Pythonでは、バックスラッシュ(\)を使うことで、特別な表現ができる。

(これは、他の言語でもよく使われている。)

たとえば、「\n」は改行を表す。

y

“`
print(‘いろはにほへと\nちりぬるを\nわかよたれそ\nつねならむ’)
いろはにほへと
ちりぬるを
わかよたれそ
つねならむ
“`

文字列の連結

文字列は+で連結させることができる。

“`
print(‘あかさたな’+’はまやらわ’)
あかさたなはまやらわ
“`

文字列は、*を使うことで繰り返し表現できる。(引き算や割り算はできないのにややこしい・・・)

“`
print(‘あかさたな’*5)
あかさたなあかさたなあかさたなあかさたなあかさたな
“`

文字列の抽出

[]を使うことで、文字列の何番目にある文字を取り出すことができる。

“`
wa=’あかさたなはまやらわ’
print(‘wa[1]’)

“`

ここで、1としたのに「か」が表示されたのに

は理由がある。Pythonでは、番号は0からカウントする。

1番目なら、0。2番目なら1といった感じ。(これがややこしい

文字列の数以上の数字を指定するとエラーになる。

文字列の置き換え

replace() を使うことで、文字列を変換することができる。

個人的にはこれが結構便利で、スクレイピング(webページから情報を抽出する作業)の時にも、いろいろと役に立つ。

“`
.replace(‘変換させたい文字列’,’変換後の文字列’)
“`

という風に使う。たとえば、

“`
wa=’あかさたなはまやらわ’
print(wa.replace(‘あか’,’きいろ’))
きいろさたなはまやらわ
“`

文字列のスライス

[start:end:step]を使うことで、文字列をどこからどこまでかつ何文字飛んでという取り出し方が可能になる。

“`
alpha=’abcdefghijklmnopqrstuvwxyz’
print(alpha[0:10])
abcdefghij
print(alpha[5:12])
fghijkl
print(alpha[:])
abcdefghijklmnopqrstuvwxyz #全部という意味になる
print(alpha[::1]) #全部一つずつ=全部
abcdefghijklmnopqrstuvwxyz
print(alpha[::2]) #1つおきに
acegikmoqsuwy
print(alpha[2:19:2]) #2つ目から18番目まで1つおき
cegikmoqs
“`

ここでん?となる。カウントは0が1番目なのに、[0:19]とした場合に18番目までしか表示されない。

これが僕の頭を悩ませている問題の一つで、[x:y]とした場合日本語に直すと、x+1番目から、y-1番目までということになる。

さらに[-x:]とか指定すれば末尾からとか指定できるんだけど、この場合〜番目がまたルール違ってくるのでお手上げ。バカな僕は多分二度と使わないでしょう。

len() による長さの取得

len() を使えば、文字列の長さ(=文字列の数)を取得することができる。

これもよく使うことになるので必須。

“`
alpha=’abcdefghijklmnopqrstuvwxyz’
print(len(alpha))
26
“`

これでa-zまでが26文字だということがわかった。

これはどんな時に便利かというと、後ででてくるリスト( list )でよく使う。

リストは簡単にいうと、リストである(意味不明

“`
alpha=[‘a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’,’k’,’l’,’m’,’n’,’o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’,’w’,’x’,’y’,’z’]
“`
これはa-zまでを一文字ずつ格納したリストだ。
これが、たとえば適当に抽出してきたリストで、いったい幾つ要素が含まれているのかわからない時に、
“`
print(len(alpha))
26
“`

文字列の分割

split() を使うと、文字列を特定の条件にしたがって分割し、リストにすることができる。

“`
alpha=’いろはにほへと ちりぬるを わかよたれそ つねならむ’
print(alpha.split(‘ ‘))
[‘いろはにほへと’, ‘ちりぬるを’, ‘わかよたれそ’, ‘つねならむ’]
“`

ちなみに、list() を使うことでもリスト化は可能。しかし、こちらは1文字ずつがリスト化されてしまう。

“`
print(list(alpha))
[‘い’, ‘ろ’, ‘は’, ‘に’, ‘ほ’, ‘へ’, ‘と’, ‘ ‘, ‘ち’, ‘り’, ‘ぬ’, ‘る’, ‘を’, ‘ ‘, ‘わ’, ‘か’, ‘よ’, ‘た’, ‘れ’, ‘そ’, ‘ ‘, ‘つ’, ‘ね’, ‘な’, ‘ら’, ‘む’]
“`

気をつけなければならないのは、間のスペースも一つの文字として勘定されてしまうこと。

join() による結合

またこの逆にjoin() を使ってリスト化された文字列を結合することができる

“`
#こいつがまたややこしい。
alpha=’いろはにほへと ちりぬるを わかよたれそ つねならむ’
a=alpha.split(‘ ‘)
print(a)
[‘いろはにほへと’, ‘ちりぬるを’, ‘わかよたれそ’, ‘つねならむ’]
print(‘@’.join(a))
いろはにほへと@ちりぬるを@わかよたれそ@つねならむ
“`

これはつまり、”で囲まれた文字列を、リストを取っ払った間に入れて結合するぜ!という意味になる。

なので元どおりに半角スペースでいろはをなおしたければ、’ ‘.join(a)といった感じにすれば良い。

なんで逆にしたんだろうね。普通にa.join(‘文字列’)でいいじゃんかよ・・・。

という感じで、本日は終了。

練習問題

a=’abcdefghijklmnopqrstuvwxyz’
という文字列をaの変数で定義する。この文字列の間に「@」を挿入し、さらに「@」を「,」に直しなさい。

ansewer

解答

“`
print(‘@’.join(list(a)).replace("@",","))
“`
“`a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z“`

open() 関数で、ローカルファイルの読み書きを行う

ここで学ぶこと

ローカルに保存されているファイルをPythonで開く
open() 関数
read() 関数
write() 関数
close() 関数

open() 関数

open() 関数を使えば、ローカルに保存されているファイルを開くことができます。
その場合、ファイルのパス(保存場所を示すもの)を明記してあげなければいけません。

ファイルの指定方法はOSによって異なります。

WindowsOSの場合

Cドライブにtest.txtを作成したとき、

“` c:\\text.txt
“`

MacOSの場合

デスクトップにtest.txtを作成した時。

“`/Users/[ユーザー名]/Desktop/test.txt
“`

といった具合です。

Macの場合、

“`ファイルを右クリック > optionキーを押しながら > パス名をコピー“`

で簡単にファイルのパス名をコピーすることができます。

ファイルを開いてみよう

[python title=”Pythonコード”]
text_file=open("/Users/hitoripython/Desktop/test.txt")
“`

これだけでは、中身を見ることはできません。

中身を表示させるには、read() 関数を使用する必要があります。

[python title=”Pythonコード”]
print(text_file.read())
“`

“`これはテキストファイルです。
Pythonで開くことができます。
“`

#書き込みを行う
書き込みを行うには、[書き込みモードにせよ]という一言が必要になります。

[python title=”Pythonコード”]
write_file=open(‘/Users/hitoripython/Desktop/test.txt’,"w")
“`

次に、ファイルに書き込む内容を指定します。
[python title=”Pythonコード”]
write_file.write(”’
これはテキストファイルです。
Pythonで開くことができます。
”’)
“`

最後に、ファイルを閉じます。

[python title=”Pythonコード”]
write_file.close()
“`

まとめ

書き込みが終わったら、ちゃんと書き込みがされているか確かめましょう。

[python title=”Pythonコード”]
write_file=open(‘/Users/hitoripython/Desktop/test.txt’,"w")
write_file.write(”’
これはテキストファイルです。
Pythonで開くことができます。
”’)
write_file.close()
print(open(‘/Users/hitoripython/Desktop/test.txt’).read())
“`

“`
これはテキストファイルです。
Pythonで開くことができます。
“`

turtleモジュールを使ってフィボナッチ数列を可視化する

使う知識

  • turtle
  • フィボナッチ

    フィボナッチ数列は、自然界に存在する模様やパターンに現れています。
    かたつむりの渦巻き、木の枝の数、花びらの増え方、、、あらゆる自然現象に、フィボナッチ数列は見られます。

    今回は、せっかくのPython修行なのでturtleモジュールを使ってフィボナッチ数列を可視化したいと思います。

    まずは、フィボナッチ数列をリストに出して見ましょう。

    フィボナッチ数列のリスト化

    [python title=”Pythonコード”]
    def fib(n):
    result = []
    a, b = 0, 1
    while b < n:
    result.append(b)
    a, b = b, a+b
    return result
    n=500
    print(fib(n))
    “`

    “`
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
    “`

    次に、これをturtleで図形描写しましょう。

    カタツムリの渦巻き

    [python title=”Pythonコード”]
    def fib(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
    result.append(b)
    a, b = b, a+b
    return result
    import turtle
    t=turtle
    x=500
    i=0
    print(fib(x))
    while i < len(fib(x)):
    t.circle(fib(x)[i],90)
    i+=1
    if i == len(fib(x)):
    break
    “`

    “`
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
    %e3%82%ab%e3%82%bf%e3%83%84%e3%83%a0%e3%83%aa
    “`

    【辞書機能】dictオブジェクトのキーと値について

    ここで学ぶこと

    キーと値を指定し、表を参照・加工する方法

    キー、値とは

    リストの応用技として、「キー」を指定し、それに対応する「値」を設定することができます。

    例)

    “`py

    x = {"京都":"関西","埼玉":"関東","三重":"東海"}

    “`

    この場合、京都は関西、埼玉は関東、三重は東海と、それぞれ対応していることになります。

    リストは[要素,要素2]で表しますが、キーと値の場合は{キー:値}という表現方法になります。

    キーから値の検索

    例えば、「埼玉はどこの地域か」と検索したい時、

    “`pyprint(x[“埼玉”])“`

    と命令します。

    すると、

    関東

    と返ってくるはずです。

    list() では、[0]のように番号を指定しなければいけませんが、キー値を検索する場合は[キー]とします。

    キーと値の削除

    削除はlist() と同様に行います。

    “`py

    del x["埼玉"]

    “`

    練習問題

    上のdictオブジェクトから、京都を消しなさい。

    解答

    “`py

    x = {"京都":"関西","埼玉":"関東","三重":"東海"}
    del x["京都"]
    print(x)

    “`

    おまけ(三重県を関西にする)

    x = {“京都”:”関西”,”埼玉”:”関東”,”三重”:”東海”}
    x[“三重”] = “関西”
    print(x)

    リストへ要素・変数を追加、削除、検索する

    ここで学ぶこと

  • append() del を用いたリストの中の要素に追加、または削除を行う方法
  • index() を用いたリスト内の検索方法
  • リストへの追加

    list() への追加は、append() 関数を用いることで可能です。

    “`py
    x = ["京都","大阪","和歌山"]
    x.append("兵庫")
    x.append("滋賀")
    print(x)

    “`

    [python title=”実行結果”]
    [‘京都’, ‘大阪’, ‘和歌山’, ‘兵庫’, ‘滋賀’]

    “`

    リストから削除

    リストから任意の要素を削除するには、del文 をつかいます。

    [python title=”Python”]del x[4] #5番目の要素を削除
    print(x)“`

    [python title=”実行結果”]
    [‘京都’, ‘大阪’, ‘和歌山’, ‘兵庫’]

    “`

    削除する方法はわかった。

    しかし、何がどこにあるのか分からなければ、好きに削除できるとは言い難い。

    リストを検索

    まずはリストに大阪が含まれているか知りたいとする。

    “`py

    print("大阪" in x)

    “`

    存在するのであれば、

    [python title=”実行結果”]

    True

    “`

    がかえってくる。値を返すだけならprint() は特に必要ありません。

    リストの何番目にあるのか

    存在することがわかれば、あとは何番目にあるのかという問題です。

    ここで、index() 関数を用います。

    “`pyprint(x.index(“大阪”))“`

    とすると、

    [python title=”実行結果”]
    1

    “`

    がかえってきます。

    list() は0からカウントするので、2番目に存在することになります。

    練習問題

    “`pyx = [“京都”,”大阪”,”和歌山”]“`の時、大阪を検索して削除するプログラムを書きなさい。

    解答

    [python title=”Python”]x = [“京都”,”大阪”,”和歌山”]
    print(“大阪” in x)
    print(x.index(“大阪”))
    del x[1]
    print(x)“`[python title=”実行結果”]
    True
    1
    [‘京都’, ‘和歌山’]

    “`

    範囲系を司るrange()の基本

    ここで学ぶこと

    range()を使い、範囲を指定する方法

    範囲を指定する

    rangeをつかえば、一つながりの範囲を指定することができます。
    まずは基本的な書き方から。

    [python title=”Python”]x = range(10)
    numbers = list(x)
    print(numbers)“`

    [python title=”実行結果”][0,1,2,3,4,5,6,7,8,9]“`

    これは、xに10番目までの範囲を指定するよといういみです。

    おかしくないか?
    どこから、とか、なにを、とか言ってませんがな。

    pythonでは、何も指定しなかった場合、数字が0からカウントされます。

    カウント開始点を指定

    もちろん、開始地点を指定するができます。

    print(range(20) == range(0, 20))

    うえの左右は同義になります。

    [python title=”Python”]numbers = list(range(3, 8))
    print(numbers)“`

    [python title=”実行結果”][3,4,5,6,7]“`

    開始は、指定した番号から始まります。
    リストの番号は0から1番目のカウントをしていたので、こりゃややこしい。

    飛ばし範囲

    range() の()の中身の要素はもう一つあります。
    何個飛ばしでカウントするのかです。

    通常指定なしの場合は1ずつカウントされますが、1つ飛ばして2個目をカウントさせたい場合、このようにかきます

    [python title=”Python”]numbers = list(range(0, 10, 2))
    print(numbers)“`

    [python title=”実行結果”][0,2,4,6,8]“`

    これで偶数のみのリストを作成することができました。

    基本は以上になります。

    練習問題

    0-100までの数値で、3の倍数ずつ並べたリストを書き出しなさい。

    解答

    [python title=”Python”]numbers = list(range(0, 100, 3))
    print(numbers)“`

    リストの書き方と抽出方法

    ここで学ぶこと

    リストの書き方と抽出方法

    リスト

    文字列や数字といった変数を並べたリストのこをさします。

    “`pylist = [“pen”,”apple”,”pineapple”,”pencil”]“`

    といった具合に記述します。

    ためしにこれらを書き出してみましょう。

    “`pyprint(list)“`

    [python title=”実行結果”][“pen”,”apple”,”pineapple”,”pencil”]“`

    と、単純に表示されるだけです。

    リスト内の要素を抽出

    例えば、リスト内の[apple]だけを書き出したい場合、このように書きます。

    “`pyprint(list[1])“`

    [python title=”実行結果”]apple“`

    無事表示されました。

    あれ?
    2番目なのに、[1] なの?

    リストの順番のカウントは、0から始まります。
    1番目=0
    2番目=1
    3番目=2・・・
    といった具合になるので注意しましょう。

    リスト内の範囲を抽出

    例えば、リスト内の2番目から4番目までを書き出したい時、このように記述します。

    “`pyprint(list[1:4])“`

    [python title=”実行結果”][‘pen’, ‘apple’, ‘pineapple’, ‘pencil’]“`

    あれ?!リストのカウントは0からじゃなかったの?
    なぜ末尾を4として4番目が出てくるのでしょうか。

    list[n:m]は、n+1番目からm番目の要素が抽出されます。

    リストの要素の個数をカウントする

    例えば、そのリストにそもそも幾つの要素があるのか数えたい場合、len() 関数を使います。

    [python title=”Python”]list = [“pen”,”apple”,”pineapple”,”pencil”]
    len(list)“`

    [python title=”実行結果”]4“`

    リストに要素を加える

    append() を使うことによって、リフトの末尾に要素を付け足すことが可能です。

    [python title=”Python”]list = [“pen”,”apple”,”pineapple”,”pencil”]
    list.append(“PPAP”)
    print(list)“`

    [python title=”実行結果”][“pen”,”apple”,”pineapple”,”pencil”,”PPAP”]“`

    だいたいこんな感じで使います。

    練習問題

    [“a”,”b”,”c”,”d”,”e”,”f”]
    のリストから、リストの要素数を割り出し、c,d,eを抽出しなさい。

    解答

    [python title=”Python”]list = [“a”,”b”,”c”,”d”,”e”,”f”]
    len(list)
    print(list[2:5])“`

    [python title=”実行結果”][‘c’, ‘d’, ‘e’]“`

    print文の基本

    練習問題

    [python title=”Python”]
    x = 1
    y = “1”
    “`
    が定義されている。

    print() を用いて、xとyを足し合わせるプログラムを書きなさい。
    (2通り)

    ここで学ぶこと

    print() 文の基本を学んでいきます。

    print文とは

    printはざっくりと説明すると、文字列 や要素、数字を書き出すためのおまじないです。

    数字の場合

    [python title=”Python”]
    print(1)
    “`

    [python title=”実行結果”]
    1
    “`

    数字はintと呼ばれ、「数字そのもの」を表します。

    文字列 の場合

    [python title=”Python”]
    print(“ひとりPython修練所”)
    “`

    [python title=”実行結果”]
    ひとりPython修練所
    “`

    文字列 は、str(string)と呼ばれ、「文字」そのものを表します。

    文字列 の場合、 「”」もしくは「’」で囲まなければいけません。

    では、

    [python title=”Python”]
    print(1)
    “`

    [python title=”Python”]
    print(“1”)
    “`

    の違いはなんでしょうか。

    もうおわかりですね、

    前者は「数字の1」、後者は「文字列 としての1」になります。

    この場合、出力結果そのものは同じになります。

    しかし、この二つには大きな違いがあります。

    「”」または「’」で囲まれた文字はstr型となり、完全な「文字列 」として認識されます。

    合計

    [python title=”Python”]
    x = 1
    y = 2
    “`

    とした場合、

    [python title=”Python”]
    print(x + y)
    “`

    の実行結果は、

    [python title=”実行結果”]
    3
    “`

    となります。

    しかし、

    [python title=”Python”]
    x = 1
    y = “2”
    print(x + y)
    “`

    の結果はエラーとなってしまいます。
    試しにやってみてください。

    [python title=”実行結果”]
    TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
    “`

    と言われてしまいます。

    この意味は、int型(数字)とstr型(文字)を足し算することはできませんよというものになります。

    どうしても足し算したい場合、二つの方法があります。

    一つは、int型の数字をstr型として変換させ、合わせることです。
    この場合、str(x)と書きます。

    [python title=”Python”]
    x = 1
    y = “2”
    print(str(x) + y)
    “`

    [python title=”実行結果”]
    12
    “`

    当然ですが、結果は11となります。xとyがそれぞれ「文字列 」として認識されているからです。

    “1”+”2″ということですね。

    もう一つはもうお判りだと思いますが、str型であるyをint型に置き換えることです。

    [python title=”Python”]
    x = 1
    y = “2”
    print(x + int(y))
    “`

    [python title=”実行結果”]
    2
    “`

    今回は、それぞれが「数字」として現れているので、単純な足し算となり、結果は「2」となっていますね。

    このように、print出力する際には、int型であるか、str型であるか注意して行う必要があります。

    今日はここまで。

    解答

    [python title=”Python”]
    x = 1
    y = “1”
    print(str(x)+y)
    “`
    [python title=”実行結果”]
    11
    “`
    または、
    [python title=”Python”]
    x = 1
    y = “1”
    print(x+int(y))
    “`
    [python title=”実行結果”]
    2
    “`
    “`

    四則演算+α

    練習問題

    次の計算結果を表示させるプログラムを書きなさい
  • 3+4
  • 4-3
  • 3×4
  • 3÷4
  • 4÷3の余り
  • 3の4乗
  • 3の平方根
  • ここで学ぶこと

  • 四則演算の方法
  • 累乗、平方根の計算方法
  • 基本的な計算は超簡単

    解説するまでもなく、

    足し算

    [python title=”Python”]1 + 2“`

    引き算

    [python title=”Python”]2 – 1“`

    掛け算

    [python title=”Python”]1 * 2“`

    割り算

    [python title=”Python”]2 / 1“`

    で実行するだけです。

    print() なども必要ありません。

    累乗

    累乗は、このようにして求められます。

    [python title=”Python”]2 ** 3“`

    [python title=”実行結果”]8“`

    平方根

    累乗は掛け算二つでできましたが、平方根はmathモジュールが必要となります。

    [python title=”Python”]import math
    math.sqrt(100)“`

    [python title=”実行結果”]10.0“`

    import mathでmathモジュールを取り込みます。
    Anacondaには最初から入っていると思います。

    解答

    (数字と記号の間はスペースを入れなくても良い)
    [python title=”Python”]3 + 4“`
    [python title=”Python”]4-3“`
    [python title=”Python”]3*4“`
    [python title=”Python”]3/4“`
    [python title=”Python”]4%3“`
    [python title=”Python”]3**4“`
    [python title=”Python”]import math
    math.sqrt(3)“`
    [python title=”実行結果”]7
    1
    12
    0.75
    1
    81
    1.7320508075688772
    “`

    参考にしたサイト


    まずはmathをimportしますと。

    >>> import math
    円周率とか、高校で習ったきりですが(文系なもんでw)自然対数の底eなんかが用意されているんですね。

    加算(In-Place Operations)の方法

    練習問題

    [python title=”Python”]x = 2“`
    の時、print(x)で8を出力するようにプログラムを書きなさい。

    ここで学ぶこと

  • 書き換え
  • 定義そのものに加算する方法
  • 後に書いた定義が上書きされる

    Pythonでは、というかおそらくほとんどのプログラミングコードでは、後に書かれた方が優先されて定義される。
    したがって、もっとも単純なやり方はxそのものの定義を変えてしまうことである。

    [python title=”Python”]x = 2
    x = 8“`

    こうしてしまえば、もうxは8以外の何者でもなくなる。

    直接加算

    これを応用して、以下のように記述することができる。

    [python title=”Python”]x = 2
    x = x + 6“`

    左辺の新しいxは、右辺の古いxに6を足したもの」という意味になる。

    さらに、便利な記法が存在する。

    [python title=”Python”]x = 2
    x += 6“`

    これは上のものと同義である。

    はじめは慣れずに意味を汲み取るのに時間がかかるが、慣れるとかなり使いやすい構文である。

    これは、足し算だけでなく、他の四則演算にも応用できる。

    例えば、

    [python title=”Python”]x = 2
    x *= 5
    print(x)“`

    [python title=”実行結果”]10“`

    [python title=”Python”]x = 2
    x **= 4
    print(x)“`

    [python title=”実行結果”]16“`

    [python title=”Python”]x = 10
    x %= 3
    print(x)“`

    [python title=”実行結果”]1“`

    といった感じになる。

    解答

    単純な書き換え
    [python title=”Python”]x = 2
    x = 8
    print(x)“`

    または、

    足し算
    [python title=”Python”]x = 2
    x += 6
    print(x)“`

    または、

    掛け算
    [python title=”Python”]x = 2
    x *= 4
    print(x)“`

    または、

    3乗
    [python title=”Python”]x = 2
    x **= 3
    print(x)“`

    いずれも、
    [python title=”実行結果”]8“`

    文字列の掛け算?!

    文字列 は掛け算することができる

    [python title=”Python”]x = ‘なんでやねん’
    y = 10
    print(x*y)“`

    [python title=”実行結果”]なんでやねんなんでやねんなんでやねんなんでやねんなんでやねんなんでやねんなんでやねんなんでやねんなんでやねんなんでやねん“`

    文字列 を掛け算すると、その回数だけ文字列 が繰り返されます。

    なんでやねん。

    足し算はあかんくて、掛け算はいいんかい!!

    ここら辺の「やっちゃえばいい」的なノリがPythonの素敵なところだと思います。

    練習問題

    [python title=”実行結果”]シンジくん:そんなの関係ないっ、そんなの関係ないっ、そんなの関係ないっ“`をできるだけ楽して出力させるプログラムを書きなさい。

    解答

    [python title=”Python”]x = ‘そんなの関係ないっ、’
    y = 3
    print(“シンジくん:”+x*y)“`

    【%s】文字列に変数を挿入する(プレースホルダー)

    ここで学ぶこと

    文字列 の中に変数を埋め込む方法

    %s

    あるサイトのURLパターンから、url末尾に好きな数字を埋め込みたいとします。
    例えば、ひとりPython修練場の記事の構成は
    http://hitoripython.wpblog.jp/archive/[数字]
    となっていますが、ここに[4649]を入れたい、だけど、4649以外にも入れることがあるかもしれない・・・

    そんな時に使えますよね。

    [python title=”Python”]x = 4649
    y = “http://hitoripython.wpblog.jp/archive/%s”“`

    文字列 の中に%sを入れちゃいます。
    そのまま文字列 として認識されてしまいますが、入れちゃいます。

    そのあと、これを入力します。

    [python title=”Python”]url = (y % x)
    “`

    すると、
    url = http://hitoripython.wpblog.jp/archive/4649
    が定義づけられます。
    print() で確認してみましょう。

    [python title=”Python”]x = 4649
    y = “http://hitoripython.wpblog.jp/archive/%s”
    url = (y % x)
    print(url)“`

    (y % x)という部分がポイントになりますね。
    これは、yの%sの部分にxを挿入するという意味になります。

    練習問題

    xにライバルの名前を記入させ、
    [python title=”実行結果”]そうじゃった、あの子は[記入した名前]という名前じゃったな。“`
    という文を出力させるプログラムを書きなさい。

    解答

    [python title=”Python”]x = input(“ライバルの名前を記入してください:”)
    y = “そうじゃった、あの子は%sという名前じゃったな。”
    name = (y % x)
    print(name)“`
    [python title=”実行結果”]ライバルの名前を記入してください:レッド
    そうじゃった、あの子はレッドという名前じゃったな。“`