Study / Python 検索結果

検索件数 : 21

1

こんにちは。明月です。この投稿はpythonでデータベース(mariadb)を連結する方法に関する説明です。私の場合はpythonをローカルスクリプト言語でよく使います。ローカルスクリプト言語で使うというのはプログラムを開発することや運用する時に一回性で使うプログラムスクリプトということです。ただ、一回性だけではなく、スケジュールで使う時もあるし、batchをかけて問題がある時やトリガーにかけるかアップデータで使えます。コンパイル言語でもローカルスクリプト言語で使えますが、ソース修正がスクリプトより大変です。(buildが必要から)その以外にインストールも多いし、ライブラリも多いのでpythonをよく使います。そのためプログラムを開発すればデータベースに接続する場合が多いですが、簡単な検索などはsql browserなどで処理ができますが、データ検証や様々なsql scriptを管理する時にはローカルスクリプトを利用するばよいです。データベースの種類はoracleやsql server(ms-sql)、postgreなど多いですが、私の場合はmariadbをよく使います。それでここにはmariadbの対して例を作成しましょう。先にpythonでmysqlを使うためにはpipモジュールをインストールしなければならないです。モジュールインストールが完了したらpythonでmaraidbを接続しましょう。上の例でテーブル追加からデータ入力、修正、削除そしてテーブル削除まで処理するスクリプトを一列で作成しました。先、dbconnというmysqlコネクションを生成して受け取ります。pythonはスクリプトなのでプログラム実行が終わると自動にリソースを閉めますが、明確にするためソースの最後にclose関数でリソースを閉めて返却する処理式を作成します。そしてexecuteを実行するとforの繰り返しでデータセットを受け取ります。execute関数でクエリを実行することもできるし二つのパラメータでクエリバインディングもできます。executemany関数の場合は大量処理も可能です。fetchall関数を使えば一つのfetchデータではなくすべてのデータを受け取ることもできます。コンプリヘンションでデータソートが可能です。でも、すべてのデータがメモリにあることなので、パフォーマンスが遅くなります。link - https:

Study / Python

#Python,#database

作成日付 : 2020/06/24 18:51:50       修正日付 : 2020/06/24 18:51:50

2

こんにちは。明月です。この投稿はpythonでstringフォーマッティング(formatting)と補間法(interpolation)に関する説明です。stringフォーマッティングは定数タイプなどを文字列タイプに変換することやstringのデータタイプにstringの値を入れるような方法です。フォーマッティングはパーセント(%)を利用します。パーセント(%)の前はformat文字列、後は置換する値を設定します。最終結果はイコールで左の変数に格納されます。フォーマッティングの文字列で置換領域もパーセント(%)で区分します。そしてパーセント(%)の後は置換値のタイプによるコードを入力します。置換値は複数(2個以上)ならタプルで入力します。 コード 説明 %s 文字列(string) %c 文字一つ(character) %d 定数(integer) %f 浮動小数点(floating-point) %o 8進数 %x 16進数 stringタイプでフォーマッティングではなく本当にパーセント(%)を使いたい時があります。その時にはパーセント(%)を二つ入れることで入力します。pythonはフォーマッティングで文字列整列も可能です。補間法とはフォーマッティングする文法でもっと見やすくするための文法です。例えば置換するデータが多い時に置換場所を迷う時があります。補間法は文字列の表現するダブルクォートやクォートの前でfを付けます。そうすると領域中では中括弧で直接にフォーマッティングを作成することができます。stringフォマード(formattingと補間法(interpolation)に関して各長所、短所がありますが、私の場合は補間法(interpolation)のほうが見やすいのでよく使います。ここまでpythonでstringフォマード(formatting)と補間法(interpolation)に関する説明で

Study / Python

#python,#Formatting,#interpolation

作成日付 : 2020/06/23 19:03:21       修正日付 : 2020/06/23 19:03:21

3

こんにちは。明月です。この投稿はpythonで非同期ioのasync/await(asyncio)を使う方法に関する説明です。threadで関数を実行する時にその結果を受け取ることが難しいです。link - [python] 17. スレッド(thread)とロック(lock)、そしてデッドロック(deadlock)つまり様々な制御文を並列で処理して結果をすべて待たなければならないです。上みたいにfor文を二つのスレッドに実行して計算することができます。でも、何かソースが複雑みたいです。グローバル変数でretを生成して各スレッドでデータを入力、修正します。もし各スレッドでパラメータによってデータを変わることにしようと思うとすごく複雑になります。でも非同期処理(async/await(asyncio))を使うと簡単に処理することができます。asyncとawaitを使えばthreadingを使う時よりソースを綺麗に作成することができます。まず、asyncとは関数の前に使うキーワードです。外部では非同期を実行するためのキーワードだし、内部的にはawaitを使えるような予約語です。main関数でt1とt2を待つawaitを使いましたが、もしmainがasyncではないしグローバル領域でawaitキーワードを使うとエラーが発生することになります。awaitキーワードは非同期で待機する意味で、await asyncio.sleep(i)の場合はiを秒単位です待機する意味です。つまりtime.sleepと同じ意味です。create_task担っているtaskオブジェクトからawaitを使えばスレッドが終了する時まで待機するthread.joinと同じ意味です。最後にasyncio.runはasyncをcreate_taskみたいに非同期ではなく同期(プロセスの順番とおりに処理)で処理する呼び出しです。asyncio.runを使ってもよいです。でも最近はrun_until_completeを使うことをお勧めしています。またcreate_taskで非同期に分けましたが、asyncio.gatherも非同期処理が可能です。link - https://docs.python.org/3/library/asyncio-task.htmllink - https://docs.python.org/3/library/asyn

Study / Python

#python,#asyncio

作成日付 : 2020/06/22 18:10:12       修正日付 : 2020/06/22 18:10:12

4

こんにちは。明月です。この投稿はpythonでネットワーク(socket)通信する方法に関する説明です。プログラムでネットワーク通信することはソケット通信といいます。ネットワーク通信はプログラムとプログラム間に通信することやpcとpc間に通信するという意味です。ソケットはpythonだけではなく、他のプログラム言語でも同じ通信標準です。基本的にソケット通信流れは下記とおりになります。ソケット通信はサーバーとクライアントがあります。サーバーはソケット接続を待っているもの(listen)です。クライアントは接続を待っているサーバーに接続するものです。つまり、サーバーがlisten状況になっているとクライアントがサーバーにconnectionします。そうするとサーバー側はacceptが発生してサーバーとクライアントがsendとreceiveでデータを送受信します。データを送受信するデータタイプはバイナリ(byte)タイプになります。上の例をソケットサーバーソースです。基本的にbindしてlistenでクライアントを待機します。その後、acceptが発生すればスレッドでクライアントソケットを渡してメッセージ受信を待機します。binder関数では受信するデータサイズ、データ受信、echoを付けたデータのサイズを送信、echoデータ送信順の流れで繰り返しています。thread環境で作ったので接続が切れなくても別のスレッドでクライアントを待つことができます。上の例をソケットクライアントソースです。まず、サーバーを起動してクライアントを接続します。クライアントからサーバーに接続してhelloというメッセージを10回にループで転送しました。サーバーには10回のhelloというメッセージを受信してecho :という文字を付けてecho : helloというメッセージをクライアントに転送しました。その結果クライアントにはecho: helloが10回にコンソールに出力されました。ソケットインスタンスを生成する時socket.af_inetとsocket.sock_streamを使いましたが、socket.af_inetはip4インターネットを使うという意味だし、socket.sock_streamはデータをバイナリ(byte stream)タイプに使うという意味です。af_inet以外にaf_inet6、af_unix、af_

Study / Python

#python,#socket

作成日付 : 2020/06/18 19:53:56       修正日付 : 2020/06/18 19:53:56

5

こんにちは。明月です。この投稿はpythonでスレッド(thread)とロック(lock)、そしてデッドロック(deadlock)に関する説明です。スレッドとはプロセスの中で動いている最小の実行単位をスレッドといいます。ただ、このように説明すると何の意味がよく理解できません。まず、プロセスというのはメモリに割り当てている一つのプログラムということです。プログラムは一つ以上のプロセスを運用することができず、プログラムとは一つのプロセスという意味と同じです。一つのプロセスは二つ以上のスレッドを運用することができます。簡単に説明するとプロセスで二つ以上のスレッドを同時に実行できる並列処理方法だと思えば良いです。簡単な例として説明しましょう。上の例を見ればexample関数を二回に呼び出しました。example関数で1から9まで繰り返してコンソールに出力します。当然に始めのexample関数の呼び出しが終わったら次のexample関数の呼び出しに実行することで順番に実行することを確認できます。でも、私はこの関数を順番ではなく、同時に実行したいです。つまり始めのexample関数の呼び出しの終了を関係ずに次のexample関数の呼び出ししたいです。結果をみれば6から7間に1と2が出力されました。7は2の次にあります。つまりexample関数を二回に呼び出しましたが始めのexample関数が終わる前に二つ目のexample関数が呼び出されたことを確認できます。このように使ったらthreadの特徴を確認するのが大変です。今回はqueueを使って様々の作業を同時に処理する例を作って説明します。上の例をみればキューのtask_doneとjoin関数を使いました。簡単に説明するとキューからget関数でデータを出せば別にカウンターが更新しないです。キューのデータ数を更新する関数がtask_done関数です。queueの詳細な説明は次のリンクから確認できます。link - https://docs.python.org/ja/3/library/asyncio-queue.htmljoinはキューが空けるまでプロセスを止まる関数です。一つのリストに複数のスレッドで無差別にデータを入れると、データが失われる場合があります。確かにgenerator関数を二回に呼び出しします。generator関数は1から9まで繰り返すのでコンソール

Study / Python

#python,#thread

作成日付 : 2020/06/18 00:19:45       修正日付 : 2020/06/18 00:19:45

6

こんにちは。明月です。この投稿はpythonでio(ファイル読み取り、書き込み)を扱う方法に関する説明です。プログラム言語で重要なリソースならio(ファイルを扱う)とソケット通信ではないかと思います。特にプログラムを作成する時に主に使う言語はjavaやc#ですが、そのプログラムで使うテストデータを作ることや仮想マシンを作る時にスクリプト言語としてpythonをよく使う方です。スクリプト言語はパフォーマンスやメモリ管理の側ではコンパイル言語より疑問点があります。でも、テストデータ(jsonやxmlデータ)を作ることやサーバを管理するshellスクリプト管理、sqlスクリプト管理、ミドルウェアやサーバプログラムの環境設定ファイル管理などでは簡単にプログラムを実装ができる言語でpythonがいいではないかと思います。そのため、ioがpythonの言語で一番重要ではないと思います。ファイルは入出力(input/output)が基本の流れです。入力はファイルからデータを読み取ることだし、出力はデータをファイルに書き込むことです。上でopen関数を利用してファイルリソースを取得します。open関数のパラメータは使うファイル名とファイルオプションです。ファイルオプションタイプは下記通りになります。 タイプ 説明 r ファイル読み取り w ファイル書き込み(ファイルがなければ生成するし、存在すれば既存ファイルを削除して新しく生成する。) x ファイル書き込み(ファイルが存在すればエラーを発生するし、なければ生成する。) a ファイル書き込み(ファイルがなければ生成するし、存在すれば既存内容からデータを追加する。) モード 説明 t 一般テキストタイプ(省略可能) b バイナリタイプ(テキスト文字以外のデータを作る時に使う。) 上の例でタ

Study / Python

#python,#IO

作成日付 : 2020/06/16 18:37:00       修正日付 : 2020/06/16 18:37:00

7

こんにちは。明月です。この投稿はpythonでクラスを継承する方法に関する説明です。以前の投稿でpythonでクラスを生成して使う方法に関して説明したことがあります。link - [python] 12. クラス(class)を使う方法pythonでクラスを生成する時、既存にあるクラスでもっと機能を拡張して使いたい時があります。でも、ただクラスを修正すると既存に参照した領域で影響されるので修正することはできないなのでコピペする時があります。ただ、コピペすると元のクラスがバグがある時にコピペしたクラスをすべて修正しなければならないです。そのことより、ディベロッパーらしくないコーディングスタイルです。その時にただコピペでクラスを生成することではなく、継承することで再定義することができます。上の例をみればmain2クラスは確かにexec_functionがありません。でもmainクラスを継承しましたので、mainのクラスの機能を使えます。アンダーバー(_)を一つ使いましたが、protectedという意味で外部では参照できないですが、継承したクラスと内部では参照できるようなアクセス修飾子です。まとめるとアンダーバーがない場合はpublicですべて参照が可能、アンダーバー(_)が一つで変数名が始まる場合はprotecetdで継承したクラスと内部、アンダーバー(_)が二つで変数名が始まる場合はprivateで内部だけ参照できるような設定です。つまり、_dataの場合はアンダーバーが一つで変数名が始まるのでmainクラスを継承したmain2で参照ができます。なのでexec_function関数を呼び出すとmainは「main class」がmain2は「main2 class」が出力されます。上の例ではmainクラスで_get_data関数を生成しましたが、main2クラスで継承する時に再定義する構造です。結果はexec_function関数を呼び出すと再定義した_get_data関数を呼び出します。でも、再定義したが親のクラスを使いたい時があります。上の例はmain2クラスで_get_dataを再定義しました。でもexec_function関数でmain2の_get_dataではなく、親クラス(super())の_get_data関数を呼び出しました。今まで、使うクラスを継承して機能をそのままで使うクラスを生成しまし

Study / Python

#python,#abstract

作成日付 : 2020/06/15 18:20:07       修正日付 : 2020/06/15 18:20:07

8

こんにちは。明月です。この投稿はpythonのクラスプロパティ(property)に関する説明です。まず、クラスのプロパティはクラス内部変数を参照するような関数の意味です。 普通はゲッター(getter)、セッター(setter)という時もあります。クラスを生成する時に内部メンバー変数をpublicタイプで生成することはできますが、oopのカプセルの特性でクラスの内部メンバー変数を直接に参照することはよくないです。(pythonは別にoopプログラム言語ではないですが。。。)なぜなら、クラスを生成する理由はオブジェクトの意味を合わせて作った変数がクラスですが、直接に変数を参照することになるとクラスの意味がなくなることです。上の例をみればpeopleクラスに国語、数学、英語をいれてcalc関数で総点と平均点数を計算します。でもpublicになるとa.avgで平均点数値を修正ができます。上みたいにクラスを設計すればクラスの意味がなくなります。なので変数のアクセスを制御する必要がありますが、それがクラスプロパティです。でも、クラスのメンバー変数を参照しなければならない時があります。その時にはpublicにすることではなく、ゲッター、セッターのプロパティを設定して参照します。実は上みたいにゲッター、セッター関数で変数を参照してもpythonの標準コーディングに間違いことではないです。javaの場合はプロパティを上みたいにゲッター、セッター関数で参照します。c#の場合はプロパティ文法が別にあります。pythonもデコレートを使ってプロパティを設定することができます。pythonのクラスプロパティはセッターだけを生成ができません。@ゲッター名.setterなのでゲッターが無ければセッター設定ができないです。でも、ゲッターだけには設定ができます。ゲッターだけあれば読み取り専用変数になります。セッターを設定してないので産所するとエラーが発生します。ここまでpythonのクラスプロパティ(property)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Python

#python,#property

作成日付 : 2020/06/12 17:45:13       修正日付 : 2020/06/12 17:45:13

9

こんにちは。明月です。この投稿はpythonでクラス関数(class method)とダック・タイピング、そして特殊メソッドに関する説明です。クラス関数(class method)以前の投稿でpythonクラスと関数に関して説明したことがあります。link - [python] 12. クラス(class)を使う方法link - [python] 06. 関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャクラスで関数を使う方法は一番のパラメータでselfを入れるとクラスをインスタンス生成した後関数を呼び出せます。 pythonではクラス関数という関数があります。他のプログラム言語ならstatic関数ということです。static関数はインスタンスを生成がしなくて呼び出せるものです。ダック・タイピングダック・タイピングはc#のdynamic変数と似ているし、javascriptのコールバック関数と似ています。pythonではインターフェイスが存在しないからダック・タイピングで多態性を実現したようです。でも、インタフェースがない環境でダック・タイピングを作成すると逆にバグの発生や可読性が悪くなると思います。個人的な考えですが上のソースみたいに作成して、後にtestclass3クラスのcall_functionを変更したり削除したらエラーが発生する可能性があります。個人的な考えです。特殊メソッド特別なメソッドは、javaやc#なら最上位クラスobjectで宣言された基本関数の意味です。つまり、tostring()と同様のことでしょう。link - https://docs.python.org/3/reference/datamodel.html#special-method-names特殊メソッドは種類がすごく多いですが、よく使う__eq__と__ne__、__str__、__repr__、__len__を説明します。特殊メソッドは演算子を再定義する機能があります。よく使うとソースステップをたくさん減らせると思います。ここまでpythonでクラス関数(class method)とダック・タイピング、そして特殊メソッドに関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Python

#python,#class method,# duck

作成日付 : 2020/06/11 19:42:29       修正日付 : 2020/06/11 19:42:29

10

こんにちは。明月です。この投稿はpythonでクラス(class)を使う方法に関する説明です。クラスの概念は他のコンパイル言語を扱った方なら別に説明がなくても十分に知っていると思います。pythonの場合はスクリプト言語なのでクラス概念を知らなくてもソース実装することや設計を作成することができます。でも、管理が必要なデータや一つの概念でデータを結ばなければならないデータならクラスの概念で作ったほうが設計や実装することが理解しやすいしソースステップを減らすことができます。下記の例を通ってクラスがあることとないことの差異を確認しましょう。例は国語、数学、英語の成績を持っている学生の平均値とクラスの平均値を計算しましょう。上の例をみれば各人、国語、数学、英語成績のリスト宣言して人を追加する時に各成績リストも同じく追加します。つまり、4個のリストのデータ個数はいつも同じくなります。もし同じではない場合、整合性の問題になります。つまり、personリストは4個なのに、mathリストは2個ならデータが可笑しいでしょう。また、リストだけ確認すると誰のデータかは知りません。例えばmathの3番目のデータはpersionの3番目のデータを確認しないと知らないという意味です。上の例は簡単なソースなので難しくないですが、ロジックが複雑だし、データが多いならデータ管理は簡単ではないでしょう。ソースステップだけ見てもクラスを扱うことと使わないこととソースステップも差異が大きいです。また、各人の点数を各リストに格納したことよりクラス内部のメンバー変数で管理するので整合性も問題ないです。つまり、リストから取り除くと成績も一緒に削除されるので可笑しいデータが入ることがありません。pythonでクラスを使う方法は関数のdef代わりにclassキーワードを使えば生成します。小括弧はクラス継承のためにあることですが、他の投稿で詳しく説明します。クラスはメソッドだけ構成されています。他の言語みたいに変数を宣言することができません。各関数の最初のパラメータはselfで固定になっています。__init__の関数は初期化関数で他の言語ならコンストラクタということです。コンストラクタは無くてもクラスを扱うのは問題はないけど、可読性のためにコンストラクタを生成するほうがいいです。特にメンバー変数はどの関数で宣言しても問題ないですが、コンストラクタで初期値

Study / Python

#python,#class

作成日付 : 2020/06/10 19:33:33       修正日付 : 2020/06/10 19:33:33

11

こんにちは。明月です。この投稿はpythonのデコレーター(decorator)を使う方法に関する説明です。デコレーターは関数の再使用と関係があることですが、ただ再使用だけではなく機能を追加する機能だと思えばいいです。関数系の継承だと考えばいいです。例えば、二つのパラメータを受け取って総合計を計算する関数があります。ここで我々は平均まで計算したいなら関数を修正しなければならないですが、修正しなくても機能を追加することで関数を続けて使用するような方法です。実務では上みたいにデコレーターを使うことはありません。ただ、デコレーターを理解しやすく説明するために作成しました。普通はデコレーターはcallback関数やcount関数、ログを作成するために使います。上の例みたいに使えばadd関数に呼び出すたびにログを残せます。デコレーター側にはパラメータ個数とは関係ないので、他の関数でも使うことができます。callback関数ではラムダだけではなく、一般関数を入れることができます。なので複雑なロジックでも設定ができます。ここまでpythonのデコレーター(decorator)を使う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Python

#python,#Decorator

作成日付 : 2020/06/09 17:27:18       修正日付 : 2020/06/09 17:27:18

12

こんにちは。明月です。この投稿はpythonのモジュールとパッケージ(import)に関する説明です。pythonでモジュールの意味は拡張子がpyになっているpythonコードのファイルということです。その意味は私がmain.pyを生成してその中でpythonコードを作成すればそれがmainモジュールということです。他のプログラム言語はファイルの意味はクラス名と一致する以外は特に意味がないし、大体にnamespaceやpackage単位とクラス中心で動きます。私の考えはコンパイル言語はコンパイルすれば一つのファイルにアウトプットになるので別に意味がないじゃないかと思います。逆にpythonはスクリプト言語なのでファイルの意味があることではないかと思います。上のソースをみればimportキーワードでexample.pyを登録します。ここの重要なポイントは拡張子が必ず.pyになるべきです。そしてexample.print_function()でexample.pyの中にあるprint_function関数を呼び出します。こんなモジュールをディレクトリ別で管理することもできます。 このモジュールがあるディレクトリをpythonではパッケージといいます。参考にディレクトリをパッケージ化するためには__init__.pyが必要です。__init__.pyがなければパッケージでインポートができません。(python3.3からは省略ができます。)参考 - https://dojang.io/mod/page/view.php?id=2449それなら私がexampleフォルダでtestディレクトリを生成して同じくexample1.pyファイルとexample2.pyを生成します。エラーは発生しないですが、import順番でexampleパッケージのexample1.print_functionを使うことができなくなりました。この時はパッケージ再命名方法で解決できます。これみたいにモジュール名が同じだても再命名方法で使うことができます。pythonはユーザー、つまりプログラマーのためよく使うモジュールやパッケージを作成しておりましたが、これをpythonでは標準ライブラリだといいます。link - 標準ライブラリ例でosモジュール使ってみましょう。私はwindowで実行しましたので、ntという結果が出力されます。別途でpy

Study / Python

#python,#module,#import

作成日付 : 2020/06/08 19:07:50       修正日付 : 2020/06/08 19:07:50

13

こんにちは。明月です。この投稿はpythonで例外処理する方法に関する説明です。プログラムを作成すると様々なエラーが発生することがあります。例えば、stringタイプにintタイプの数字を加算するとか、文字タイプを定数タイプにキャストするとかがあります。上の例をみれば4行目でエラーが発生したと表示されます。その後にpythonコードは中断されました。下のprint関数が実行されませんでした。様々な変数を間違ってエラーが発生することは悪くないです。ただ、エラーをどのように処理することが重要です。エラー処理を上手くできなければ上みたいにプログラム実行が止まります。エラーが発生する時にはエラー処理をしてエラー部分のステップを超えます。上の例でエラーが発生する部分をtry ~ exceptで囲んでました。c = a + bのステップでエラーが発生してexceptのところに移動しました。print(c)でコンソール出力が行わないです。後、exceptであるコンソール出力してprint(a)が実行されました。区間内でエラーの種類は一つではなく様々なエラーが発生する可能性があります。そのエラーの種類によってエラー処理を別々にすることができます。上の結果をみればdivision_functionを三回に呼び出しますが、上の二回はエラーが発生します。でも上のエラー種類が違うので別のprint関数を呼び出します。参考に上の「エラータイプ as e」構造ならe変数にエラー内容が格納されます。ここで例外の最上位エラータイプはexceptionです。上みたいに作成すればtypeerrorとzerodivisionerrorが発生してもすべてexceptionに行ってしまいます。上の結果はtypeerrorとzerodivisionerrorのところに移動しました。エラーが発生してエラーか、エラーではないかの関係しず、ステップ処理するキーワードはfinallyです。一般ソースステップではfinallyキーワードを使わなくてもexceptが呼び出したら次のステップに実行するのでfinallyの必要性を感じられません。でも関数の中でreturnキーワードと一緒に使えばtryの中でreturnしても最後にfinallyの部分が実行されます。特にリソース管理する部分で使えばいい文法です。ここまでエラーが発生すればどのように処理することを説明

Study / Python

#python,#try

作成日付 : 2020/06/05 17:11:47       修正日付 : 2020/06/05 17:11:47

14

こんにちは。明月です。この投稿はpythonのジェネレータ(generator)に関する説明です。ジェネレータ(generator)という辞典的な意味は生成するという意味です。pythonでもジェネレータ(generator)は生成する意味ではないことではないですが、繰り返し(ループ)文法でイテレータ(iterator)パターンを実装するような機能です。少し説明が難しくなりますが、関数を呼び出すたびに結果が違うような機能です。上の例はジェネレータでrange関数と同じ結果が出るように実装しました。range関数も1から9まで出力して1ずつ増加します。ジェネレータは上の例みたいに関数で使えますが、実はコンプリヘンションでよく使います。参考 - [python] 05. コンプリヘンション(comprehension)を使用する方法上の例をみれば同じ結果になります。コンプリヘンションを利用してリストを作ることとジェネレータを作ることは差がないです。そうすればジェネレータは別に意味がなさそうです。でも、パフォーマンスに大幅差があります。メモリをみればリストは43,000バイトを使うしジェネレータは120バイトです。なんでこの差が出るでしょう。リストの場合はコンプリヘンションで計算した結果をすべて持っていることです。でも、ジェネレータの場合はデータをメモリに持っていることではなく、構造的なオブジェクトでデータを呼び出す時だけ返却するのでこの結果になりました。(構造的なオブジェクトとは値を持っていることではなく、関数のスタックを持っていることです。)なので、一回性のデータならリストにデータを格納することではなく、ジェネレータを使うほうがパフォーマンスを上げることができます。ジェネレータはリストによる短所もあります。再使用ができないことです。なので結果は一回だけ出力されました。ジェネレータはループだけ使うことではありません。next関数で2,4,6,8のデータを一つずつ出力しました。8の以降はデータがないので、エラーが発生します。ここまでpythonのジェネレータ(generator)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Python

#python,#generator

作成日付 : 2020/06/04 18:46:08       修正日付 : 2020/06/04 18:46:08

15

こんにちは。明月です。この投稿はpythonでglobalとnonlocalに関する説明です。以前の投稿でクロージャ(closure)に関して説明したことがあります。link - [python] 06. 関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャクロージャとはインライン関数で関数の外部から宣言したデータを持ち込むということです。でも外部から宣言したデータを関数の内部で修正することはどうでしょう。example_function関数の内部でdataの値をhelloに変更しましたが、外部でコンソール出力するとデータが変更されないでした。理由はexample_functionの中でdata="hello"したことは内部変数に認識して新しい変数を宣言したからです。そうすると、仕様によってグローバル変数を関数の内部で変更する時もありますが、その時にはどうでしょう。今回はdataの変数の値がちゃんと変更されました。今回はインライン関数関数で使いましょう。上のグローバル変数でdata変数があり、example_functionの関数の中でもdata変数があります。その状況でinline_function関数でdata変数を参照すれば、inline_function関数の一番近いステップの変数を参照します。グローバル変数よりexample_functionの変数がもっと近いステップということです。でも、使用によってグローバル変数を使いたいです。そうすればinline_function中でもglobal関数を修正ができます。global dataをしてdata ="値"をいれば修正できます。それなら、inline_function中でexample_functionのデータはどのように修正するでしょう?単純にdata="値"を入れれば初めの例みたいにinline_function関数のデータに宣言されてしまいます。globalはグローバル変数をnonlocalは一番近いステップの変数を参照することです。そうすればインライン関数の中でインライン関数でグローバル変数ではないけど、一番トップにある変数を修正したいです。そこまでは参照ができないです。(何処まで参照したいのか?)実は上みたいにソースを作成するとプロ

Study / Python

#python,#global,#nonlocal

作成日付 : 2020/06/03 20:34:49       修正日付 : 2020/06/03 20:34:49

16

こんにちは。明月です。この投稿はpythonで関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャに関する説明です。プログラムで変数と制御文を学ぶと次に学ぶのはこの関数ではないかと思います。関数はpythonで一番小さい単位のコードだしコードを再使用ができる文法です。関数の基本構造は下記通りになります。関数はdefで定義して最後にはコロン(:)を付けます。関数領域のはじめはインデントで区分します。インデントが終わるところが関数の末です。パラメータは小括弧の中で定義します。関数を呼び出すところで値を受け取るところです。pythonで関数名を作成する方法は決めてないですが、コード標準では動詞+名詞の形式で作成するようにお勧めしています。他のプログラム言語と似ていますが、動詞、名詞の区分を大文字ではなくアンダーバーで区分します。pythonではパラメータを使う方法が二つあります。一つはパラメータ位置で値を渡す方法(一般的な方法)があり、キーワードでパラメータを渡す方法があります。そしてパラメータの個数を決めなく、可変的に設定することもできます。結果をみれば可変パラメータはタプルタイプになります。パラメータをディクショナリタイプで渡すこともできます。pythonはjavascriptと似ている文法が多いです。インライン関数で関数の中の関数を設定することができます。関数をオブジェクトタイプで設定することもできます。get_functionの中で関数をリターンしました。javascriptの経験がある方ならどの意味か分かると思います。callbackはデザインパターンでvisitパターンで関数をパラメータで渡す意味です。javascriptみたいにcallback関数が作成されました。やはり、スクリプト言語なので似ている文法が多いです。参考にnoneのキーワードは他のプログラム言語だとnullと同じ意味です。この頃になるとjavascriptみたいにクロージャやラムダ(lambda)があるか知りたくなります。pythonもクロージャがあるしラムダ(lambda)があります。クロージャ機能は関数の中で宣言したデータではなく、外部で宣言したデータを持ち込んで使う方法ということです。それならラムダ(lambda)式はどのように実装できましょうか?lambdaの作成方法はコンプ

Study / Python

#python,#function,#inlinefunction,#callback,#lambda

作成日付 : 2020/06/02 20:51:22       修正日付 : 2020/06/02 20:51:22

17

こんにちは。明月です。この投稿はpythonのコンプリヘンション(comprehension)を使用する方法に関する説明です。pythonのデータタイプでリスト、ディクショナリ、タプルなどを説明したことがあります。link - [python] 03. pythonでリスト(list)とタプル(tuple)、そしてディクショナリ(dictionary)、セット(set)コンプリヘンション(comprehension)とはリスト、ディクショナリ、タプルの資料構造をよりしやすく検索、抽出するpythonの文法です。個人的にc#のlinqやjavaのstream apiと似てる文法だと思います。例のため、リストを作りましょう。結果をみれば以前にforの繰り返し式でifの条件で偶数でフィルターして実数タイプに変換しました。forとifをよく知っているとそのように実装します。でもコードステップが少なくても5行目ですね。でもコンプリヘンションを使うと1行目で抽出ができます。コンプリヘンションでを使う方法ではリストなので大括弧([])で始めは出力タイプ、forでlist1から抽出する。条件はif x%2 == 0の意味です。リストコンプリヘンションがあればディクショナリコンプリヘンションもあります。リストとディクショナリが可能ならセットも作られます。そのほコンプリヘンションはifを重ねることもできるし、if〜else構造にすることもできます。ここまでリスト(list)、ディクショナリ(dictionary)、セット(set)のコンプリヘンションを説明しました。上記の形態を見れば、リストは大括弧([])、ディクショナリとセットは中括弧を({})を使用してヒコンプリヘンションを生成します。それを従って括弧でコンプリヘンションができると思い、タプルも小括弧(())でコンプリヘンションができると思われます。でもタプルはコンプリヘンションは存在しません。タプルは修正できないリストだからです。でも、小括弧(())でコンプリヘンションの文法を作成すれば、コンプリヘンションではなく、ジェネレータになります。ジェネレータは、データ構造ではなく、関数の構造であるため、他の投稿で説明します。ここまでpythonのコンプリヘンション(comprehension)を使用する方法に関する説明でした。ご不明なところや間違いところがあればコメントして

Study / Python

#python,#Comprehension

作成日付 : 2020/06/01 19:38:58       修正日付 : 2020/06/01 19:38:58

18

こんにちは。明月です。この投稿は pythonで使う制御文(if, while, for, break, continue)とインデントに関する説明です。制御文という文字とおりにプログラムを制御するキーワードです。例えば、aという変数にユーザー任意の数1をユーザーから受け取る時、偶数の時は「even number」を出力して、奇数の時は「odd number」を出力したいです。その時にaの変数が偶数、奇数かを判断することを制御文といいます。if ~ elif ~ else分岐文と呼ばれるifです。上の例ですこし確認しましたが、その条件式にtrueの条件になると実行する制御文です。if文は、単独で「if」のみを使うことができます。「if〜else」、「if〜elif」として使うこともできます。でも、「elif〜else」や「elif単独」、「else単独」では使えません。注意点は、条件式が終わると、必ずコロン(:)を付けなければならないです。そして、条件式の中の実行区分は、他の言語の場合は、「{}」の中括弧で実行領域を設定するが、pythonの場合はインデントを決定します。インデントは投稿の最後に詳しく説明します。whilewhileはループです。ループは、条件がfalseになるまで繰り返し実行する制御文です。for他のプログラム言語のjavaやc#は、for文は、for初期式、条件式、増減式からなるループです。でも、pythonの場合は、初期式、条件式、増減式ではなく、リストやタプル、ディクショナリ、セットのデータ値をシーケンスどおり取得ループです。break上びwhileとforのループで条件式がありますが、条件によってループ(繰り返し)を強制的に終了するキーワードです。参考にrangeタイプは(初期値、終了値、増加値)からなるデータを作成する関数です。ここで1から10まで1ずつ増加するrange値を順に1,2,3...と出力して、9まで出力すると正常ですが、ループの中にif文があり、iの値が3を超えるとループが止まります。つまり、4になるとbreakで繰り返しをロープが終了することです。それで1から4まで出力することです。ここでbreakを使用すれば、forやwhileにelseを付けることができます。このelse文はループの中でbreakを会わなければ実行される構文です。continuecontin

Study / Python

#python,#if,# while,#for,#break,#contine

作成日付 : 2020/05/29 21:09:08       修正日付 : 2020/05/29 21:09:08

19

こんにちは。明月です。この投稿はpythonでリスト(list)とタプル(tuple)、そしてディクショナリ(dictionary)、セット(set)に関する説明です。一般のプログラム言語の流れだと変数宣言とデータタイプを確認すると次は制御文を確認します。でも、pythonの場合はリスト系のデータ集合から確認します。リストとタプルはデータが集まっている配列タイプでリストは追加、削除が可能、タプルは不可能なタイプです。その中でディクショナリはリストでキーがあるデータセットです。セットはリストと似ていますが、数学の集合計算の和集合、積集合を計算するようなデータタイプです。pythonには同じリストタイプでも種類がもっと精密に分けています。リスト(list)リストは他のプログラム言語と同じく、push(append)とputが存在するリスト構造のアルゴリズムです。リストはpythonで大括弧([])で宣言します。リストには格納、挿入、削除機能もありますが、ソート、コピー機能もあるのでデータ集合管理がしやすいです。タプル(tuple)タプルは上のリスト機能で宣言だけできるし、挿入、格納、削除ができないし、ソート、コピーもできないです。タプルはpythonで小括弧(())で宣言します。タプルの0番のデータを修正しようとすればエラーが発生します。タプルは関数の結果、キーなどで使うタイプです。なのでタプルになっているデータを一つの変数に変換ができますが、それをpythonではタプルアンパッキングといいます。タプルアンパッキングはコンマ(,)の区切りでやりますが、タプルの個数は一致しないとエラーが発生します。ディクショナリ(dictionary)pythonのディクショナリはjavascriptのjsonの構造と同じです。ディクショナリはpythonで中括弧({})で宣言します。セット(set)setは集合計算専用のデータタイプです。つまり、数学の特性をもっているデータタイプです。セットはpythonで中括弧({})で宣言します。ここで区分することはディクショナリも中括弧({})で宣言します。差異はディクショナリはキーがあるしセットはキーがないことです。セットとリストの差はリストはユーザーが格納順番でデータがありますが、セットは順番がありません。格納したことが初めにある可能性もあるし、最後にある可能ですもあります。集合の

Study / Python

#python,#list,#set,#dictionary,#tuple

作成日付 : 2020/05/27 18:49:08       修正日付 : 2020/05/27 18:49:08

20

こんにちは。明月です。この投稿はpythonでデータタイプ、変数宣言そしてコメントする方法に関する説明です。どのプログラムでも最初はデータタイプから確認します。pythonでデータタイプを説明する前に、簡単に変数宣言する方法に説明します。pythonの場合はc++やjavaなどのコンパイル言語と違って別に指示タイプが無いです。javascriptみたいにvarやletを使う必要もありません。ただ、使いたい変数名を宣言して値を格納すればpython内部で自動に変数タイプを指定して値を格納します。結果をみればaの変数に1を格納したらintタイプになることを確認できます。後で、"hello world"のデータを格納したら自動にstringタイプに変換されます。pythonではこんなに自動にデータタイプを設定してデータを変数に格納します。※これかスクリプト言語のいい点ですが、個人的にプログラムが複雑になるとこのデータタイプが固定にならないので、データが変換されると何処で変換されたか把握が大変になります。pythonにはどのデータタイプがあるかを確認しましょう。データタイプが一般プログラム言語より多いです。基本的に文字列、定数、実数、ブールは別に他のプログラム言語でもよくあるタイプです。面白いことは複素数タイプがあることです。複素数タイプは実数と虚数を計算するためのタイプです。数学的な計算や数値計算を行う時に必要なデータタイプだと思います。そしてリストとタプル、dictionaryタイプがあります。リストは文字通り、リストとしてデータを挿入、削除が可能なデータタイプです。リストは挿入、削除が簡単にできるタイプならタプルは配列みたいに一回に挿入すると削除ができないタイプです。つまり、タプルが宣言されたら、挿入、削除、修正ができません。 dictionaryはマップタイプみたいにキーを設定してデータを挿入するタイプです。集合タイプはsetとfrozensetのタイプがあります。 集合タイプはと数学の集合と関係があるタイプです。、和集合、積集合などを計算のためのタイプです。setはデータの変更が可能、frozensetは変更が不可能な集合タイプです。byteとbyte配列とbyteのメモリタイプはバイナリと関係があるデータタイプです。つまり、特定のファイルをバイナリで読み込む時にbyteに変換するこ

Study / Python

#python,#data type

作成日付 : 2020/05/26 18:16:52       修正日付 : 2020/05/26 18:16:52

21

こんにちは。明月です。この投稿はpython3をインストールする方法(anacondaインストール)に関する説明です。ユーザーがプログラムでpcを扱う方法に関して三つがあります。一つはシェルコマンドで操作する方法、二つはプログラム(コンパイルになったプログラム)を実装して実行する方法、最後にスクリプトを作成して実行する方法があります。スクリプトとは一応プログラム言語ですが、c++やjavaみたいにコンパイル(作成したソースを機械語で変換する作業)でバイナリコードに変換することではないですが、シェルみたいに会話式で一つのコマンドで実行することではなくプロシージャ(作業順番)を配置して実行することです。簡単にコンパイルプログラムとシェルコマンドと半分ずつ混ぜているプログラム言語だと思えばよいでしょう。スクリプト言語では代表的な言語はpython、javascript,phpがあります。phpとはスクリプト言語ですがウェブサーバーサイドで使う言語だし、javascriptはウェブクライアント側でよく使うプログラム言語です。javascriptの場合はnode.jsを利用してローカルでも使えますが、個人的にnode.jsとpythonの選択肢があればpythonがもっといいではないかと思います。なぜならpythonの場合はnode.jsよりコミュニティサイズやライブラリの量を考えてもnode.jsより何倍に大きいしプログラム開発もjavascriptよりもっと簡単だし、理解しやすいのでpythonを選択して運用するほうがいいではないかと個人的な考えです。これからpythonをインストールしましょう。pythonを直接にホームページに接続してダウンロードしてインストールすることができます。link - https://www.python.org/pythonホームページで直接にダウンロードしてインストールすれば、後に必要なライブラリがあるとき別々にすべてインストールしなければならないです。でもよく使うライブラリパッケージを含めているpythonバージョンがあります。それがanacondaです。anacondaをインストールするほうが様々ことに楽でしょう。link - https://www.anaconda.com/distribution/バージョンは3.xバージョンと2.xバージョンがあります。参考に2.xと

Study / Python

#python,#install

作成日付 : 2020/05/25 19:02:44       修正日付 : 2020/05/25 19:02:44