とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

カテゴリ:Python の記事一覧

| |

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

WindowsでPython シリーズ その30


今回はPythonにコマンドライン引数を渡す処理の延長で
右クリック→送る メニューにpythonプログラムを登録する方法を記載します。

pythonを送るメニューに登録する


windowsのファイルを右クリックし、「送る」メニューに任意のファイルを指定ためには、「送る」フォルダにファイルを配置します。
まずは「送る」フォルダを開くためにコマンドを実行します。
Windowsボタン + Rでファイル名を指定してsendtoフォルダを開きます。
shell:sendto

Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

sendtoフォルダにpythonファイルを配置
Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

このpythonファイルには、とりあえず渡された引数を表示するだけのプログラムを書いています。


ファイルを右クリックしてメニューを確認


さっそく、送るメニューに表示されているか確認してみます。
Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

ない・・・

どうやらpythonは送るメニューに表示されないようです。
恐らくwindows側の設定でなんとかなるのかもしれませんが、今回はバッチファイル化してお目当ての挙動にします。

pythonを呼び出すバッチファイルをsendtoフォルダに作成する


バッチファイルであれば「送る」メニューに表示されるので、sendtoフォルダにはバッチファイルを作成し、
そのバッチファイルからpythonを呼び出します。

pythonのコード


バッチファイルのコード

バッチファイルは、引数 %1 が自分のパスで、%* とすると、第1引数以降の引数を全部取得できます。
E:\work\main.py %*
と書くことで、pythonにバッチファイルに渡された引数全部を送りつけます。

念のため、右クリックメニューに表示されるか見てみます。
Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

ちゃんと送るメニューに表示されました。

メニューから送られる引数の正体


ファイルを右クリックして、「送る」メニューを選択すると、右クリックしたファイルのフルパスが引数として渡されます。
では、ファイルを3つほど選択して、送ってみましょう。
Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

今回は、ファイルを3つ選択しています。
それぞれ 01.txt、02.txt、03.txt を選んで、python.batに送ってみた結果はこちら。

Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

引数が4つechoされました。期待通りの結果です。

['E:\\work\\main.py', 'E:\\work\\01.txt', 'E:\\work\\02.txt', 'E:\\work\\03.txt']

3ファイル渡したのに4ファイル表示されているのは、pythonプログラムであるmain.pyの処理が、
pythonプログラム自身のフルパスを表示しているからです。

送られたファイルに対する処理


さて、送ることでファイルのフルパスを引数に指定することができました。
これさえできれば、後は渡されたファイルパスを圧縮したり、中身を読んだり・・・
windowsと連携して色々できそうですね。
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

Pythonでコマンラインド引数を扱う

WindowsでPython シリーズ その29


とうとうPythonでコマンドライン引数を扱う時が来た!
これはもうレベル的にPythonをバッチファイルと同じ感覚で利用できる日が近いことを意味しますね!

Pythonでコマンドライン引数の扱い方


このシリーズは、そもそもPythonを使ってWindowsアプリを作りたいという想いから始まっています。
今回、ようやくPythonにWindows側からコマンドライン引数を渡して処理する方法を学びます。

Pythonにおいて、コマンドライン引数を扱う場合は
sys.argv を使います。

sysオブジェクトを使うには、
import sys をファイル冒頭に宣言する必要があります。

それでは早速sys.argv を使って引数を扱ってみましょう。


まずは至ってシンプルなコード。
コマンドライン引数をただprintするだけのコードです。

実行してみます。
Pythonでコマンド引数を扱う

引数が表示ささました。
[]でくくられています。
Pythonにおいて、コマンドライン引数はリストとして扱われるようです。

引数の内容を見てみましょう。

まずコマンドラインで指定したのは 1,2,3,4なのに、'E:\\work\\main.py' と表示されています。
これは実行したファイルのフルパスですが、Windows環境におけるPythonの引数0は実行パスが入っているということですね。

引数を処理するコード


Pythonでコマンドライン引数を受け取るプログラムを作るにあたって、
渡された引数をぶん回す処理を書いてみます。


これは、引数をとりあえずintに変換させて、表示するプログラムです。
intに変換出来ない場合は例外としてキャッチし、そのままcontinueしてエラーの内容を表示して、ループを継続させています。

実行結果はこちら
Pythonでコマンド引数を扱う

引数に1 2 3 a 4と渡しています。
数値ではない引数0番目の実行パスと「a」はエラーになるはず。

思いの通り表示されています。

プログラムコードの8行目
print("index:{0} value:{1} エラー発生:{2}".\
としているところ、これは本来であれば
print("index:{0} value:{1} エラー発生:{2}".format(i, v, str(type(err))))
と書きたいのですが、1行が長くなりすぎるので、次の行もプログラムの続きですよという「\」を付けて次の行に改行させています。
こうすることで、1行のプログラムを次の行に続けることができます。
見栄えの問題です。
C#で例えると「_」に該当します。

Pythonでコマンドライン引数を扱えるようになったら・・・


さて、今回の勉強でコマンドライン引数を扱う事ができるようになりました。

これで何ができるんか?っていうと、例えばファイルのパスを引き渡して、それを圧縮するなり、
加工するなり、動的にコネコネすることができるんですよ。
これってもうバッチファイルと同じ程度には何かできそうな予感がしませんか?

私はします。
夢が広がりますよね!

ファイルを右クリックして、「送る」フォルダにPythonプログラムを指定して、Pythonでファイルを圧縮する・・・
なんてこともできるかも。
できるでしょ。

テーマ:プログラミング - ジャンル:コンピュータ

Python ファイルを1行ずつ読んで改行を消す

WindowsでPython シリーズ その28



今回はファイルを1行ずつ読む方法です。
前回までのファイルの読み方は、
ファイルの中身を一気に変数に取り込む方法でした。
#2.テキストを読む
s1 = f.read()
read()関数は、ファイルの中身を一気に変数に格納します。

ファイルの中身が膨大な時、これでは都合が悪い時があります。
メモリ不足に陥るのですね。

ファイルを1行ずつ読む


ファイルを1行ずつ読むことでメモリ不足に対処します。
ここでいう1行とは、改行コードまでです。
WindowsでいうとCRLFつまり\r\nまでなので、バイナリデータを読む場合には適用できませんが、
それでも何らかのテキストファイルを処理する時には大いに役立つはずです。

enumerateを使う


ファイルを1行ずつ読む方法は、enumerateにopenしたファイルオブジェクトを指定します。
このあたりは、リストとかタプルでやりました。
要するに、「行番号:1行の文字列」を返してくれます。

コードを書いてみます。


読み込むテキストファイルはこんなの
AAAAA
BBBBB
CCCCC
DDDDD
NGEEE
FFFFF


※FFFFFの後ろにも改行があります。

実行結果

Python ファイルを1行ずつ読んで改行を消す

なんかいやな改行が出てますね。
テキストファイルに改行が含まれているので、それがそのまま出力されているようです。

改行を消して出力する


改行なしで出力したいので、改行コードを消して表示させます。
ついでに"NG"と記載のある行は表示しないようにさせます。


実行結果
Python ファイルを1行ずつ読んで改行を消す

ちょうどNGから始まる行は除外されて表示されました。
そして改行も消えてますね。

キモはlineをスライスしている[:-1]です。
その7(スライスってなんぞ)で説明した画像を見てください。
WindowsでPython その7(スライスってなんぞ)
-1は、「末尾から一つ手前の場所まで」ということなので、改行を覗いて表示されています。
注意点は、末尾に改行がなかった場合はFFFFFがFFFFとなって表示されてしまうことです。

そうしないためには、replaceで改行を除去する方法が良いかと思いますが、
ちょっとPythonらしく書くためにあえてスライスを使ってみました。

おまけ


コードにfind関数を使っています。
これは指定した文字列のIndexを返す関数なので、
line.find("NG") == -1:
で"NG"が見つからなければprintするということになっています。

1行ずつ読むことで、ファイルの中身を判断しながら、何かゴニョゴニョできそうですね。
将来的にはS-JISを他の文字コードに変換するようなプログラムを組みたいと思ってますので、今回はその布石でした。

それでは!

Python withを使ったファイルの読み書き(お作法)

WindowsでPython シリーズ その27


前回はファイル操作の基本的な記述を書きましたが、
今回はより実践的な、というよりも必須の記述を学びます。

前回のコード


前回は以下のようなコードでした。


この書き方は、確かにお目当ての動作はするのですが、実践ではこんな書き方をしてはいけません。

ファイルを安全に必ず閉じる記述が必要


全てのプログラム言語において、プログラムの動作とは別の何かを操作する場合、
必ずその別の何かを安全に開放する処理を記載する必要があります。

例えばファイル、データベース、OSそのもの、など。
Python言語だけで完結しない(Pythonからすれば)外部のモノを操作する時に
Pythonが外部のモノを壊したりしないように考慮する必要があります。

「借りたものは大切に扱う」

そんな感じですね。

ファイルが必ず閉じるようにする記載


前回のプログラムを書き換えます。

try .. finally でやった、途中で、例えば何かプログラムに不具合があっても、必ずファイルがクローズされる finally を書きます。



実行結果
Python ファイルの読み書きのお作法

実行結果は特に差はありませんが、
もし、ファイルの書き込み中にエラーが発生しても、必ず f.close() が呼び出されるようになります。

更に実践的なwith句でスコープ管理


さらにプログラムを書き換えます。



ファイルを操作する時は、この書き方が基本だと認識しておいてください。

書き方の例はこの当たりを参照

先ほどと違って、try ~ finally がなく、更に f.close() がありません。
それでも、withのブロックが終わる時にファイルが閉じられます。

なぜか?

with句 を使えば、自動的必ずf.close() が呼ばれる事が保証されているからです。

Pythonというプログラム言語の実装は、PEP 343 というコーディング規約を規範にしています。

これによると、外部のナニかを操作する時は、try ~ finally を実装し、
with句によって、finally が呼ばれることを保証するというコーディングが推奨されており、Pythonはそれに準拠しているからですね。

withの最後で何が呼ばれるかをどうやって定義しているの?


ここで気になることがあります。
withを指定すれば、最後にclose()が呼ばれるということは分かった。

だけど、例えば自分で同じような処理を実装する時に
どうやって finally (つまりwithブロックの終わりに) でclose() が呼ばれることを保証する定義をするの?

というのが次の疑問です。

うん、正直、まだ調べてないんだ!
C# で言うところの、IDisposeインターフェース的な定義があるんだろうと思ってます。
これはまたの機会に!

今回はファイル操作を行う時はwithを使う。それだけを記憶の片隅に置いておきます!

テーマ:プログラミング - ジャンル:コンピュータ

Python ファイルの読み書きを行う

WindowsでPython シリーズ その26


今回はサラッとファイルの読み書きの基礎をまとめます。

ファイルの読み書きの手順


どのプログラム言語であれ、ファイルの読み書きの基礎は決まっています。

  1. ファイルを開く
  2. ファイルを読み書きする
  3. ファイルを閉じる

です。

これをPythonの命令後に置き換えると・・・

  1. ファイルを開く → open()
  2. ファイルを読み書きする → read() / write()
  3. ファイルを閉じる → close()

となります。
自分でマウスで開いてファイルの中身を見る時も同じですね。

手順通りにPythonコードを書く


とりあえず、Pythonコード(main.py)と読むためのテキストファイル(sample.txt)を用意しました。
Python ファイルの読み書きを行う


sample.txt の中身はこんな感じです。
「月が綺麗ですね。」
「は?」
「・・・・・」
ファイルはメモ帳で作ったので、S-JISのエンコードです。

作ったテキストファイルの中身を読んで、文末に追記したいと思います。
例によらず、マニュアルに沿って構文を確認
ファイルを開く方法はopen 関数を使うとあり、その引数を確認。
'r+' はファイルを読み書き両用に開きます。
とのことなので、このようなコードを書く。



実行結果
Python ファイルの読み書きを行う

sample.txt の中身もきちんと書き換わってますね。
Python ファイルの読み書きを行う

簡単に解説


とてもシンプルなので解説は不要かもしれませんが念のため
open()関数

open()関数にファイル名、オープンモード、文字のエンコードを指定しています。
今回は"s-jis"エンコードのファイルを開くので"sjis"を指定、そして、読み書きをしたいので引数を名前指定でmode="r+"としています。
この指定により、読み書きを行うモードでファイルを開くことになります。

read()とかwrite()とか

read で中身を読み込み、writeで末尾に指定した文字列を書いています。
ここで、"\n"としているのはなぜか・・・windowsユーザーなら"\r\n"としたいところですが、
こうすると、改行が余計に入って表示されました・・理由は謎です。いつか解明したい(誰かコメント下さい!

seek()関数

seek は、ファイルを読み込んだ場所を表します。
一旦readでファイルの最後まで読んで、文字を追記したので、読んだ場所はファイルの最後の位置にいます。
マウスカーソルで例えると、ファイルの最後にカーソルがある状態です。
readは、カーソルの位置から後ろを読み込むので、readした後にさらにreadしてもファイルの内容を読み込むことができません。
(ファイルを読むためのマウスカーソルが一番末尾にあるので、それ以降を読んでも意味がないと思ってください。)
よって、seek(0)の命令で、カーソル位置を一番最初に戻しています。

ファイルは閉じよう


最後に f.close() としているのは、きちんとファイルを閉じるという操作が必要だからです。
これを忘れると、ファイルが開きっぱなしになりますので注意してください。

今日はファイル操作の基礎中の基礎をやりましたが、プログラマとしては不十分です。
次回はきっちりとファイルを操作するお作法を勉強したいと思います。

テーマ:プログラミング - ジャンル:コンピュータ

Python PyPiでパッケージを探してインストールする

WindowsでPython シリーズ その25


とうとうここまできました。Pythonでのパッケージ利用。
Pythonの魅力の一つ、様々なパッケージが有志の方々によって多く公開されていることですね。
(他の言語にも、もちろんありますよ)

パッケージとは


Pythonでいうパッケージとは、複数のモジュールの「かたまり」のことです。
例えば「暗号化ファイルを作りたい」とか「色んな種類の圧縮ファイル作りたい」とか。
汎用的なやりたい事の殆どは、自分で組まずにパッケージを探して作るというスタイルでコーディングすることで解決できます。

Pythonのパッケージ一覧サイト


どんなパッケージがあるか?
ここ(https://pypi.python.org/pypi)で探します。
正直、パッケージを探し当ててもインストールするための構文が分からないとイライラするので、英文を読みふける必要がありそうです。
とか言ってても始まらないので、日本語のコチラの本を買い、進めていくことにしました。
内容的には、初心者が読むには十分な感じです。



パッケージ管理ツールPIP


Python3(2にもあるよ)には、PIPというパッケージ管理ツールが標準でインストールされています。
このPIPというツールを使って、パッケージをインストールしたりアンインストールしたりします。
パッケージをインストールすると、import 文を使ってそのパッケージを呼び出すことができるのですが、
バージョンによって書き方が異なるようです。

とりあえず、このブログを書く時にPythonをインストールしたのですが、PIPのバージョンが古いかもしれないので
バージョンアップコマンドを実行します。

コマンドは以下の通り
python -m pip install -U pip

Python PyPiでパッケージを探して利用する

うん。。。どうやら最新ぽいのかな?

QRコードを作るパッケージをインストールしてみる


QRコードを作成するパッケージを入れてみる。
これは、先程紹介した本に記載されているパッケージです。
QRコード作成のために、画像処理ライブラリである pillow というのもインストールする必要があるので合わせてインストールしてみます。
が、、、Windows環境では本の通り記載してもNGでした。

どうもpip に対して、構文が間違っている的なエラーがでましたので、Windowsで通用する書き方でやってみます。

PIPに対してインストール要求


流したコマンドがコチラ
python -m pip install pillow crcode


結果がこちら
Python PyPiでパッケージを探して利用する

どうやら、pillow のインストールはうまくいったけど、qrcodeの方はバージョンがどうとか言われました。
qrcode 5.3
パッケージを探してみたら、5.3 が最新らしい。
pipに対してどうやって指定したらいいかわからんので、次のコマンドを流してみます。
python -m pip install "qrcode 5.3" crcode


ものすごい怒られた
Python PyPiでパッケージを探して利用する

よく分からんので、単品でインストール要求をしてみた。
python -m pip install "qrcode"


いけ・・・たのか??
Python PyPiでパッケージを探して利用する

パッケージがインストールされるフォルダの前後を比較してみた。
パッケージがインストールされる場所、デフォルトでいじってなければここにあるそうです。
C:\Users\(ユーザー名)\AppData\Local\Programs\Python\Python36-32\Lib\site-packages

で、コマンド実行前と後で比較してみます。

インストール前
Python PyPiでパッケージを探して利用する

インストール後
Python PyPiでパッケージを探して利用する

うん、、、なんとなくいけてるぽい。。。
この当たりは申し訳ないですが、後々詳しく調べて記事にしたいと思います。

今日はパッケージをインストールして利用するのがゴール!

QRコードを作るパッケージの呼び出し


さて、pipによってパッケージがインストールされているならば、
いつものようにimport して qr作成コマンドを呼び出せば
パッケージに入っているqrコード作成モジュールが動くはず!

このブログのURLをQR作成コードにするプログラムコード


これで動くはずなんだが・・・

結果的には。。。エラーの画像を取得し忘れましたが、めっさエラーが出ました。

すぐ消したので忘れて申し訳ないですが
Image というオブジェクトが無いとか・・・

これはきっと pillow のインストールが正しくできてないんだと予想。
で、もう一度pillowのインストールを実行
python -m pip install pillow


さっきと結果が違う。。。もうわかんね。後で調査することが増えていやだなぁ。。
Python PyPiでパッケージを探して利用する

なんか、新しくなったぽい?
もう一度QR作成コードを呼び出してみる。

エラーは出てないし、ファイルも作られている!!!!!!
Python PyPiでパッケージを探して利用する
Python PyPiでパッケージを探して利用する

QRコードもできてる~!
Python PyPiでパッケージを探して利用する

はい、、、というわけで這々の体で本に書かれてることが実行できました。

反省点


・記事や本を読んでも、あくまでも「その時点」の情報であり、情報は刻一刻と新しくなっている
・「一気にまとめてやる」系の事は、実際に自分でやる場合はばらして実行する方が良い
・本の通りいかなくても焦らずに、一つ一つ振り返ってみる
・英語は頑張って読む

こんな感じでしょうか。
それにしてもパッケージインストールにここまで手こずるとは・・・

テーマ:プログラミング - ジャンル:コンピュータ

Pythonで日付型を扱う

WindowsでPython シリーズ その24


Pythonの日付型、datetime型はモジュールとして定義されています。
利用する時は、import datetime を指定します。

日付型の利用宣言


日付型のマニュアルに沿って、早速コードを書いてみます。


実行結果
Pythonで日付型を扱う

d.datetime.now()
2017-07-07 01:28:26.004739
となります。

日本人としてはあまり馴染みのある表示ではないので、これを書式指定して表示します。

t.strftime("%Y年%m月%d日(%a) %H時%M分%S秒")
2017年07月07日(Fri) 01時32分29秒
となります。

書式指定の方法は 8.1.8. strftime() と strptime() の振る舞い を参考にしています。

strftimeは、文字列のformatのようなもので、書式を %● とすることでお目当ての値を文字列として表示できます。

%●に何が利用できるかの詳細はマニュアルに全て記載されていますが、よく利用する書式指定については
最低でも次のものを覚えておけばよいでしょう。

書式意味
%Y西暦(4桁)
%m月(2桁)
%d日にち(2桁)
%H24時間表記で時(2桁)
%M分(2桁)
%S秒(2桁)
%w曜日を表す数字(0:日曜日、1:月曜日…)
%a曜日名の短縮形
%%文字列の'%'を表示する


%mだけは中尉ですね。 %mで月、%Mで分になります。

Pythonで親階層に存在するモジュールのimport

WindowsでPython シリーズ その23


今回は親のディレクトリにあるmodule呼び出しを行います。
フォルダ構造は以下のように配置し、 call_parent.py ファイルから、parent.py で定義されたモジュールを呼び出します。
E:.
│ parent.py

└─child
call_parent.py


Pythonでは、最初に実行したファイルがルートディレクトリになる


Pythonでimportをする場合、パスが通って無くてはなりません。
実行しているモジュールより下の階層に存在する場合は前回やりましたが、自身より上位ディレクトリに存在するモジュールを呼び出す場合はパスを通す必要があります。

Pythonマニュアルの
sys.path
を参考にコードを書いてみます。

まずは親のコードから


んで、親のコードより下の階層にある child/call_parent.py


sys.path.append('../') #←ここが大事

このコマンドが全てですが、
この状態で、子供のモジュールを実行します。
sys.path に相対パスを指定し、自分より親ディレクトリをimportの検索パスに指定しているわけです。

実行結果がこちら。

Pythonで親階層に存在するモジュールのimport

sys.path.append('../') をコメントアウトするとこうなります。

Pythonで親階層に存在するモジュールのimport

Pythonでは、実行ファイルがルートディレクトリとして扱われる


Pythonを始めて実行したファイルがルートディレクトリになるという決まりがあるので
できれば最も上位のディレクトリにmain.pyを作成して、必要に応じて必要なファイルをimportするのがよさそうです。

いろんなブログを見ていると、Pythonのimportは何かとトラブルの元になるようですので
ファイルを分ける際にはパスの参照を意識して書いていきましょう。

Python 実践的なimportの書き方

WindowsでPython シリーズ その22



Python モジュール定義の基礎の基礎でimport処理の基礎をやったけど、多分実践では使えない。

というわけで、今日はモジュールのimport処理についてまとめます。

別ディレクトリのimport方法


main.py を作って、そこから子ディレクトリのモジュールを呼び出します。
階層は以下の通り。
main.py

└─【util】
   │ custom_print.py
   │
   └─【calc】
        math.py

【】でくくられているのがディレクトリです。
main.pyから、utilのcustom_print.pyと、さらに子改装にあるmath.pyを呼び出します。

それぞれのファイルは以下の通り
math.py


custom_print.py


main.py


実行結果
Python 別ディレクトリのimport方法
解説
import キーワードで別階層のモジュールを呼び出したい場合は「.」(ドット)で区切ります。
さらに子階層の場合は同じように「.」(ドット)をつなぎます。
importしたモジュールを呼び出したい場合も同じようにimportした名前をドットでつなぎます。
うん。使いにくい。

実際に使えるimport宣言


importの書き方を試してみたけど、いちいち
util.custom_print.write_line(util.calc.math.add(1,2))
なんて書いてられない。
長すぎる。

というわけで、Pythonにはimport宣言方法が色々あるんだけれども
コレだなという書き方をメモしておきます。

import処理の書き方


実行結果
Python 使えるimportの書き方

多分この2つの書き方が一番いい。
解説
2つの書き方をしたので解説します。
from (モジュール名『ファイル名』) import (関数名) as (別名)

from util.custom_print import write_line as printline


このように書くと、特定のファイルから、どの関数を、こんな名前で呼び出す宣言ができる。
対して

import (モジュール名『ファイル名』) as (別名)

import util.calc.math as math

と書くと、特定のファイルを別名で呼び出すことができるという指定になる。

前者の方は、モジュールの中の特定の関数を宣言する。
後者の方は、モジュールをのものを別名で宣言する。

という挙動になっている。

モジュール(ファイル名)の位置が、fromの後ろかimportの後ろかで異なっていることは注意したい。

このように定義することで

util.custom_print.write_line モジュールのwrite_lineを printline として呼び出しているし
util.calc.math モジュールをmathの別名で指定し、その中の関数を呼び出すことができる。

まとめてimportする方法


ちなみに、import文はカンマで続けて書くことができる。
import file1, file2, file3
こんな感じ。
個人的には明確に何をimportしているかひと目で分かるようにしたいのでimport文は改行して全部書いた方が良い気がします。

importの大切さ


同じファイルに処理を書きすぎると人間の脳味噌がついていかないから、
それなりの規模のプログラムをする場合にファイルを分ける。
その場合、import無しというのは考えられない。

というわけでこの処理は非常に大切です。

今回はmain.pyが最も上流階層に存在する場合の例を書いたけど、それもそんなわけには行かない場合がありますね。
次回は親階層に存在するモジュールのimportを記載します。
では!

Python モジュール定義の基礎の基礎

WindowsでPython シリーズ その21


前回の例外処理で、一通りPythonのヨチヨチ歩きは終了したと思う。

今回はモジュール定義について記載する。
モジュール定義と呼び出し方には様々あるが、色々使いすぎるとよくないので
今回は基礎中の基礎だけを記載します。
諸々の書き方は次回。

モジュール定義


クラス定義ファイルみたいなもんです。
Pythonではモジュールのまとまりをファイルにして、別ファイルでそれを呼び出すことができます。
まずはモジュール定義

Pythonのラムダ式 sorted関数でタプルや辞書型を並べ替える で作った、printと同時に改行を出力する関数を
print.pyというファイルに作成し保存しました。


この関数は、他のファイルで呼び出すことができます。
importキーワード

キーワードはimport


import文には、ファイル名を記載します。「py」は必要ありません。
importした「print」に対して「.」(ドット)を入力すると、importしたファイルの関数を呼び出すことができます。

Python モジュール定義の基礎の基礎

モジュール定義「print.py」には2つの関数が定義されていて、それをモジュールとして呼び出し
実行している結果が確認できるかと思います。

それにしてもprintというのは、Pythonデフォルトの予約後なので、
できれば他の言葉を使う事をおすすめします。

ではでは。

Pythonの例外処理を知る

WindowsでPython シリーズ その20


Pythonの例外処理について学びます。
Pythonは予期せぬエラーが発生するとそこで処理が止まります。
それでは都合が悪いので、例外処理の定義をしていきます。

もちろん詳しくはマニュアルのエラーと例外を参考に!

例外の基本形




実行結果
Pythonの例外処理を知る

Pythonにおける例外の基本構文は「try: ~ except:」です。
whileで無限ループさせて、正しい入力が合った場合にbreakしてます。
サンプルコードでは3回処理をしました。

1回目は0除算
2回めは値を入れない
3回目でやっと答えを出しています。

これが例外の基本形。
ただ実際にはこんなコードは使えない。

例外の内容や詳細を知る


「try: ~ except:」は例外処理の基本形ですが、例外の内容が分からないし、何が悪いのかサッパリ。
というわけで、実用的なコードは例外処理の内容を知ることから始まります。



実行結果
Pythonの例外処理を知る

解説します。
except Exception as err:

例外を処理する時、except Exception as err: としています。
as err のerr部分は好きに定義できます。
この例では err に例外情報がセットされ、どんな例外タイプなのか、どのような例外内容なのかを知ることができます。

例外のelse: 句

try: 句のbreakを削除し、else:に breakと書いています。
else:は、try:で例外が発生しなかった時のみに実行されます。
よって、このコードでは例外が発生しない入力があった場合のみ、ループ処理を抜けるようにしています。

esle;句は正直いらないかもしれない。
だってtry:の最後に処理を書けば、実質例外が起こっていない証拠だから。

例外のfinally: 句

finally: は、例外があろうが無かろうが必ず実行されます。
よくある構文です。

実行結果の通り

1回目は0除算   → 0除算例外で再入力を促す
2回めは値を入れない → タイプ相違例外で再入力を促す
3回目でやっと答え

となってますね。

例外の種類ごとに処理を変える


例外機構のあるプログラム言語なので、当然ながら例外の種類によって後続の処理を変えることができます。
次の例では、発生した例外タイプ毎に処理を分けています。



実行結果
Pythonの例外処理を知る

例外の種類はコチラの組み込み例外を参考にしています。

捕まえている例外は以下の3通り。
ZeroDivisionError
ValueError
Exception

Exceptionだけは、全ての例外の基底のため、何があっても例外を補足します。
この例ではArithmeticErrorとなっています。

強制的に例外を発生させる raise キーワード

このコードで注目するべきは例外を発生させている
raise ArithmeticError("\r\n2はダメ\r\n")
です。
入力値「2」の場合、強制的に例外を発生させるコードを書いています。

またraiseキーワードで発生させる例外に引数を与えており、
引数で与えられた例外メッセージが、補足部分で出力されています。

例外処理のマスターは必須


例外処理が最も活躍するのは、PythonがPythonに関係ない何かを操作する時です。

例えばファイルを操作する時とか、インターネットから情報を取ってくる時とか。
ファイルが無かったらエラーになるし、インターネット接続が突然切れてもエラーになります。

そんな時にいちいち処理を止めるのではなく、例外を正しく処理できればより安定したアプリを作ることができます。

例外処理とセットで覚えるキーワードにwithがありますがこれはまた今度で。
Pythonの構文はこの第20回でおしまいです。

あとは実例とともにちょこちょこ紹介していければいいなと考えています。
それでは!

テーマ:プログラミング - ジャンル:コンピュータ

Pythonのイテレーターを理解する

WindowsでPython シリーズ その19


Pythonのイテレーターとジェネレーターについて学んでおきます。
最近のオブジェクト指向言語であればだいたい備えてる機能。

イテレーターは知らず知らずのうちに使ってるけど、ジェネレーターを自分で実装することなんて・・・殆どない。
それに説明を読んでもサッパリわからん。
安心してください!
演算子(オペレーター)のオーバーロードぐらい、意識して使うことは殆どありません。

※ブログ主は、C#言語で誰ぞが自己満足か技術確認のために組んだであろう
クラスのオペレーターのオーバーロード及び意味のないジェネレーターが多数宣言されたコードを泣きながらメンテナンスしたことがあります。
その時に習得したC#言語での知識を元に本記事を記載しています。
Python使いの方が本エントリを読んで誤ったであると判断した場合は、コメント欄でご指摘いただければ幸いです。



なので、とりあえずこの回はこんなもんなんだなという程度で流します。

イテレーターとは


繰り返し処理の元データとして利用できるデータの塊のこと。
代表例はリスト型
strs = ["とまと","りんご","みかん"]
for s in strs:
print(s)
--------------
結果
とまと
りんご
みかん
こんな感じで、for ~~ in の後ろに指定できるものです。

このイテレーターの説明を古いプログラミング言語に当てはめるとフェッチというものに代用できます。
要するに、「連続したデータを順番に送り出すよ。なくなったらエラーになるよ」という概念です。

元になる概念がある以上、その概念を具現化できる命令も存在します。
それが
iter()

イテレーターはオブジェクトです。
iter()はイテレーターのオブジェクトを返します。
んで、その返ってきたオブジェクトを next()によってフェッチできます。

ではコードを。


実行結果
Pythonのイテレーターを理解する

iter()によって取り出したイテレーターオブジェクトを変数に代入し、
next()によって一つ一つ取り出しています。
これはfor文が内部的に行っている挙動です。
4回目のnext()でStopIteration 例外が返ってきてます。
リストが3つしかないので、4回目でエラーが出ているわけですね。

ジェネレーターとは


ジェネレーターはイテレーターを自分で実装する時に使う概念です。
マニュアルを見てもサッパリですね。
この辺の概念って、始めてプログラム学ぶ人にとってどうやって説明すればいいんでしょうね。ほんと吐きそう。

とにもかくにも、キーワードはyield です。

yieldとは

自分で作った関数を for 文で使いたいな。
そんな風に思った時に使います。
巨大なパッケージソフトを作ってて、独自に作ったフレームワークを利用した方が効率的だと判断された時ぐらいにしか使います。
よって、基本的には使いません。
既に実装されている機能で殆ど代用できます。

文句言ってても仕方ないので書いてみます。


実行結果
Pythonのイテレーターを理解する

最初に、関数を定義しています。
この関数は、3で割り切れる数の場合、yieldと書いています。
関数はreturn で返すのが通例ですが、yieldは、処理結果の全てを保持します。
具体的には、3の倍数だからreturnしても、その続きから処理が繰り返し行われる感じです。

戻り値はイテレーターオブジェクトとなり、iter()で取得できるようになります。
その結果for文のデータ元として利用できるようになり、実行結果は見ての通り、指定した引数に対して3で割り切れる値のみを返すようになります。

ジェネレーターをもっと分かりやすく


yieldがわかりにくい?

yieldはその場所で処理が中断されて、また再開する。
そんな感じで覚えてもOK。



実行結果
Pythonのイテレーターを理解する

適当にyieldばっかり書いてる関数を使って呼び出してみました。
yield 1
yield 2 ... と結果が返ってきています。

正直いってこんなの使わないので、「へ~」ぐらいで覚えておけばいいです。

が、、、自分で実装をしないだけで、コーディング中にfor を使う場合は必ずイテレーターという概念が裏で動いています。
それだけは意識しておけば、プログラムを組むことがさらに楽しくなると思います。

ではでは、このエントリが日の目を見ることを祈って。
楽しきPythonライフを!

Pythonのラムダ式 sorted関数でタプルや辞書型を並べ替える

WindowsでPython シリーズ その18


前回に引き続きラムダ式をやっていきます。
最近の言語における無名関数の書き方と理解はほぼ必須と言っていいんか無いだろうか。

ラムダ式を3回も取り上げてるのは、pythonを触ってみてこの構文は大事だと思ったからです。
ぜひ書き方をマスターするべし。

sorted関数


sortedはリストを並べ替える関数です。
例えばこんなコード


実行結果
Pythonのラムダ式 sorted関数でタプルや辞書型を並べ替える

鬼シンプルですね。

最も簡単な使い方をすると、指定した引数を昇順に並べ替えます。

並べ替えることが多いのは、リストやタプルや辞書型


さて実際のコーディングで必要となってくるのはリストもそうですが
タプルとか辞書型だと思います。
要するに、「なんかデータの集まりを並べ替えたい。」
そんな時ですね。

というわけで備忘録として色々とコードを書いてみます。


実行結果
Pythonのラムダ式 sorted関数でタプルや辞書型を並べ替える

これまでの集大成


順番に見ていきます。

関数定義

まずは、テストの出力を楽にするために、defを使ってprint文を改造した関数を定義しています。

シンプルなリストの並べ替え

sorted関数のおさらい。リストが昇順に並んでます。

タプルの並べ替え

このあたりからラムダ式の登場です。
sorted関数の細かな説明はマニュアルを見るのが一番いいです。
このエントリでは、最も単純な使い方を記載しています。

まずはテストコードとして、タプルのややこしいを宣言します。
タプルというのは、融通の聞かないリストのことでした。
んで、そのタプルのリストを宣言しています。
fruits = [
("とまとM", 30)
,("とまとL", 50)
,("りんご", 100)
,("オレンジ",40)
]
こんな感じです。
このタプルのリストは、フルーツの種類と金額を羅列したリストを表してます。
これを、金額が高い順に並び替えます。

printLine(sorted(fruits
,key = lambda fruit : fruit[1]
,reverse = True))
こう。
key 引数を見ると、ラムダ式を記載しています。この表現はもうお決まりとして覚えておくほうがよさそう。

sorted関数の第一引数にリストを、第二引数にリストの中のタプルのどのキーかを指定しています。
[1]と書いてるので、[0]:フルーツの種類 [1]:金額 このような指定ですね。

実行結果は見ての通りです。

辞書型(dict)の並べ替え

次に辞書型の並べ替えを見てみます。
fruitsDict = {
"4.とまとM" : 30
,"2.とまとL" : 50
,"1.りんご" : 100
,"3.オレンジ" : 40
}

で、辞書型の宣言。
後のテストコードを分かりやすくするために、フルーツの種類に数字を打ってます。

辞書型に対して、辞書型.items()とすると、タプルを返します。
具体的には 
fruitsDict.items()
を見てください。

で、結果は記載の通り。
sortedのkeyには、"リストの何"を指定するためにラムダ式を指定するというのはお決まりで、
「考えるな感じるんだ!」の精神でひたすら身につけましょう。

おまけとして、sortedのkeyに何も指定しない場合のコードも書いてみました。
結果としては
key = lambda fruit : fruit[0]
と指定したのと同じような結果になります。
デフォルトでタプルの0番目を選択するようです。

とにかくラムダの書き方は慣れよう


今日はこれにて終わり。

ラムダ式は書けるととても便利。
でも書けなかったり読めなかったりすると、非常にストレスになります。
とにかく書いて慣れましょう。

言語仕様を理解するなら、Iteratorとかのキーワードで言語を理解すればいいんだけど、
まずはそんなもんなんかなと覚えるほうが上達への近道です。

頑張りましょう!

Pythonのラムダ式はfunctionで光る

WindowsでPython シリーズ その17


前回ラムダ式をやってみたけど、C#におけるLINQみたいに扱うことができるのが真骨頂だった。
これってどっちが真似してるんでしょうね。

map関数


pythonのマニュアルを見て、functionという言葉が出てきたら
「ラムダ式だ!」と考えるクセをつけておくのがいいかもしれない。
map関数の説明を見てみる。

function を、結果を返しながら iterable の全ての要素に適用するイテレータを返します。
なんのこっちゃ。
C#プログラマなら分かるかもしれない。これはLINQにおけるSelect()なのだと。
function って関数のことだから、無名関数であれ定義された関数であれ、
要するに関数ポインタを引数として渡すことができるんだよね。

要約すると、
map関数の第1引数には"関数(引数付き)"を指定してね。
第2引数で指定したリストの全部を、第一引数の関数に放り込んだ結果のオブジェクト(の場所?)を返却するよ。
こういうことなんでしょう。
戻り値はアドレスなので、それを適切に変換してやる。
つまりリストにキャストすると、人間にはその値が確認できます。

コードはこんな感じ。


結果
PythonMAP関数でラムダ式を使う

戻り値をlistに変換してるのがそれです。
コレをキャストしない場合は・・・何やらオブジェクトのアドレスが出てますね。

filter関数


filter関数はC#:LINQのwhereみたいなもんですね。
説明は以下
iterable の要素のうち function が真を返すものでイテレータを構築します。
つまり、リストとか辞書とか、タプルもいけるんかな?とにかくforで繰り返し項目にしていできるもんのうち
第一引数で指定した関数の結果のみを返却するよ!ってことですね。

例えば100以上とか。そういうのがfilterです。

コードとしては以下

先程map関数で第一引数の関数結果を返却したけど、今度は関数結果がtrueになるものだけを抽出するリストを返す。
そんな関数です。

結果
Pythonのfilter関数でラムダ式を使う

map関数の場合は関数の実行結果がみてとれます。
対してret3は、ラムダ式で指定した値に合致する値がリストとして取れてますね。

これはすごいぞ!

さいごに


ラムダ式はC#のLINQに似ている。
多分ラムダを使いこなすとすごいエレガントなコードになるんだろうな。
今は無理だけど基本構造を覚えていって立派なpythonerになりたいですね。

pythonにおけるラムダ式の書き方

WindowsでPython シリーズ その16


pythonではlambdaキーワードを使うと、ラムダ式が使えるようです。
数年前に流行りだした(?)ラムダ式。
C#プログラマには朗報なのかも。

そもそもラムダ式ってなんだよ


ラムダ式は、無名関数を簡単に定義できる構文です。
ラムダ式の前に、まずは関数を変数に代入できることを理解する必要があります。

こんな感じ。


実行結果
pythonにおけるラムダ式の書き方

変数定義を冒頭でしていますが、その変数を引数なしで変数に代入しています。
その後、変数に引数を与えて呼び出すと、関数のように振る舞ってますね。
これが前提

ラムダ式の書き方


先の例では、sum_num 関数を定義して、それを変数に代入していました。
でも、こんな処理がショボい関数をいちいち定義したくない。

そんな理由で、プログラム中にチョロチョロっと処理をまとめたい時に登場するのが
無名関数「lambda式」の登場です。
先と同じ処理をラムダ式を使って書いてみます。


実行結果
pythonにおけるラムダ式の書き方

はい、関数定義するよりもスッキリ書くことができました。
ただ、多用すると関数定義よりもコードが読みにくくなります。
同じような処理のラムダをたくさん書くのであれば、素直に関数定義したほうがよいでしょう。
あくまでも無名関数:ラムダは構文を簡単にしたもの(シンタックスシュガー)なのでコーディング時はセンスが求められますね。

ラムダ式の書き方まとめ


  • ラムダ式は lambda キーワードを使う

  • return は書かない

  • ()も書かない

  • "ラムダ"と読んでるけど、bがいりますからね。"lambda"です。

    いやぁ、、、それにしてもこの言語どうなってんだろ。便利な機能多すぎですね。

    pythonのglobal変数の挙動確認

    WindowsでPython シリーズ その15



    本日はPythonにおけるglobal変数について挙動確認しました。

    グローバル変数の書き方


    変数については過去のエントリで多少かいてますが、
    pythonでもグローバル変数が存在します。

    関数の中以外で宣言すればそれはグローバルになるわけですが
    pythonではglobalキーワードを使えば、それがglobal変数として認識されるようです。



    実行結果
    pythonのglobal変数の挙動確認

    まず、glovar = "グローバルだよ"で、グローバル変数として指定しています。
    この変数はプログラムのドコからでも参照できます。

    次に defを使って関数を2つ宣言

    global_change() で、global変数で"あろう"変数に値をセットしています。
    ですがこの関数を呼出後、glovarをprint()しても "グローバルだよ"という結果になります。
    これは、見ての通り、関数の中で宣言したglovarは、
    あくまでも関数の中で宣言した変数に対しての処理という扱いだからですね。
    これをローカル変数といいます。

    同じ名前の変数を宣言して、バグにならないようにしてるということです。

    関数内でglobal変数を操作する


    次にglobal_change2() では、global変数で"あろう"変数に値をセットしています。
    その前に、global glovar と書いて、関数内のglovarはグローバルなのだと指定しています。

    結果として、"ローカルだよ"という出力。
    これは、グローバル変数がローカル変数ではないという事を宣言できた結果ですね。

    pythonでは、グローバル変数はきちんと明示する


    今日はこれでおしまいですが、
    pythonに限らずグローバル変数は意識して使わないと、バグのもとになりますので、
    ローカル変数内で明示的に指定させるプログラムの仕様はいいなと思いました。

    ではでは!



    Python 関数における可変長引数の書き方

    WindowsでPython シリーズ その14


    前回はPython 関数の定義とヘルプの書き方をやりましたが
    関数の書き方をもう少し掘り下げておきます。

    可変長引数とはなにか


    可変長引数というのは、引数の数を変えられるということです。
    可変長引数を指定するには「*args」というように、引数の前に「*」を付けます。
    こんな感じ。


    実行結果
    Python 関数における可変長引数の書き方

    数値を合計する関数を作成してみました。
    ちょっと色気を出して、もし数字以外の文字が指定されたら、数字じゃないよ的なメッセージを表示するようにしています。

    Pythonでは、「*」を付けた引数はタプルとして扱われるようです。
    タプルについては「Pythonのリストとタプルと集合型の違い」を参考ください。

    辞書型の可変長引数


    引数に「*」ではなくて「**」をつけると、引数が辞書型の可変長引数になるみたいです。



    実行結果
    Python 関数における可変長引数の書き方

    ちょっと無理やりコードにしてみたけど、正直使いどころがイマイチわからん・・・いつか役に立つ時が来るかも。

    まとめ


    Pythonでは引数を可変にできる。
    書き方は

    「*」をつけると引数がタプルになる。
    「**」をつけると引数が辞書型になる。

    辞書型の引数の場合は、関数呼出し時に辞書っぽくなるように呼び出す。

    こんな感じかな。

    今日はここまで!ではまた!

    Python 関数の定義とヘルプの書き方

    WindowsでPython シリーズ その13


    とうとう来ました関数定義の巻。
    だんだんプログラミングらしくなってきました。
    関数定義を学習し、冗長的なコードから開放されたいと思います。

    これまでコードの確認にprint()を多様してきました。
    出力結果を見やすくするために無駄にprint()なんて書いてましたけど、関数定義をすることで自動的に改行付きのprint()を実装することができます。

    それではいってみましょう!

    関数定義をする前に


    コーディングを適当にして変なクセが付いてしまうと、後でとても後悔します。
    醜いコードになります。
    なのできちんとコーディング規則に従って関数を定義することに専念します。

    今回参考にするマニュアルはコチラ

  • 4.6. 関数を定義する
  • 4.7.6. ドキュメンテーション文字列
  • 4.8. 間奏曲: コーディングスタイル


  • つまり
    「関数の宣言方法」
    で、書き方を

    「関数の説明(docstring)」
    で、ヘルプ呼び出し時に説明がでるようにして

    「関数の命名規則(コーディング規則」
    で、書くだけじゃなくてキレイに書こう

    ということですね。

    関数定義とdocstring


    docstringとは、その関数の説明書のことです。help(関数名)と書くと表示されます。
    今回はマニュアルにそって関数定義をして、関数の実行とhelpを見てみます。



    実行結果
    Python 関数の定義とヘルプの書き方

    いかがでしょうか。
    printの代わりにprint_and_lineを使うことで、自動改行が行われています。
    さらにdocstringで、helpすればその説明が表示されています。
    書き方は、マニュアルのコーディングスタイルに従って記載しました。
    しかし、完全にルールを守っている訳ではなく、日本語コメントを使ったりしています。(この当たりは日本文化風に・・)

    あと、命名規則には
    self をメソッドの第 1 引数の名前 (クラスやメソッドについては クラス初見 を見よ) として使うこと。
    と書いてるんですが、利用事例を見てるとクラスのメソッドでの利用例がほとんどだったので、関数に関して、第一引数をsとしています。関数でもselfと名付けたほうがいいのかな?
    とまぁ、何より大事なのは一貫性を保つことのようなので、今回はこれでよしとしておきます。

    関数名などは以下に記載のように、lower_case_with_underscores で定義しています。
    インデントには空白 4 つを使い、タブは使わないこと。

    空白 4 つは (深くネストできる) 小さいインデントと (読み易い) 大きいインデントのちょうど中間に当たります。タブは混乱させるので、使わずにおくのが良いです。

    ソースコードの幅が 79 文字を越えないように行を折り返すこと。

    こうすることで小さいディスプレイを使っているユーザも読み易くなり、大きなディスプレイではソースコードファイルを並べることもできるようになります。

    関数やクラスや関数内の大きめのコードブロックの区切りに空行を使うこと。

    可能なら、コメントは行に独立で書くこと。

    docstring を使うこと。

    演算子の前後とコンマの後には空白を入れ、括弧類のすぐ内側には空白を入れないこと: a = f(1, 2) + g(3, 4)。

    クラスや関数に一貫性のある名前を付けること。慣習では CamelCase をクラス名に使い、 lower_case_with_underscores を関数名やメソッド名に使います。常に self をメソッドの第 1 引数の名前 (クラスやメソッドについては クラス初見 を見よ) として使うこと。

    あなたのコードを世界中で使ってもらうつもりなら、風変りなエンコーディングは使わないこと。どんな場合でも、Python のデフォルト UTF-8 またはプレーン ASCII が最も上手くいきます。

    同様に、ほんの少しでも他の言語を話す人がコードを読んだりメンテナンスする可能性があるのであれば、非 ASCII 文字も識別子に使うべきではありません。


    できそうなことが増えてきた


    さて関数を学ぶと、部品を色々つくってゴニョゴニョできそうな気がしてきました。
    そろそろpyファイルをエディタから実行するんじゃなくて、一つのプログラムとして呼び出したいところ・・・
    そんなことできるんかな?

    Pythonの文字列でよく使う関数まとめ

    WindowsでPython シリーズ その12


    Pythonの文字列操作 基礎の基礎の続きです。
    とうとう12回目!というわけでPythonのヨチヨチ歩きもそろそろ終わりたいところ。

    でも文字列を操作したいことは非常に多いので、文字列に対する関数をもう少し触っておきます。
    ここでは多分よく使う操作方法を抜粋して紹介します。

    Pythonの日本語マニュアルを見ると使える関数はめちゃくちゃ多いので
    詳しくは4.7.1. 文字列メソッドを見てくださいね。

    検索と変換、置換


    文字列操作で最も多い文字の検索と置換。
    ではコードを。



    実行結果
    Pythonの文字列でよく使う関数まとめ
    find(文字列)
    実行結果の通りですが、findは文字の位置を探します。

    lower()
    大文字を小文字に変換します。

    upper()
    小文字を大文字に変換します。

    replace(置換したい文字, 置換後の文字, 置換する回数)
    指定した文字をお好みの文字に変換します、第3引数は置換する回数を指定します。

    文字の分割(リストにする)と結合


    文字をぶつ切りにしたり、リストを結合したりしたいとき。あるよね?


    実行結果
    Pythonの文字列でよく使う関数まとめ

    "2017/06/07" を "/" でぶった切ってリストにしてます。
    で、リストを"-"で繋いで出力しています。
    ちなみに"-".join() じゃなくて "".join() とすると、20170607と出ます。

    前後の除去や数値の判断


    文字列が数字だった場合、前後にスペースが入っている場合など、
    本当に数値に変換できるのかとかを判断します。if文とかに使えそうだね。



    実行結果
    Pythonの文字列でよく使う関数まとめ

    では少し解説
    "文字列".strip()
    前後の文字を削除します。

    "文字列".isnumeric()
    その文字列が数値かどうか判断します。
    print(str5.isnumeric())
    だとFalse(違うよ!)って返ってきて
    print(str5.strip().isnumeric())
    だとTrue(数値だよ!)って返ってきてますね。
    これはstrip()で前後のスペースを削除したことによって、数値であると判断された結果ですね。
    (空白があると数値ではないので)

    幅寄せ、フォーマット


    今日一番やりたかったことです。
    文字列操作の幅寄せとかフォーマット、書式指定って本当によく使うんです。
    詳しくは6.1.3.1. 書式指定ミニ言語仕様ここを見ていただくとして、あれこれ使いやすそうなのを書いてみました。



    実行結果
    Pythonの文字列でよく使う関数まとめ

    では解説いきます。

    format()
    こいつはすごい多機能です。
    正直いって、マニュアル見ても全部理解するのはサッパリなのですが、主要機能はもうまる覚えしてしまいましょう。

    基本の書き方

    基本は "文字列{0}|".format(添字に入れる文字) です。
    具体的には print("|{0}|".format(str6)) ですね。
    そのまま"ABC"と出てます。

    んでオプション。

  • < 小なり

  • > 大なり

  • ^ 中央寄せ

  • = 指定桁数まで埋める


  • print("|{0:^20}|".format(str6)) って書いてる部分を見ると
    20桁の幅をとって、その中央にABCを出力しています。

    リストもformatできるよ!
    format(リスト)と書いても文字出力できます。リストは0[0] こんな感じで、リストに対してさらに添字を指定する。
    print(list(str6))
    print("|{0[2]:<10}|{0[1]:^10}|{0[0]:>10}|".format(list(str6)))

    ちょっと複雑になってるけど、それぞれ10桁の幅で左寄せ、中央寄せ、右寄せで出力されています。

    "=" は数値に対してのみ指定できる
    "=" は、指定幅の前に指定した文字を埋める。
    int1 = 123
    print("{0:A=10}".format(int1))
    print("{0:0=10}".format("123"))

    AAAAAAA123
    こんな感じ。だけど文字列にはダメで
    ValueError: '=' alignment not allowed in string format specifier
    の通り、"="は数値型にのみ有効です。
    文字も埋めたいんだけど・・・

    文字列の左詰めはrjustを使おう


    文字列には rjust()、ljust()が用意されているみたいです。


    実行結果
    Pythonの文字列でよく使う関数まとめ

    はい、思った通りの結果ができました。

    文字列の操作は奥が深い


    さて、簡単な操作ばっかりでしたが、とりあえず使う分には申し分ないでしょう。
    あとは文字列を操作していて、なんかもっとスマートに書けないかなと思ったときにマニュアルを読めば大丈夫。

    ではでは今日はおしまい!(今日も1時間半ぐらいかかってしまった・・・)

    テーマ:プログラミング - ジャンル:コンピュータ

    Pythonの文字列操作 基礎の基礎

    WindowsでPython シリーズ その11


    今日は文字列操作をやります。
    どんなプログラム言語を触るにしても絶対必須だから
    第11回にして今更ですね。
    本当は一番最初にやっておくべきことかもしれない。

    とはいえこれまでもサンプルコードでさんざん文字列をprint()してたので、改めてのおさらいです。

    文字列の宣言から出力まで


    これまでやった宣言方法をコードにしてみました。


    実行結果

    Pythonの文字列操作 基礎の基礎

    おさらいになりますが
    s3 = """改行で宣言するけど\
    改行のない文字列"""

    っていう部分は、改行を¥でエスケープしてるので、出力時に改行が無くなります。
    エスケープしないと改行付きで出ます。

    注目するところは、文字列にアスタリスク「*」でかけると、繰り返しの出力になるとこですね。
    これは他の言語では構文エラーになるものが多いと思う。びっくり。

    文字の抽出とスライス


    文字列は、1つの文字の連続です。
    デフォルトで配列やリストみたいになってます。
    つまり・・・文字列 s が "01234" だったとして
    s[0] って書くと、0番目の値を表示できます。

    色々書いてみます。


    結果
    Pythonの文字列操作 基礎の基礎

    「★インデックス指定」と書いてるところが、一般的な文字インデックスを指定した時と同じでかたをしていますが
    Pythonにおいては、どうやら「文字の場所=インデックスの場所」と覚えない方が良さそうな気がします。

    というのはスライスの部分で見て分かる通り、他言語の感覚を持っていると本来であれば
    "8"はインデックス8
    "9"はインデックス9のはずなのですが・・・

    print( s2[8:10] )

    としてようやく「89」と出てます。
    これは、Pythonのスライスにおけるインデックスの場所というのは、文字そのものの場所ではなくて、
    文字の一つ前のポインタ的な場所を指すようなのです。

    具体的に示すと、文字列"ABCDE"であれば以下のピンクぽい文字の部分がPythonでいうところのインデックスぽい。



    この仕様により、10までスライスして、でやっと9が表示されてるわけです。

    ところでC#のとかだと、文字の場所がインデックス位置になります。

    ※他の言語の場合
    A B C D E
    0 1 2 3 4

    ※他の言語の場合

    このPythonのスライスにおける仕様は、ちょっとうーん・・・となっている部分で、
    慣れないとバグを埋め込んでしまいそうです。
    特に文字列のインデックスの概念を、他言語と紐付けて覚える場合は気をつけないといけません。

    ステップやマイナスのインデックス

    Pythonではインデックスは正の値だけではなく、負(マイナス)インデックスもサポートしています。
    「-」をつけると、後ろからどこまでという指定もできます。

    また、スライスのステップも指定でき、「:::」の書式で飛び飛びでのスライスも可能です。
    コードの通り、

    print( s2[0:10:2] )

    で、0番目から10番目までを2つ飛ばしで

    print( s2[::3] )

    で、開始と終了を省略して、3つ飛ばしで。

    という意味になします。

    奥が深い文字列操作


    Pythonの文字列操作についておらさいしてみました。
    デフォルトでここまでできるってことで、かなり強力そうです。

    これだけじゃなく、文字列を操作する関数もなかなかすごいので、次回やっていきます。

    今日はここまで!

    テーマ:プログラミング - ジャンル:コンピュータ

    Pythonの辞書型 (dictionary) 基礎の基礎

    WindowsでPython シリーズ その10


    早くも10回目です。今日はちょっとだけ・・・
    前回は集合を表すリスト、タプル、集合をやりました。
    今日はその続きで辞書型について少し触れます。

    辞書型 (dictionary)


    辞書型 (dictionary)はほぼリストなんですが、その名の通り何かのキーとその値のペアを保存できます。

    コードを書いてみました。



    実行結果

    Python 辞書型の基礎の基礎

    はい、とりあえず解説していきます。

    辞書型の宣言方法



    冒頭に「dic = {"うまい棒":10 , "どんどん焼":20, "ベビスタ":30}」って書いてるのが辞書型の変数宣言です。

    このように書くことで、

    "うまい棒" は 10
    "どんどん焼" は :20
    "ベビスタ" は :30

    っていうペアを保存できます。
    「{}」で括るところは集合型(set)と似てますが、 "なにか言葉" : その値 って書いてる部分が異なります。」
    ここでは便宜上、お菓子の名前をキー(key) 、数値の10とか書いてるのを値(value)とします。

    で、辞書をprint (dic)すると、宣言通りの内容になってます。

    辞書にキーがあるか調べる


    「"うまい棒" in dic」 って書いてる部分ですね。これは"うまい棒"がdicに存在してるか?を問うてます。
    結果はtrue なので「存在している」ということです。
    将来の条件分岐に使えそうですね。

    キーから値を取得する


    次に、dic["うまい棒"] って書くと、その値を取得できます。
    結果として「10」が表示されてますので、大成功ですね。

    辞書型で使える関数いろいろ


    コードの続きを読むと、
    dic.keys()
    dic.values()
    dic.items()
    って書いてますね。これはそれぞれの実行結果を見ての通りですが、辞書型の中身を
    keyの一覧、valuenの一覧、辞書セットの一覧というふうに表示できます。

    辞書型は何に役立つのか?


    それはアナタ次第!エレガントなコードを組むときに、こういった基礎知識を総動員してキレイなコードを書くのです。
    そのためのコツコツ勉強です。

    とりあえず、最後の最後にfor文を記載しています。
    forの部分を見ると、items()の内容をfor 変数1、変数2 という書き方をしています。

    itemsは、キーと値のペアを順番に返すので、それをfor の一時変数に一気に格納しています。
    Pythonはこういった構文が楽でいいですね。

    時間のかかる更新はしないぞ!


    というわけで、今日はほんのちょっと勉強しておわり!
    長続きのためです。

    辞書型は他のプログラム言語でも使いこなせれば非常にエレガントになるので、頭の片隅においておきたいですね。

    ではでは!

    続きを読む

    テーマ:プログラミング - ジャンル:コンピュータ

    Pythonのリストとタプルと集合型の違い

    WindowsでPython シリーズ その9


    さて9回目。
    今書いてるのは本当に基礎の基礎だけど、こういうのは絶対大事だと信じて、日々毎日コツコツとやっていきます。
    これまで8日連続更新していましたが、流石に力尽きてました。
    休息は大切です。1日休んだので再開します。

    前回はリストについてなんとなく理解しました。

    リストの他に集合を表す方法として、3つあります。(他にもあるけど)



    リストについては前回記載したので、今回はタプルと集合型について。

    リストとタプルの違い


    リストとタプルの違いは、「後から値を変更できるかどうか」だけです。
    タプルについて、Python3のマニュアルにはパックパックアンパックなど見慣れない言葉が並んでますが、今は学びません。
    きっと混乱します。
    中級レベルのプログラマならすぐ分かるかもしれませんが。とにかく、.NET風に言うときっと数値型かオブジェクト型です。多分。

    構文違いは、

    • リストなら[]で括る。

    • タプルなら()で括る。

    これだけですね。

    コードを書いてみました。


    そして実行
    Pythonのリストとタプルと集合型の違い

    リストなら、testList[2]で3番目の中身を変更できるけど
    タプルの場合は
      TypeError: 'tuple' object does not support item assignment
    ってエラーになってますね。

    とりあえず今は、リストは便利、タプルは融通が効かない。
    そんな感じで覚えておきます。

    実際にリストの方がよく使うはず。

    ちなみに、リストをタプルに、タプルをリストに変換するのはとても簡単。

    list(タプル)
    tupul(リスト)

    って書けば変換できます。なんと融通がきくんだ。


    エラーにならなくなりました。

    Pythonのリストとタプルと集合型の違い


    集合型


    さて、集合型。
    集合型の説明を見た時、なんて便利なんだって思いました。
    簡易的データベースをコードだけで簡単に作れるんです!これはすごい。

    集合型は、{ } でくくります。
    作ってみましょう。


    実行結果

    Pythonのリストとタプルと集合型の違い

    カバンに色々つっこむ事を想定したコードです。
    セカンドバッグに携帯を2つ入れてますが、結果は携帯電話が一つだけ表示されますね。

    集合型は値の重複を許してくれません。
    だったらエラーにするか、何か検知してよ・・・と思うのですが、恐らくエラーにするよりも「削除してくれる」ことに便利さを感じるほうがよさそうです。

    集合型の真骨頂


    集合型のすごいところはデータベースのように「結合(和)」「交差(積)」「差分(差)」「対象差」を扱えるところです。
    このすごさの全部を理解するのは、本物の
  • マニュアル
  • を読んだほうがよいでしょう。

    とりあえずコードを書いてみます。



    結果・・・めちゃ便利。泣きそう。

    Pythonのリストとタプルと集合型の違い

    ところで、集合型には
    "携帯電話","財布","小説","お弁当" という順番で入れたのに

    {'携帯電話', 'お弁当', '財布', '小説'}

    って出ています。入れたコードの順番通りに、出力されていません。

    集合型は、並びは保証されないんですね。
    リストとタプルは保証されます。

    この当たりは、それぞれの集合を表す方法の仕様ですね。
    プログラムの学習の最初では深く考えてはいけません。そんなもんなのです。

    ちょっとずつブログ書く時間が増えてきている


    コレはまずい。
    このブログ書きに1時間半ぐらいかかってる・・・
    最初は10分ぐらいだったので、あまり時間かけると書くのが嫌になるので
    ちょっとずつチビチビ書いていきます。

    さてさて今日はここまで!
    いやぁ集合型すごい・・・ 続きを読む

    Pythonのリスト型を理解する

    WindowsでPython シリーズ その8


    タイトルと内容がイマイチに感じたので、冒頭で発言することにしました。
    今回はPythonのリストで遊んでみます。

    リストというのは、「何かの値のまとまり」ですね。
    プログラムしてる人用のブログなので、配列の便利なやつっていえばわかりますよね。

    Pythonのリストの書き方


    とりあえず色々書いてみました。


    実行結果
    Pythonのリスト型を理解する

    想定通りですね。

    Pythonのリストに使えるメソッド


    注目すべきはsumでしょうか。
    今回リストを数値型で指定しています。
    で、sum()関数を使えばその合計が出る。

    これはなかなか画期的ですね。
    他の言語だとこうは行かない。ループして、それを合計するコードを書かないとダメ。
    それをsum()1つで賄えるなんて・・・すごい。

    それとlen()関数で要素の数を取得できるのも便利。(だいたいの言語にあるけど)

    リストに対する操作


    Pythonでは、リストの追加とか削除がとても簡単です。
    配列の増減が難しい言語もあるので、これは嬉しい。
    ひとまずコードを書いてみました。



    実行結果
    Pythonのリスト型を理解する


    リストに対して、appendやらindexやらといったメンバが実装されているので痒いところに手が届く言語だということが分かります。
    すごいです。

    リストに対する操作で何ができるか?

    それはこのブログより本家マニュアルを見たほうがよいでしょう。
    8.7. array — 効率のよい数値アレイ

    他の言語ではなんやらこねくり回さないと行けない操作が、Pythonではメソッド一つでできるようになってますね。

    今日はおしまい!


    Pythonの学習は1日1時間程度の私ですが、
    実際に必ずコードを手打ちしています。
    この事でプログラム言語のコーディングに慣れていくんですね。

    それと、「コーディングができる」ためには、何かしたい時に調べる場所を知っておくことが大切です。
    リストに対する操作を調べるにはどうするのか?

    私もまだまだ手探りの状態ですが、とりあえずはここで
    プログラミング言語 Python
    サイト内検索することをおすすめします。

    いつになったらデスクトップアプリ作れるんだろ。。。

    続きを読む

    WindowsでPython その7(スライスってなんぞ)

    気づけば一週間連続更新


    あれ?結構Pythonにハマってる気がする・・・
    こんなに連続で更新するなんて。そろそろお迎えがくるかもしれない。

    pythonが誇るスライス


    pythonのチュートリアルを読んでいて、よくわからない言葉がありました。
    インデクス表記に加え、スライス もサポートされています

    スライス・・・スライス?

    読み進めていると、ちょっと目からウロコ。
    こんなの、他の言語にあったっけ!?
    だいたいは、「こっから、いくつ」なんだけど、
    Pythonの概念的には「こっからここまで」を示す表記でした。

    でも表記方法がなかなかおもしろく、使い所が多そうなので色々叩いてみました。

    スライスを使わない場所の指定


    とりあえずコレを見てください。

    変数 str に "abcdefgh" って突っ込んみます。
    で、str と打つと"abcdefgh" って出力されます。

    WindowsでPython その7(スライスってなんぞ)

    これはprint()を使ってもいいんだけど、変数の内容を表示させたいときは別にprintと打たなくてもできるんだね。
    個人的にはC#使ってると()を使いたくなるんだけど、pythonの思想でより簡単に、素早くコーディングできるというのがあるので
    使わない方になれるのがいいのかな?

    WindowsでPython その7(スライスってなんぞ)

    あ! なんか表示のされ方が違う。
    strの時は''でくくられてるけど、
    print(str)の時は内容が表示されてる。

    やっぱり意味が違うみたいなので、同じではないですね。
    ナゼそうなるのかとかはまたの機会に。
    とりあえず、そうなるとだけ覚えましょう。悩んでたらキリがない。


    でだ・・・たとえば"abcdefgh"の2文字目 b だけを表示したい時は
    str[1]と打つ

    WindowsでPython その7(スライスってなんぞ)


    ※プログラムの世界では、多くは1番目は0で表現する。 Pythonも同じく1文字目は0です。

    対応させるとこう

    abcdefgh
    01234567

    WindowsでPython その7(スライスってなんぞ)

    結局スライスってなに


    スライスというのは「ポジション○からポジション○まで」のようです
    ポジションってのはこんなん

    WindowsでPython その7(スライスってなんぞ)


    "abcdefgh"を例にすると

    "bcde"と出したい場合は

    str[1:5 ]と書く

    WindowsでPython その7(スライスってなんぞ)

    こんな感じ。ちょっと使いにくい・・・

    スライスの書き方色々


    公式サイトを見るとこんなこと書いてる。

    開始インデクスは常に含まれ、終了インデクスは常に含まれないことに注意してください。なので s[:i] + s[i:] が常に s と等しい、ということになります


    どういうことかというと・・・
    WindowsでPython その7(スライスってなんぞ)

    [ : ] のどちらかを省略した場合、内部的にはこうなる

    [3:] → [3:8]

    [:5]  →[0:5]

    実際に書いたものと同じですね。

    [WindowsでPython その7(スライスってなんぞ)

    意外ととっつきにくいスライス


    使ってみたけど、、、微妙・・・なんか直感的じゃない。
    それだったら、1:2で。ポジション1から2つとかのほうが慣れてます。

    が、やってるのはPython。なれるしかあるまい。

    このシリーズのコードにはしばらくスライスがでてくるかもしれないので、
    是非実際に叩いてみて結果を見てみることをおすすめします。

    C++とかC#には無い概念じゃないかな・・・ 続きを読む

    WindowsでPython その6(for文)

    一番よく使うループ処理


    前回、whileというループ文を使いました。

    今日は、最もよく使うであろうループ文である「for」をいじってみます。
    今日もマニュアルをカンニング
    4.2. for 文
    これをソラで打てなきゃ日常会話ができないのと同じ。
    とにかく叩いて慣れましょう。

    for文の使い方


    文法はこうです。

    for ループ変数 in 範囲:
    なんかやりたい処理
    else:
    ループが無事に全部終わったらやる処理


    さて、とりあえず「範囲」について、これは「どっからどこまで」とか、処理をするタバです。
    お手本通りに叩いてみます。

    WindowsでPython その5(for文)

    range(3)っての書いてます。range を直訳すると"範囲"です。
    数値になおすと 0 と 1 と 2 になります。

    で、それをprint で出力してみる。

    WindowsでPython その5(for文)

    書いたとおりに出てますね。

    数値以外のものも出してみる


    rangeで数値の範囲を指定しましたが、リストとか配列とかいったものも指定できます。
    これもサンプル通りに文字列の配列を作ってみます。
    が、、、よくわからない説明がありますね。
    4.2. for 文
    原文を見てもよくわからん。
    説明文としては

    ループ内部でイテレートしているシーケンスを修正する必要があれば (例えば選択されたアイテムを複製するために)、最初にコピーを作ることをお勧めします。シーケンスに対するイテレーションは暗黙にコピーを作りません。スライス記法はこれを特に便利にします:
    (中略
    for w in words: を使った場合は、この例は defenestrate を何度も繰り返し挿入することで、無限リストを作成しようとします。)

    よく分からないので実行してみる。

    WindowsでPython その5(for文)

    WindowsでPython その5(for文)

    最初に文字列を作って、それを「範囲」としてループしてますね。
    でも、ループ中に元のwordに、もしwが6文字以上であれば、その文字を追加するというような命令が書かれてます。
    wordをいじるということは、ループ中に判断材料が変わるということです。
    ループが終わった後にprint すると結果の通り。
    この書き方だと最初の値がそのまま使われているような・・・

    words[:] の偉大さ



    words[:]というのが何かヒントになりそうなので、[:]を削除してみる。

    WindowsでPython その5(for文)

    実行結果

    結果が返ってこなくなったので、 Ctrl + C で中断しました。
    KeybordInterrrupt というメッセージがキーボードで処理を割り込みしたよという意味です。
    Pythonでは Ctrl + C で実行中の処理を終了できるそうです。

    WindowsでPython その5(for文)

    これって、
    for w in words: を使った場合は、この例は defenestrate を何度も繰り返し挿入することで、無限リストを作成しようとします。
    に該当しそうですね。
    最初に[:]で範囲をコピーすることで、ループ中にその影響を与えないようにできるみたいですね。

    breakとcontinue


    for文つかってて、途中で処理を抜けたり、この値のときは何もせずに、次のループの値を処理したい時があります。
    だいたいどの言語でもあるので割愛しますが、Pythonでもbreakとcontinueキーワードが備えられています。

    else:文は、breakで抜けた時は実行されないようです。

    ちなみに else: が実行される条件は以下の通りです。
    ・繰り返しを1度も実行しなかった時(例えばwhileだと条件がいきなりfalseの時)
    ・breakでループを抜けなかった時

    WindowsでPython その5(for文)

    WindowsでPython その5(for文)

    このコードでは、偶数の時なら叫んで、だけど10のときは何もせずに次の値へ。
    rangeで100を指定しているけど、50回で疲れ果てて、途中でやめようと break しています。

    forは覚えておこう


    さて今回の記事ですが、for文は多分すべての言語にある日常会話です。
    ハロー!サンキュー!みたいなもんです。
    必須の文法なので、いちいち調べずに打てるようにしておきましょう!

    ではまた! 続きを読む

    WindowsでPython その5(while文)

    ペースダウン


    今日で5日連続更新です。
    ハイペースの更新に反比例して、勉強時間の質が20分、10分、5分と、落ちてきました。
    とりあえず1センテンス頑張ればいいかなと。。。読者の方も(いるのか?)あんまり頑張りなさんな。
    人生長いんだよ。

    処理を繰り返す制御構文


    昨日に続き、今日も制御構文のお話です。
    前回はifで条件分岐したけど、今回は「何か」を繰り返す処理です。
    一般的には「ループ」って言います。

    「だんだんPythonじゃなくてプログラムそのものの話をダラダラ言うようになってきたね?」
    というツッコミがきそうです。

    うん。そうなんだ。

    制御構文打つ時に、いちいち調べるんじゃなくて、ソラで打てるようになるために、自分で反復練習してるんですよ。
    それに付き合いきれないとか言わないで、一緒に繰り返そうぜ

    今日参考にしたサイトはもちろん、日本語Pythonホームページです。
    8.2. while 文¶(原文)

    whileで「君がッ泣くまで殴るのをやめないッ!」プログラム


    繰り返し処理といっても、forとかwhileとか、いろんな書き方(日常会話)があります。
    今日はwhileを使って、「君がッ泣くまで殴るのをやめないッ!」を表現してみます。

    うりゃ

    WindowsでPython その5(while文)

    Pythonでは、制御構文のうしろに「:」をとにかく付けて改行します。
    この表記はCとかVBやってる人はなかなか身につかないんじゃないかな?

    有名どころの書き方だと、こんな感じで
    だいたいは制御構文は「{}」を使うからね。
    while ( bool ) {
    //なんか処理
    }

    while のあとにある、インデント(字下げ)されたブロック全部が、繰り返し実行する処理となります。
    「else:」って書いた後のインデントブロックが、繰り返し処理を抜けた後の処理になります。

    while の後の()に書いている条件に合致するまで、永遠にループします。
    今回の例だと、入力で yes じゃなければ( != )ずっと殴るって書いてます。

    F5で実行

    WindowsでPython その5(while文)

    yesって入れたらループが終了して「else:」の後が呼び出されるけど、
    それ以外ならずっと殴られてることが確認できました。

    別の書き方


    while だけ取っても、いろんな書き方ができます。
    色々書き方あるけど、これがオススメってあるの?って思うでしょ?
    これもガイドラインに従うべきなんだろうけど、読んでないし、決まってるかもしらない。

    このように書いても、同じ動きになります。

    WindowsでPython その5(while文)

    WindowsでPython その5(while文)

    while (True): って書いてます。
    これは「条件なんかねえ、常に合致するんだ」って意味なので、永遠にループします。
    それを避けるために、ループの中で if 文を書いて、
    もし yes って言われたらループを終わらせる命令「break」と書いてます。
    if文を一行で書く小技も入ってますね。(個人的には見にくいので使いたくない)

    とにかくいろんな書き方ができるし、好みもあるけど、少なくとも自分の書くコードは統一しときましょう。
    あ、私はどうかって?そもそもwhileをそんなに使いません・・・極力別のループ制御文を使います。

    While は、続ける条件をプログラムミスすると永遠にループします。
    これを「無限ループ」といい、まぁ、、プログラムのフリーズに繋がったり、処理が終わらない問題がでたりするので
    他のループ文をできるだけ使うようにしています。

    最後に


    いかがでしたでしょうか。
    ブログタイトル変更や、方針すぐかえる朝令暮改な感じ。
    さらに、日に日にコンテンツが短くなっていくことは保証します!

    とはいえ、このシリーズはコピペしてどうにかする事を目的にしてるんでなくて、
    ド素人の私がPythonを使ってデスクトップを作れるようになるまで頑張るシリーズなので
    なのでソースをテキストで貼り付けてなくて、全部画像なのです。(めんどういだけ)

    というわけで不幸にもこのシリーズを読み進めてしまったら、自分で手を動かしてコード組んでくださいね。

    それが一番、Pythonの基礎を体に叩き込む行動だと思います。

    ではまた!! 続きを読む

    WindowsでPython その4(if文)

    ブログタイトル変更しました


    昨日まで「Pythonでデスクトップアプリを作るまで頑張る」というタイトルだったのですが、
    タイトルが丸かぶりしていたブログさんがあったので変更しました。

    制御構文ってなに


    職業プログラマをしていると必ず聞かれる質問

    「言語は何ができますか?」

    これね、定義が分からんのですよ。

    「いくら時間がかかっても、組むことができる」が「できる」の条件なんだったら、
    0から勉強時間を費やせば、誰にでもそれなりにはできるようになると思うんですよ。

    私が考える「できる」の条件は次の2点で、

    1.その言語の得意不得意分野と、困った時に調べる場所(マニュアルとか、WEBサイトとか)をある程度知っていること。
    2.制御構文を調べずにソラで打てること。

    2について言及すると、自然言語でいう日常会話。
    これがプログラムにおける「制御構文」です。

    いわば文法とか、言い回しはともかく言いたい事を伝える技術です。
    これができなければ「できる」とは言えない。
    今日はそんな制御構文の一つ「条件分岐」の「if」をやります。

    「条件分岐」の「if」



    さて、if文っていうのは、○がこうだったら、▲をする。そうじゃなかったら□をする。
    という条件によって処理を分岐する命令です。

    とりあえず偶数か奇数かを判断するif文を書いてみます。
    これまでやってきたとおり、拡張子がpyのファイルを作って、Pythonのエディタを開く。

    WindowsでPython その4(if文)

    ユーザーに数値を入力してもらって、それが何かを出力するプログラムです。

    ifは、Pythonでは

    if (なんか条件) :
        やりたいこと1
        やりたいこと2
    else (なんか条件じゃなかった時) :
        やりたいこと3
        やりたいこと4

    って書くのがお作法(文法)です。
    「やりたいこと」として、字下げ(インデント)が揃ってる部分が、一つのかたまりとしてみなされます。

    プログラムを書いたはいいけど、どうやって実行するん?


    さてさて、Python標準のプログラムエディタですが、コマンドラインからファイル名を打ち込んでもいいけど
    どうやらRunというところで実行できるらしい。

    WindowsでPython その4(if文)

    F5って書いてるのはショートカットで、書いたプログラムを即時実行したい時はF5を押してね。

    なんか出た。

    WindowsでPython その4(if文)

    実行できたので、1と入力・・・
    ちゃんと「奇数です」って表示されてるし、2を入力すると「偶数です」って出ました。

    WindowsでPython その4(if文)

    数値以外を打ち込んで見る


    例外処理について見てみます。
     ※例外とは、想定外のプログラム実行のこと

    "a"って入力してみました。
    すると・・・・

    WindowsでPython その4(if文)

    なんかエラー出た。

    エラーっぽい言葉を探すと、ValueErrorって出てます。
    直訳すると「値エラー」ですね。
    line 3 って出てるので3行目がエラー出たよって教えてくれてます。親切です。

    コードの見直し


    さて、コードの3行目を見てみる。

    WindowsでPython その4(if文)

    どうやら
    intInput = int(strInput)
    ってところがおかしいらしい。

    int()は、文字列の数字を数値に直す関数なので、そりゃ、プログラムからしたら"数字"が指定されると思ってるんだから
    想定外ということでエラーになるわ。

    ってことで、対処する。

    対処方法は色々あるけど、今回は想定外を対処する「例外処理」を使ってみる

    例外処理



    Pythonの日本語マニュアル
    例外を処理する
    を見てみました。

    try構文(これも文法だよ!)を使えば、なんとかできるみたいなので書き直す。

    WindowsでPython その4(if文)

    int()にするときに、想定外だった場合どうするかってのを書く。
    とりあえず文句言って、プログラム終了させるコードにします。
    エラー内容が「ValueError」なので、except の後ろにそのエラーを指定しています。
    よって「ValueError」以外の予期していないことが起きれば、やっぱりエラーメッセージはでてきますよ。

    sys.exit()ってかいてるのはまたいつか書きますが、これがその場でプログラム終了させる命令です。

    んで実行。

    WindowsでPython その4(if文)

    よし、お目当ての動きができた。

    今日思ったこと


    基本的な構文が全然わかってないので、if文やtryそして、sys.exit()するのに調べるのが必要だったので
    めちゃくちゃ時間かかった・・・
    これは「できる」とはいえないね。

    ってわけで、しばらくは条件分岐や文法について記載していきます。

    ではまた!
    続きを読む

    WindowsでPython その3(文字列について学ぶ)

    Pythonの学習 3限目


    とうとう来た。3日連続の更新。(3時間程度だが・・・)
    ブログを開設して8年目。初めてではないか。

    とはいえさっきまでX-MENアポカリプスを見てたので、非常にやる気がない。
    ほらね、さっそくですよ。

    そんなやる気の無さの中、今日はレベルアップする気はない。
    どんなプログラム言語にも必須の"文字列"について、Pythonではどうか?
    確認する程度の気持ちです。

    とはいえ文字列の扱いは非常に大切で、どんなプログラム言語でも「何か」を表示する時には必ず文字を使う。
    文字列はだいたい。"aaaa" こんな感じでダブルクオーテーションで括る事で表現できる。

    しかし!それだけ覚えていれば最低限。
    文字列を表現する方法はいくつもあり、これを知っているか否かで、コーディングのストレスが全然違う。
    プログラムを少しカジッた人ならなんとなく分かるはず。

    というわけで、今日は文字列の表現方法についてテキトーに確認していくぞ。

    Pythonにおける文字列の表現


    どんなプログラムも、だいたいは「"aaaa"」ダブルクオーテーションで括るか
    「'aaaa'」シングルクォーテーションでくくるかすると、文字として認識される。

    PythonはどっちでもOK!

    20170527_001.png

    "aaaaa" OK
    'aaaaa' OK

    文字列の中でそれぞれのクオーテーションを表現したい場合は

    シングルクォーテーションでくくってる場合は ' ' の中に 「"」を打てばいいし、
    ダブルクォーテーションでくくってる場合は " " の中に 「'」を打てばいい。

    でも混在させるとコードがきちゃなくなるので、どっちかに決め打ちしておくのが吉。

    私はC#を使ってるので、基本的には""で括ろうと思う。

    本来はそのプログラム言語の一般的なコーディング規約に従うべきであるが、まだそんなのは見ていない。
    よってこのブログをみた人からの指摘待ちです。

    ""の中でも"を表現したい場合は、エスケープシーケンス「\」を使う。

    文字列中に「\」を使うと、""で括ってる中で"を表現できる。

    文字列中で表現できる特殊な文字色々


    改行
    文字列中に改行したい場合は、「\r\n」と打つ。
    これはお決まりだし、特に深く考えること無いです。お決まりの言葉。
    \r\n (えんあーるえんえぬ)と打てばいい。OSがWindowsの場合ね。

    Linuxの場合は\n だけでいいです。
    20170527_002.png

    三重引用符(\r\nを使わない改行)
    文字を三重引用符、ダブルクオーテーションを3つ繋げたもので括る。

    """ こんなん """

    これは、C#で例えると @"こんなん" と同じです。

    文字は""で括るけど、エンター押して改行を入力するとエラーになります。
    エンター押して改行入れると、それがそのまま認識されるのが三重引用符。

    20170527_003.png

    20170527_004.png

    三重引用符で括って改行するのをさらに無視したい場合は、
    エスケープシーケンス「\」を打って改行する。
    そうすることで、改行が無かった事になる。

    エスケープシーケンス
    ちなみにエスケープシーケンスって何?ということだけど、
    これは、「その文字を無視する言葉、または、特殊な文字」程度に考えればOK
    考えるな、感じるんだ!

    画像にある「バックスラッシュは・・・」のくだりは、エスケープシーケンスのつもりで打った文字「バックスラッシュ」が「\」と間違えただけです。

    変数使ってたらバグった



    次に、変数に文字を突っ込んで、画面に表示させようとしてたらエラーが発生した。

    Pythonでは、文字と文字を合体させて、一つの文字にしたい場合は文字列同士を「+」でつなぐ。
    そしてPythonにはstr()っていう関数がある。これは文字ではなく、数値を文字列に変換する命令です。

    例えば 「お会計は500円です」
    と表示させたくて

    "お会計は" + 500 + "円です"

    って書くとエラーになる。

    500は文字じゃなくて、数値だからね。

    正しくは"お会計は" + "500" + "円です" ってやらんとダメ。

    str(500) って書くのと、 "500"って書くのとは同じです。

    で、画像のようにstr に文字列を突っ込んで、strを使おうとしたらエラーになった。

    strという命令が、変数になったんだね。エラーにしてくれよ・・・

    というわけで、変数の削除は del を使って消してみたらちゃんと動いた。

    これは罠になるでー!

    20170527_005.png

    文字列の練習おしまい


    他にも色々文字の表現はあるんだけど、多分書いたものぐらいしか使わんだろう。
    全部覚える必要はないです。
    自分ルールがあればいいのだ。

    ちょっとだけプログラミングぽいこと



    さて、文字列はだいたいわかった。(何か一つプログラムしてる人向けなので十分だと思ってます・・・)

    最後に、ユーザーから入力を受け取って、その入力を使うコードを書いてみる。
    うりゃ。

    input関数

    コマンドラインじゃなく、ファイルに作りました。
    input関数はユーザーの入力を受け取り、変数に保存するもの。
    ちょっとだけプログラミングぽいですね。

    20170527_006.png
    20170527_007.png

    姑息にも\r\nとか使ってみた。
    これはユーザー入力を受け取り、それを変数に入れて画面に出してます。

    今日は終わり!


    1時間経ったので終わります。

    でもね、しょうもない内容と思うかもしれないけど、文字列操作って本当に大事なんだ。
    いくつかの表現方法を知ってるだけで全然レベルの違うコードが書けるんだよ。ほんとだよ。
    今日、Pythonにおける文字列表現を学んだ事で、きっといつか役に立つはず・・・そう信じたい。

    デスクトップアプリ作るならなおさら、そう思いたい。

    そろそろ、予め引数を受け取ってそれをゴニョゴニョする方法を勉強したいな。。。その4か5あたりでできればと思います。

    ではまた。

    続きを読む

    WindowsでPython その2(とりあえず実行)

    今日も元気にPython


    さて、Pythonを始めて2日目です。
    珍しく2日連続の更新ですが、絶対にこのペースは続きません。きっと途中でペース落ちます。
    それでもゆっくり勉強していくのがこのシリーズの趣旨!

    だからといって、何もレベルアップしないのは面白くない。
    というわけで、今日はpythonのプログラムファイルを作って、それを実行するところまでやりたい。

    それではいってみましょう。

    昨日のおさらい


    コマンドラインで python3 と打ち込む。
    20170526_001.png

    Pythonが起動したのでとりあえず安心する。

    とりあえず四則演算を試してみる


    プログラムの基礎といえば、足したり引いたり。
    コマンドラインで適当に四則演算を試してみます。20170526_002.png

    そいや。

    10/3 とか打ち込んでるのは、10割る3してねってことです。
    途中で丸まった答えになってますが、きっちり答えを返してくれてますね。

    Pythonのすごいところ


    Pythonの素晴らしいところの一つ「ドキュメントを非常に大切にしている」ことですね。
    英語なのでオエってなりますが、公式サイトはPythonの全てが学べます。(読めないけど)
    https://www.python.org/

    有志の方々がこれを日本語にしてくれていて
    日本語のドキュメントもみっちり書かれてます。
    https://www.python.jp/
    正直、こんなブログを見なくても、オープンソースに慣れている人は日本語ドキュメントを順番に読めばいいと思います。

    対話実行モードについて


    さて、これまでコマンドラインで四則演算を打ち込んだりして、結果を確認してました。
    これを「対話型モード」と言います。
    コンピューターと対話して答えを返してくれる。
    そんな感じ。
    電卓より便利じゃないかな?

    これも日本語ドキュメントの
    3.1. Python を電卓として使う
    をそのままやってみただけです。

    今日の目標は「対話型モード」じゃなくて、プログラムファイルを実行すること!
    いちいちコンピューターと対話するんじゃなくて、決められたプログラムを実行することです。
    「非対話型モード」というらしいですが、やっていきましょう。

    プログラムファイルの作成


    対話型じゃないということは、何かしら決められたコマンドが用意されているということ。
    Pythonのプログラムファイルを作ります。

    20170526_003.png

    Pythonのプログラムファイルは、拡張子を「py」として作ります。

    pythonエディタを開く


    デフォルトのインストールをしたことが幸いしたのか、拡張子「py」のファイルがPythonのファイルとして認識されてました。
    ファイルを右クリックすると、「Edit with IDLE」ってメニューがありました。
    これは昨日、背景を黒くしたやつ!

    20170526_004.png

    早速開いて、コマンドを書き込みます。

    20170526_005.png

    PythonはPrint(なんかかく) って書くと、画面に()内の何かを表示します。
    ひとまず、このように書き込んでファイルを保存。

    pyファイルを実行!


    保存したファイルはすでにPythonのプログラムファイルです。
    このファイルをコマンドラインから呼び出してみます。

    ファイルが存在するフォルダでShiftキーを押しながら右クリックすると・・・
    「コマンドウィンドウをここで開く」メニューがでるのでクリック。

    20170526_0111.png

    すると、最初からファイルが存在しているフォルダに移動した状態でコマンドラインウィンドウが表示されます。
    便利。

    で、さっき保存した「test001.py」というファイルを指定して実行する。

    20170526_007.png

    Print()の中に書いた内容が表示されました!
    やったね。

    今日の目標は達成


    うん・・・すごくあっけなかった。

    15分ぐらいで終わってしまった。

    このシリーズ、プログラムの基礎の基も説明しないまま進めてるけど大丈夫かな?

    読者対象が他のプログラム言語知ってる人だからいいや・・・
    Microsoftの至れり尽くせりの環境でしかプログラムしたことない人向けだし。(言い訳)

    でもやっぱりあっけなさすぎるから、「変数」ぐらいは扱っておきます。

    Pythonの変数


    Pythonの型定義はそんなに厳密じゃありません。
    C#だと数値入れるのに「 int i 」とか書くけど、PythonはjavaScriptとか、コマンドライン寄り。

    なので、対話型モードで変数を書くと色々ぶち込めます。

    20170526_011.png

    画面の通り

    「hoge」変数に "ほげほげ"

    「カップヌードルの値段」変数に128

    っていれても、特に型指定することなく、print()文で表示できました。

    文字とか数値とか、あんまり気にしなくていいんだね。
    型が厳密でない分弊害はあるだろうけど、それはプログラム言語ごとの特徴ということで。。。

    今日はここまで!


    さて、今日もブログ書きを含めて1時間ぐらいやったので満足です。

    この調子でいったらデスクトップアプリ作成するのはいつになるだろうか?

    そもそもどんなデスクトップアプリを作ればいいんだろうか?

    何にも考えてないけど、C#で手軽なアプリを作る程度に使いこなせるように少しずつやっていきます。
    同じようにゆっくりトレースしたい方はこれからも応援よろしくお願いします。

    読んでる人いるんかな・・・ 続きを読む

    WindowsでPython その1(インストール)

    Pytonはじめます


    私はVisual StudioでC#しかしてない職業プログラマなんだけど、時代に取り残されそうなのでPythonをいじってみる。
    ド素人が手探りでやるので、他に詳しく書かれている方たちのようなレベルの内容ではないけど
    同じく手探りでPythonをはじめようかと思う人がトレースできるような感じでブログってみます。
    なおOSはWindowsを対象にします。Linuxいじったことないしね!

    まずはインストーラーをダウンロード


    Pythonはバージョン2と3があるらしい。
    バージョン2の方がライブラリが揃っているようだけど、最新らしき3ではじめます。

    ここからインストーラーをダウンロードします。
    https://www.python.org/downloads/
    20170525_000.png

    うっへぇもう英語。吐き気がしますね。
    とりあえず3.6.1をダウンロード。これが最新なんだから何も疑うな!感じるんだ!

    そしてインストール


    20170525_001.png
    どんどんいくよ。

    Install Nowをクリック。素人はデフォルトを選ぶのが最善なのさ。
    OSが重くなる?
    うん。Pythonがサービスとして常駐するなら、そうかもしれない。でもそうじゃないかもしれない。
    何かを得るには、何かを犠牲にすしかないんだ。

    インストール完了


    20170525_002.png
    なんかサクセスフルとか言ってる。
    下にある「Disable path length limit」はなんだろ?
    調べてみると・・・
    OSのファイルパスは最大260文字に制限されているけど、Windows 10では限界突破できるらしい。
    それをしますか?
    的な感じ。Python 3.6かららしいね。
    うん。いらん。
    無視してClose押します。

    ほんとにインストールできた証拠


    <>20170525_003.png
    ウィンドウズボタン押すと、最近追加されたものの一覧にPythonが出てきてる。
    無事できたということだな。多分。

    未来のために


    20170525_004.png

    とりあえず、Pythonのバージョンを3としてインストールしてみたものの、
    バージョン2とも同居できるらしい。
    バっというとPythonを実行したいときに「Python」ってコマンドラインで叩くと実行できるらしいんだが、
    もしかしていつかバージョン2をインストールするかもしれない。
    その時に「Python2」「Python3」とか指定できるように、実行ファイルの名前を変更しときます。

    環境変数が通ってないよ


    20170525_005.png

    早速コマンドラインで「Python」と打ち込んでみたらエラーが・・・
    パス通ってねえ・・・ってわけで、環境変数を通す。

    初の実行


    20170525_006.png
    Pythonはインタプリタ言語らしいので、逐次実行が可能。
    早速コマンドラインでテキトーに思いつく限りの命令叩いてみた。
    いけてそうだね!

    標準の開発ツールを試す


    20170525_007.png
    Pythonをインストールした時点で、標準の開発エディタも一緒に入るらしい。
    「IDLE (Python 3.6 32-bit)」というのをメニューから叩くと起動する。
    背景が白と文字が黒なので、個人的には目に悪いため背景テーマをdarkに変更しました。
    やっぱり英語です。つらい。

    今日はここまで


    素人が手探りでやるとここまでで力尽きた。
    先は長いけど、ちょっとずつ頑張ります!

    ★Python の記事一覧★

    FC2Ad

    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。