--- tags: 講習会, Python --- # プログラミング講習 Python 資料 <!-- *国立高専生もすなるPythonといふものを 市立貧乏高専生もしてみむとてするなり* --> ## 基礎の基礎の基礎の用語 - **プログラミング** : コードを書くこと - **プログラミング言語(Language, Lang)** : コードの規格の種類(RubyとかJavaとか) - **ソースコード(Source Code)** : ソースとも言われる。誰かが書いたコードのこと 今回はPythonという名前の(プログラミング)言語を使って説明していく。 ## 何故Pythonなのか そもそもこの講習の目的は以下の通り。 - 部員のプログラミングについての理解度の底上げをする - (日常生活において会話する上で)最低限の用語の理解を得る ~~つまりぶっちゃけ言語は何でもいい~~ (今回はメインでは扱わないが,`C++`という言語の入門に[APG4b](https://atcoder.jp/contests/apg4b)という素晴らしいものがある。 これは常設のコンテスト形式で,暇があるなら全員参加するべきだと思う。) ## Pythonとは - オランダ人が作った - スクリプト型言語(スクリプト型: [コンパイルという手順](https://wa3.i-3-i.info/word186.html)が必要でない) - (動的な強い型付け) ### 余談 : 動的な強い型付け? - **型システム** : 偉い人が研究している計算機科学の一分野([Wikipedia](https://ja.wikipedia.org/wiki/%E5%9E%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)) - **型** : 値の種類のこと - **動的な型付け** : プログラムが実際に実行される前に,いろんな値の**型が決定されていない**こと(つまり,実行中に臨機応変に型が決まる) - **強い型付け** : 型を忖度して**自動で変換しない**こと(整数と文字の足し算ができない等) ちなみに,**静的**な**弱い**型付けの言語に`C++`がある。 C++の場合,具体的には - 型 : `int`や`char`など - 静的型付け : コンパイルする段階で全ての値の型が決定する(型を書かないとコンパイルエラーになる) - 弱い型付け : `[](int n)->int{return n+1;}('a')`を評価(できる)すると`98`になる。ありゃりゃ。 という感じになる。 <!-- ![](https://i.imgur.com/IzsnIfJ.png) ![](https://i.imgur.com/gzDZyLH.png) --> --- ## 環境構築 閑話休題,早速コードを書いて実行してみよう! ……という訳にはいかないので,先にPythonのコードを実行できる環境を整える。 ### 講習時 口頭で説明する。 ### Linux (WSL) Debian系のシステムを前提に進める。 ```shell= sudo apt-get update sudo apt-get install -y python3 ``` これだけ。 端末に ```shell python3 ``` と入力するとPythonのインタプリタが起動する。 ### Windows ネイティブのWindowsでプログラミングを行うことは多大な労苦を伴う。 [WSL](https://docs.microsoft.com/ja-jp/windows/wsl/about)の[セットアップガイド](https://d3bu.net/wsl2-setup)に従ってLinuxの環境を整えることを強くお勧めする。 #### それでも僕は<!--M$に魂を売った-->[ドザー](https://wa3.i-3-i.info/word18559.html)だし…… WSLならWindowsの環境を破壊せずにLinuxの環境を共存させることが可能。 情報基礎でLinuxの基本的な使い方は習ったはずだし,今からでも遅くない。Linuxを使おう。 ……どうしてもWindowsしか使えない状況下にあるのなら,[python-3.9.6-amd64.exe](https://www.python.org/ftp/python/3.9.6/python-3.9.6-amd64.exe)をダウンロードしてインストールしよう。これは一般ユーザー権限でもインストールすることができる。 ## プログラミングをする方法 時は満ち,いよいよPythonのスクリプトファイルを実行する材料が全て揃った。 ### 方法1: コマンドライン 予め作成したスクリプトファイルのパスを`python3`コマンドの引数(コマンド名の他に渡す文字列)に渡してやると,その中身のスクリプトが実行される。 ```shell python3 ./hogehoge.py ``` それ以上でもそれ以下でもない。 ### 方法2: REPL(Read-Eval-Print Loop,対話型実行環境) ちょっと挙動を確認したい時とか,そもそもコードを保存する必要が無い場合などはこっちの方法を使う。 式を入力してEnterを押すとその式を評価してくれる。 Linuxなら`python3`,Windowsなら`python3.exe`を実行。それだけ。 ……って,<big><big><big><big><big><big>**ちょっと待った!!!!**</big></big></big></big></big></big> ## 唐突な質問 さっきから`python3`だの`python3.exe`だの…… pythonはわかるけど,3は何? ### 回答 ズバリ,Pythonの[メジャーバージョン](https://wa3.i-3-i.info/word11075.html)(デカいバージョン)のこと。 Pythonは~~欠陥言語~~クソなので,バージョン2.x(2系)と3.x(3系)では互換があまり無い(ずっと互換性を保ち続けているGoを見習ってほしいものだ)。 3系用のコードは2系で実行できないことがあるので,`python3`コマンドで明示的に3系で実行すること指定する必要がある。 --- ## 基礎の基礎の用語 さて,ここは超重要。 プログラミングにおいて基本的な用語を一気に説明をする。 - **値** : 文字や数字などといったデータのこと(例: `1234`, `'a'`) - **変数** : 値を保存するメモリのようなもの - **評価** : 式(後述)の中に出てくる値を元に,その式自体の値を計算すること(例: `1+1`という演算式を評価すると`2`という値になる) - **式** : 自身を評価することによって値に置き換えられるもの(例: 演算式, 条件式, 関数の呼び出し) - **関数** : 値を受け取って新たな値を返すもの(例: べき乗を計算する`pow`関数) - **文** : 式を構成する要素で,それ自身は値を返さない(例: `if`文, `while`文) 巨大なプロジェクトの巨大なソースコードも,1つ1つ分解していけばこのようなものから成り立っていることがわかる。 ---- ## 文法 基礎編 Pythonを書く上で避けては通れない必須の文法を説明する。 ### 値の種類 唐突だが,[基礎の基礎の用語](#基礎の基礎の用語)で説明した通り,**値**には種類(**型**)がある。 その中でも,知っておかないと話が始まらないものを説明する。 <!-- <small>※ちなみにその「種類」のことを型と呼ぶ。</small> --> #### int 本名はInteger。意味は**整数**。2進,8進,10進,16進の整数が含まれる。 値が何進数で表されたものなのかくらいJava側が察して欲しいものだが,そういう訳にもいかないので,接頭辞(Prefix)をつけることでそれぞれを区別する。 マイナスの値を表現するときは,接頭辞の前に`-`をつける。 ##### int: 2進数 接頭辞は`0b`。`0`と`1`のみが使われる。 例: `0b1010` ##### int: 8進数 紹介したは良いものの,実際に使う機会はほぼ無い。 接頭辞は`0o`で,`0-7`が使われる。 例: `0o7654` ##### int: 10進数 現実世界で大流行している表現。 接頭辞は無く,`0-9`が使われる。 例: `9876` ##### int: 16進数 整数の域で究極に情報量を高めた形。 接頭辞は`0x`で,`0-9`と`a-f`が使われる(`0,1,2,……8,9,a,b,……e,f,10,11,……`の順番)。 例: `0xfeba9876` #### string Pythonにおいて,string型の値とはダブルクォート(`"`)もしくはシングルクォート(`'`)で囲んだ文字列のこと。 複数行に跨がる場合は`"""ほげ~"""`のようにダブルクォートを3つ フォーマット文字列`f''`とか raw文字列`r''`とか ### 式(関数)の評価 // 俺が書くわ // 値渡しとか参照渡しとか ### 文とブロックとインデント #### asdfasdf #### スコープ 変数や関数を参照できる範囲 ### 変数の使い方 ```python= a = 1 moji = "mojidayo" print (a) ``` これでaには1を代入して、printで値を出力した。 文字も値なので、 ```python= report = "horobosu" #これで値「horobosu」が「report」の名前の変数に代入される ``` 数字と一緒のようにできる また、変数への代入(上書き)は最小限にしよう ```python= bannou = 1 〜他の文〜 bannou = 2 ``` // 間に合いまセンサー // 代入,値の取り出しとか ### 条件分岐 特定の条件によって処理内容を変えたい場合の方法などについて説明する。 #### bool値 真偽値を表わすための値。 `int`や`string`の値は無限に存在することに対して,`bool`の値には正しい(**`真`**)か正しくない(**`偽`**)かの2種類しか存在しない。 真は`True`で偽は`False`。 他の言語にもbool値はあるが,Pythonの場合は先頭が大文字なので注意。 #### if文 条件式が真の場合、それ以外の場合に処理を実行する。 ```python= if 条件式①: 条件式①が真の場合に実行する elif 条件式②: 条件式②が真の場合に実行する else: 条件式①、②が偽の場合に実行する ``` #### 比較演算子 ```python= aとbは等価 a==b aはbではない a!=b aはb以上、aはbより大きい a>=b, a>b aはb以下、aはbより小さい a<=b, a<b ``` #### 論理演算 二つ以上の条件式が全て真でないと真にならない(and) 二つ以上の条件式の中の一つでも真であれば真になる(or) ```python= aが正の数でbも正の数(and) a>0 and b>0 aかbのどちらかが正の数(or) a>0 or b>0 cではない(not) not c ``` ### ループ処理 ここでは繰り返し処理をする記述について解説する。 #### while 条件式が真の場合のみ処理を繰り返し実行する。 ```python= while 条件式: 真の時に実行する ``` 以下 実行例 ```python= num = 0 while num < 5: print(f"{x}") num += 1 ``` #### for 決められた階数だけ処理を実行する。 ```python= for 変数 in イテラブル: 実行文 ``` - `for in`の後に続くものは? `range` : `range()`の中の数字の回数分だけ実行する ※`range(5,10)`で 5, 6, 7, 8, 9の範囲で指定して実行することが可能 `len(list)` : 後ほど解説 - **でも途中で抜け出したいときもある!** そんなときは,`break`を使おう! ```python= while 条件文: 実行文 if 条件式: break #上の命令でこの while から脱出! ``` - **でも条件によってはもう一度戻りたい…** でも大丈夫 `continue`を使おう! ```python= for 変数 in 範囲: 実行文 if 条件式: continue #この命令でforの次の行まで戻る ``` --- <small>これにより,メインプログラムを無限実行とかも可能ですよね。</small> <small>例(応用):</small> ```python= while True: 実行文 #ここで何かを入力したり,描画しよう ################ # 脱出するためには ################ if 条件式: break #こう書くだけでok ``` ### 関数の分割/再帰 いくつかの処理を一つにまとめたものを関数と言い、関数は一度定義してしまえば何度でもそのコード内で使えるので便利である。関数はdefで定義する。 ```python= def kansu() print('でんさんぶ') return 'でんさんぶ' ``` 上の例では’でんさんぶ’と出力する。 使うときは ```python= kansu() ``` のようにして実行できる。 戻り値はreturnで記述する。この場合では例えば ```python= print(kansu()) ``` とすることで関数functionの戻り値を利用できる。(’でんさんぶ’と出力される) 再帰は気合で ### リスト/辞書/集合/タプル ここではリストと仲間たちについて説明する。 #### リスト いくつかある値([123,456,789]とか[a,b,c]とか)を一つにまとめるもの ```python= list1 = [1,2,3] ``` これだと、list1に[1,2,3]という3個の数字を代入していることになる。 例を示すと、 ```python= list1 = [1,2,3] #list1というリストに[1,2,3]の3つの数字を代入 print (list1[0]) #list1の第0番目の数をprintする ``` こんな感じで使える。 *※リストの値は**第0番目から始まる**ことに注意* #### 辞書 リストでは ```python= list1 = [1,2,3] list1[0] ``` とかで指定していたものを、 ```python= list1 = {'x'=1,'y'=2,'z'=3} list1[x] ``` という感じでやるもの。 文字で #### 集合 数字や文字などを集まりとして考える(数学の集合のイメージ) ```python= set = {1, 2, 2, 3, 4, 4} ``` などで書く。同じ値をいくつか入れても一つのものとして認識される 例) ```python= >>> print(set) {1, 2, 3, 4} ``` // list 添字 アクセス // 間に合いません、勝つまでは。 #### タプル お ### 改行の無視 バックスラッシュ(\)もしくは、括弧()で囲むと改行してないことになる ### 標準入力 文字や数字を入力 ## 文法 応用編 [文法 基礎編](#文法-基礎編)が理解できた人はここから先へ進みましょう。 といっても,これまでに説明したことを完全に理解していればスムーズに理解できるはずです。しかし保証はしません。 ### ファイルの分割 // import from as ### エスケープシーケンス \n \d ### 正規表現 regexp ### イテレーター各種 // map,reduce,filter,forEach,yield ### 名前付き引数・デフォルト引数 関数定義のときに指定できる引数を指定しなかった時に読み込まれる引数 ### ビット演算 // shift,pop,&,|,~ ### None 何もない空っぽの要素 ### リスト内包表記 // [a for hoge in fuga if piyo] ### 3項演算子 // 乱用は厳禁。hoge if True else fuga ### 無名関数 // lambda ### 末尾再帰の最適化 // StackOverflowしない為に