pythonで作ってみよう!!

pythonを楽しく学ぶために、おみくじ、占い、ジャンケンなど、実際に作りながら勉強してみます!

第2回 本当に占いをする

3.本当に占いをする

では、次に、毎回大吉ではなく、占いらしく、毎回結果を変えてみましょう。
今回は乱数を使って、結果を変化させていきます。

◼️要件

前回作ったプログラムの表示結果をランダムで

  • おめでとうございます!大吉です
  • セーフ!吉です
  • がーん… 大凶です

のいずれかを表示するように変更します。

◼️ソースコード

import random
print('あなたの今日の運勢は')
for i in range(10):
    print('・')
  
fortune = random.randint(0,2)
if fortune == 0:
    print('おめでとうございます!大吉です')
elif fortune == 1:
    print('セーフ!吉です')
else:
    print('がーん… 大凶です')

実行結果

実行結果
あなたの今日の運勢は
・
・
・
・
・
・
・
・
・
・
セーフ!吉です

◼️解説

0. このプログラムを理解するのに必要な知識
  1. import文で追加モジュールを使えるようになる
  2. random.randint関数でランダムな整数を生成できる
  3. = で値を変数に保存できる
  4. if 条件 elif 条件 elseで条件分岐できる
  5. (ちょっと詳しく)値を返すということ
1. 追加モジュールの利用

占いの結果を毎回違うものにするという要件に対して、今回は乱数を用います。
pythonの組み込み関数には乱数を生成する関数は含まれておらず、randomモジュールの中に定義されています。モジュールとは、関数の集まりで、読み込むことで利用できる関数が拡張されます。
randomモジュールは標準ライブラリなので*1、すぐに読み込み・利用が可能です。
モジュールの読み込みにはimport文を使います。

import random

これで、randomモジュールに含まれる乱数生成関数が利用可能になります。

2. 乱数の生成

今回はランダムな整数(小数ではなく)を生成しましょう。

random.randint(最小値, 最大値)

で指定範囲のランダムな整数を生成します。このことを「関数が値を返す」といい、返される値のことを「戻り値」といいます。また、上述の最小値や最大値のような関数のカッコ「( ) 」の中に記述するパラメータのことを「引数」といいます。*2

print(random.randint(1, 10))
実行結果
 7

(結果は1から10の間の整数でランダムです)
感覚的に生成された乱数を表示している様子が分かると思いますが、randint関数とprint関数が処理されていますので、きちんとした解説は次で行います。

3. 変数と代入

生成した乱数は、その後占いメッセージの決定に使いますから、保存しておきましょう。値を保存する入れ物のことを「変数」といいます。
f:id:inato_gen:20190210191812j:plain

変数に値を保存するには「=」記号を使います。

変数 = 値

変数はプログラム中に記述することで、格納されている値として評価(参照)されます。

x = 100
print(x)
実行結果
 100

print(x)が実行される瞬間(プログラムは上から1行ずつ実行されることを思い出してください)には変数xの値(内容)は100なので、このような実行結果になります。
今回のプログラムでは生成した乱数を変数に保存するので

fortune = random.randint(0, 2)

のようなプログラムになります。
変数名はおみくじということで「fortune」にしましたが、これはどんな名前でも構いません。omikujiでもxでもaaaaでも大丈夫です。自分で分かりやすい名前をつけましょう。*3

javaなど他の言語では使用する変数名を先に宣言したり、格納できる値の種類(「型」といいます)を宣言したりするものもありますが、pythonでは必要ありません。ただし、スペルミスしても自動的に変数と扱われるため注意が必要です。

fortune = 1
fotune = 2
↑変数名を間違えている
print(fortune)
実行結果
 1

4. 条件分岐

乱数が生成できたので、その数字によってメッセージを変えていきます。
実装方法にはいくつか考えられますが、今回はシンプルに乱数の値によって処理を振り分けてみます。
乱数の値は0から2、つまり0、1、2の3種類なのでfortuneが0のとき、1のとき、それ以外(つまり2のとき)の処理を記述します。
特定の条件に合致したときのみ実行する処理を実現するにはif文を使います。

if 条件1:
    条件1が成立した場合の処理
elif 条件2:
    条件2が成立した場合の処理
else:
    どの条件にも合致しなかったときの処理

条件から処理までの組を「節」といいます。上の例では、if節、elif節、else節から構成されていますが、elif節やelse節は省略が可能です。また、elif節は必要に応じて複数記述することができます。

さらに今回「処理」とした部分には複数行のコードを記述できます。このひとかたまりを「コードブロック(または単にブロック)」といい、pythonでは連続する同じインデントの行が同じブロックと認識されます。インデント…前回のfor文でも登場しましたね!for文も繰り返し範囲をブロックで表現していたんです。

今回のプログラムではfortune == 0のような式が書かれていますが、この比較式が成立するとき次に続く処理が実行され、不成立のときにはスキップされ次の節に進みます。

5. 「値を返す」ということ

変数、関数はプログラム固有の概念なのでここでつまずく方も多いと思います。また、for文やif文も丸暗記しても少し複雑になるとわからなくなります。
構成要素ごとに分けて考えることで、シンプルかつ応用が利くように理解しましょう。

①変数の評価
変数はプログラム中に記述すると、実行時に格納されている値として評価されますが、これは変数部分を値に置き換えたコードと等価なものとして扱われると考えることで分かりやすくなると思います。
xに100が格納されているとして、以下のコード

print(x)

は実行時に以下のコードに展開されている、と考えることができます。

print(100)

②関数の戻り値
関数が値を返すということも同じように置き換えで理解することができます。
randintが2を返したとして以下のコード

x = randint(1, 10)

は、以下のコードと等価に扱われているということです。

x = 2

演算子の戻り値
==のような「演算子」も値を返します。
比較演算子の場合、成り立つときTrue、成り立たないときFalseを返します。この値の種類を「真偽値」(Trueが真で、Falseが偽です)といいます。
fortuneが0だとして

if fortune == 0:

はfortune == 0が成り立つので、Trueを返します。「返す」ということは置き換えたコードと等価ですので

if True:

ということになります。
つまり、if文とはif True:になれば続くコードが実行され、if False:になればスキップするということです。

その他の演算子、たとえば四則演算子は計算した結果を「返し」ます。以上のことを踏まえると

x = 100
print(x + random.randint(1, 10))

の2行目は以下の順に展開されていることになります。

# randint関数を実行(仮に5を返したとする)
print(x + 5)
# 変数xを展開
print(100 + 5)
# +演算子を評価
print(105)
実行結果
 105

プログラミングではそれぞれの要素(変数や関数や演算子など)はどのようなシチュエーションで使っても動作が変わるわけではないので*4、分けて考える能力は非常に大事だと思います。

◼️その他の実現方式

今回は占い(おみくじ?)の結果を変動させるために乱数を用いましたが、この辺りの実現方法はさまざまなことが考えられます。例えば、実行した時刻を用いると実際にはランダムではありませんが、十分ランダムのように見えると思います。
また、完全にランダムでは不自然だということであれば、日付を使って同じ日の間は同じ結果にするなど工夫することになるでしょう。
本当の占いアプリを作るのであれば、実際の占いと同じロジックを実装することになります。

*1:標準「ライブラリ」にrandom「モジュール」が含まれるという不思議ですが、pythonドキュメントでそう呼ばれているので従います

*2:「パラメータ」でもいいと思いますが

*3:変数に使える名前には決まりがありますが、今はあまり気にしなくていいでしょう

*4:言語や構文によっては一部例外があります…

第1回-2 おみくじに、名前を入れてみよう →ユーザが入力した文字を表示しよう!

1. はじめに

先ほどは、決められた文字を表示しました。
次は、おみくじの参加者が、自分の名前を入力し、その名前を付加して「○○さん、おめでとうございます!大吉です」と出すプログラムです。

■要件

・「あなたのお名前は?」と聞いて、名前を入力してもらいます。
・その後、先ほどのおみくじを実行します。

ソースコード

print('あなたの今日の運勢は・・・')
for i in range(10):
    print('・')
print("おめでとうございます!大吉です")

※メモ 以下を見ると、もっときれいに記載ができそうだ。
https://kurokinomizuiwa.hatenablog.com/entry/2018/11/10/hatena-blog-source-code-paste

◼️実行結果

あなたの今日の運勢は・・・
・
・
・
・
・
・
・
・
・
・
おめでとうございます!大吉です

◼️解説

0.このプログラムを理解するのに必要な知識
  1. プログラムは上から1行ずつ実行される
  2. print(文字列)で文字が表示できる
  3. 固定の文字列は「"」または「'」で囲む
  4. for i in range(10): で10回繰り返す
1. プログラムの実行

プログラムは基本的に1行ずつ上から実行されます。
この例では1行目の

print('あなたの今日の運勢は・・・')

が最初に実行されることになります。
それが終わると(文字が表示されると)、次の

for i in range(10):
    print('・')

が実行されるわけですが、この説明は少し後でします。1行ずつと言ったばかりなのにいきなり2行取り上げた理由も後で説明します。
最後に、

print("おめでとうございます!大吉です")

が実行されてプログラムは終了します。

■コラム Pythonは簡単!!
今回、文字列を表示するプログラムを紹介しました。
Pythonだと、1行ですよね。
でも、C言語だと違うんです。以下みたいに、たくさん書かなければいけないんです。しかも、stdio.hとか、わけのわからない文字もあります。

#include<stdio.h> 
int main()
{ 
 printf("おめでとうございます!大吉です");
 returun 0;
}

Pythonは簡単でいいですね!!

2&3. 文字列の表示

print関数を利用します。

print(表示する文字列)

固定の文字列を表示するときには「"」(ダブルクォーテーション)または「'」(シングルクォーテーション)で囲みます。
javaでは、1文字は''、文字列は""と区別されていましたが、pythonでは区別されていません。

print("こんちくは") 
こんちくは
print('こんちくは') 
こんちくは
数字の場合は、そのままでも表示できます。 引用符で囲んでも表示できます。
print(3) 
実行結果
3
改行を含めて表示するにはダブルクォーテーション3つ「"""」で囲います。
print("""ab
cde
fg""")
ab
cde
fg
特殊な文字、たとえば、「'」を表記する場合には「¥」を付けます。英語のキーボードでは「\」(バックスラッシュ)と表現されることでしょう。これを付けないと、プログラム的な意味なのか、単なる文字列なのかが分からないからです。
print ('こん\'ちくは')
こん'ちくは

それ以外にも、いろいろと試してみるといいですよ。
参考までに、いくつか試した結果が以下です。
print("12") →12
print(12) →12
print(こんにちは) →エラー
print("こんにちは') →エラー

4. 繰り返し処理

もったいつけて説明を保留したfor i in range(10)ですが、ここでは次の処理を10回繰り返すもの、としてください。この構文をfor文と言います。
(2行まとめて取り上げたのは「次の処理」と対になっているからです。)
どこまでを繰り返しの1セットとするかはpythonではインデント(字下げ)によって表現します。for文の次にあるprint('・')の先頭についている半角スペース(ここでは4つ入れています)がインデントです。今回はインデントがついているのがこの1行だけなのでここだけが10回繰り返されて次の処理に進みます。
なので、この2行で「・」を10回表示する、という動作をすることになります。

Pythonに関する資格試験

1.Python 3 エンジニア認定基礎試験

Pythonの試験といえば、まずはこれです。
受験料金:1万円(外税) 学割5千円(外税)
問題数:40問(選択問題)
合格ライン:正答率70%
https://www.pythonic-exam.com/exam

2.日商プログラミング検定

2019年の春から始まる試験です。日商といえば簿記試験のイメージがありますが、プログラムの検定が始まります。
Pythonも追加される予定です。
https://www.kentei.ne.jp/pg-effect

3.基本情報技術者

基本情報処理技術者試験のプログラム言語としてPythonが追加
IPAの発表が以下です。
COBOL廃止、Python追加、プログラミング能力・理数能力等を重視 ~」
https://www.ipa.go.jp/about/press/20190124.html

Pythonを覚えておくと、今後に生かせる場が広がりそうですね。
また、上記サイトにもありますように、プログラム言語および、「データ構造及
アルゴリズム」の配点が増えています。

小学校でもプログラムの学習が始まります。
最初に覚えるプログラムはPythonなのかもしれません。

インストールやら、実行環境を作るのが面倒くさい

1. 実行環境無しで動作させる(Webサービスを使う)

pythonをいきなり試そうと思っても、残念ながら使えません。面倒ですよねー。

そこで、便利なサイトがあります。
たとえば、以下。

paiza.io

実行環境を用意してくれているのです。軽く試したり、まずは勉強であれば、こういう環境の方が楽ですね。

pythonではJupiterNotebookというブラウザベースの実行環境があります。例えば以下のサービスで利用することができます。

実行結果がリアルタイムに表示されたり、プログラム以外にメモが書けたりなど、試行錯誤しながら勉強するには適した機能も多いのでオススメです。

2. Windowsで環境を作ってみる

Pythonのインストール

Pythonのサイトからインストールする
https://www.python.org/
Windows版もあるので、それを選択する。
Python>>> Downloads>>> Windows
から、64ビットか32ビットなどを考慮してダウンロード

実行時には、Add Python 3.6 to PATHのチェックを入れる

Pythonの実行

①起動

WindowsPowershellから起動できる。
まず、インストールの確認として、バージョンを確認しよう。

PS C:\> python --version
Python 3.7.2

3.7.2がインストールされていることがわかる。

②基本コマンド

Linuxと同じである。
lsやらpwd、cdなどが使える

Pythonの対話型モード

pythonと入力すると、対話モードになり、コマンドを実行できる。

PS C:\python> python
Python 3.7.2・・・・・・
>>> 3+5   ←3+5を実行する
8      ←結果が表示される。

抜けるにはexit()か、quit()、Ctrl+Zでリターンを押す

④通常は、ファイルを作成する

拡張子は.pyとする。基本はすべて小文字。(このファイルをpythonスクリプトファイルといいます。)

ためしに書いてみる。とっても簡単だ。しかも、構文がわかりやすい。
Cだとprintfという無駄なfがついているのでわかりにくい。*1

print("こんちくは")

UTF-8文字コードを使う。
UTF-8の場合は以下が書かれてある。Shift-JISなどの場合は変える必要あり

# -*- coding: utf-8 -*-

エディタはメモ帳などのテキストエディタでも書けますが、統合開発環境もオススメです。ATOMであったり、Windows環境であればPowershellでデフォルトにあるISEが便利かも。

⑤実行
コマンドプロンプトから実行する場合は作ったスクリプトファイルを指定すればOK。

c:¥> test.py

PowerShellからでも実行できる。こちらの場合は、pythonと入れる。

PS C:¥> python test.py

3. Androidで環境を作ってみる

このブログをスマホで見ている人も多いと思うのですが(多いといいなあ)、スマホpythonを勉強することも可能です。
最初に触れたWebサービススマホでも動きますので、それを使うのもひとつの手です。
また、スマホ上でpythonを動かすアプリもありますので、インストールしてみるのもいいでしょう。
例えば、以下のアプリが分かりやすいです(Androidのみしか見ていませんが)

QPython3 - Python3 for Android
QPython3 - Python3 for Android
開発元:River Yan
posted withアプリーチ

QPython3にはコードエディタも含まれており、実行環境と連動しているので便利ですが、コードだけ書きたい場合は(別環境で動かす場合など)、使いやすいエディタをオススメします。いくら便利になっているとはいえ、PCに比べると入力は不便ですからね。

  • テキスト選択やコピペが正しく動作する
  • 記号の入力ボタンがある
  • コードハイライト機能がある
  • 自動インデントやクォーテーションマークやカッコの自動補完機能がある

いくつか試していますが、今はこれが使いやすいかなと思います。

Quoda Code Editor
Quoda Code Editor
開発元:Quoda
posted withアプリーチ

*1:といっても、fはformatのfで、書式指定ができるprint関数というちゃんとした意味を持つんですが。

第1回 とりあえず、おみくじを作ってみよう →画面に文字を表示してみよう!

1. はじめに

プログラムの分厚い本を最初から読むのは苦痛!という人はいらっしゃいませんか?
それが私です。飽きっぽいので、とりあえず、楽しそうなのを何か作らないと、モチベーションも上がりません。
はじめてPythonを学ぶ人向けに(というか、自分のために)、楽しみながら作ってみました。

2.おみくじを作ってみよう

おみくじを作ります。実行すると、「大吉」とか、「中吉」とかが出ます。
でも、いきなり複雑なプログラムはできません。
なので、実行したら、少し遊びの言葉を入れつつ、時間で演出しながら、「おめでとうございます!大吉です」と出すプログラムです。

■要件

・実行すると「あなたの今日の運勢は・・・」とでて、「・」が10回表示されたあとに「おめでとうございます!大吉です」と表示します。

ソースコード

print('あなたの今日の運勢は・・・')
for i in range(10):
    print('・')
print("おめでとうございます!大吉です")

※メモ 以下を見ると、もっときれいに記載ができそうだ。
https://kurokinomizuiwa.hatenablog.com/entry/2018/11/10/hatena-blog-source-code-paste

◼️実行結果

あなたの今日の運勢は・・・
・
・
・
・
・
・
・
・
・
・
おめでとうございます!大吉です

◼️解説

0.このプログラムを理解するのに必要な知識
  1. プログラムは上から1行ずつ実行される
  2. print(文字列)で文字が表示できる
  3. 固定の文字列は「"」または「'」で囲む
  4. for i in range(10): で10回繰り返す
1. プログラムの実行

プログラムは基本的に1行ずつ上から実行されます。
この例では1行目の

print('あなたの今日の運勢は・・・')

が最初に実行されることになります。
それが終わると(文字が表示されると)、次の

for i in range(10):
    print('・')

が実行されるわけですが、この説明は少し後でします。1行ずつと言ったばかりなのにいきなり2行取り上げた理由も後で説明します。
最後に、

print("おめでとうございます!大吉です")

が実行されてプログラムは終了します。

■コラム Pythonは簡単!!
今回、文字列を表示するプログラムを紹介しました。
Pythonだと、1行ですよね。
でも、C言語だと違うんです。以下みたいに、たくさん書かなければいけないんです。しかも、stdio.hとか、わけのわからない文字もあります。

#include<stdio.h> 
int main()
{ 
 printf("おめでとうございます!大吉です");
 returun 0;
}

Pythonは簡単でいいですね!!

2&3. 文字列の表示

print関数を利用します。

print(表示する文字列)

固定の文字列を表示するときには「"」(ダブルクォーテーション)または「'」(シングルクォーテーション)で囲みます。
javaでは、1文字は''、文字列は""と区別されていましたが、pythonでは区別されていません。

print("こんちくは") 
こんちくは
print('こんちくは') 
こんちくは
数字の場合は、そのままでも表示できます。 引用符で囲んでも表示できます。
print(3) 
実行結果
3
改行を含めて表示するにはダブルクォーテーション3つ「"""」で囲います。
print("""ab
cde
fg""")
ab
cde
fg
特殊な文字、たとえば、「'」を表記する場合には「¥」を付けます。英語のキーボードでは「\」(バックスラッシュ)と表現されることでしょう。これを付けないと、プログラム的な意味なのか、単なる文字列なのかが分からないからです。
print ('こん\'ちくは')
こん'ちくは

それ以外にも、いろいろと試してみるといいですよ。
参考までに、いくつか試した結果が以下です。
print("12") →12
print(12) →12
print(こんにちは) →エラー
print("こんにちは') →エラー

4. 繰り返し処理

もったいつけて説明を保留したfor i in range(10)ですが、ここでは次の処理を10回繰り返すもの、としてください。この構文をfor文と言います。
(2行まとめて取り上げたのは「次の処理」と対になっているからです。)
どこまでを繰り返しの1セットとするかはpythonではインデント(字下げ)によって表現します。for文の次にあるprint('・')の先頭についている半角スペース(ここでは4つ入れています)がインデントです。今回はインデントがついているのがこの1行だけなのでここだけが10回繰り返されて次の処理に進みます。
なので、この2行で「・」を10回表示する、という動作をすることになります。

設定メモ

Python(パイソン)
Pythonは、ニシキヘビの意味らしく、ロゴも蛇が2匹である。
・バージョン 2.x代と3.0代では大きく違う
現在では、Python3.6か3.7を使うだろう
・攻撃コード(PoCコード)などはPythonで書かれることが多い。セキュリティ系のエンジニアはPythonを使うことがよくある。
Googleのサービスでは主にPythonで書かれている。AIでも活用されている。
Pythonは手続き型のCとは異なり、オブジェクト指向型の言語です。これは、Javaと同じなのですが、Javaは基本はコンパイルしますが、
VBScriptJavascriptなどのように、スクリプト言語です。※スクリプト言語の方がわかりやすくて便利ですよねー。
・Cなどに比べてシンプルな構文になっているので、初心者でもわかりやすい言語かもしれない。
・感覚でしかないが、Javaの半分以下で書けると思う。→習得も早い
Pythonは基本はLinuxで使いましょう。Windowsでも使えるが、モジュールなどが不十分だったりする。
・解説は以下がありがたい。
http://www.tohoho-web.com/python/index.html


◆print 文字を表示する
#文字列を表示する。文字列は"で囲う
print("こんちくは") 

#改行を含めて表示するには"""で囲う
print("""ab
cde
fg""")

※・スライス
[開始位置, 終了位置, 間隔]
moji='pythonnobenkyou'
print(moji[2:10:3])
2文字目から10文字目までを3文字間隔で取得

→結果はtnb

◆変数
(1)全般
javaでもCでも型の宣言が必要だったが、不要
moji="こんちくは"

※ダブルクォーテーション”でもシングルクォーテーション’でもどちらでもいい

では、文字を変数で表示してみましょう。
moji="こんちくは"
print(moji)

(2)有効範囲
・変数は関数の中と外では、同じ変数aでも別物と扱われる
・関数の内で宣言された変数はローカル変数、外で宣言されたのはグローバル変数
・globalとつけることで、関数内に閉じない変数を宣言できる
 
(3)定数
値を変えない定数を定義する場合は、大文字で書くことが慣習。
たとえば、消費税をTAX=1.08 とする

◆データ型
cやJavaではデータ型を宣言していたが、pythonでは不要。
→便利ですよねー。
文字を入れたら文字型に、数字を入れたら数値型にしてほしいって思ってた。

参考までにtypeは、文字の型を表示する。
以下は文字を入れた場合と数字を入れた場合

>>> a="こんちくは"
>>> type(a)

>>> a=2
>>> type(a)

>>> a=12.345
>>> type(a)

Javaなどでは文字型(Char)と文字列(String)があったが、Stringで
統一されている気がする

・型変換 →キャストする、とも言います。
変数の型を指示することで、型を変換できる。
int()
str()
(例) 整数を文字と足すとエラーになるが、以下のようにstr(a)
として文字型にしている。

>>> a=3
>>> "こんに"+a
Traceback (most recent call last):
File "", line 1, in
TypeError: can only concatenate str (not "int") to str
>>> "こんに"+str(a)
'こんに3'

・辞書型がある。以外に便利なので、後述

◆演算
Pythonに限らず、CやJavaでも基本的に同じである。

  1. 足し算
  • 引き算

掛け算

/ 割り算
// 割り算で、少数以下を切り捨てる
 → 10//3  →3になる
% あまり (例)5%2 →あまり1

2乗

n+=5 → n=n+5
n-=5 → n=n-5

== 等しい
 →1==1と実行すると、一致するのでTrueが返る
!= 等しくない
><
>=<=

・優先度は掛け算や割り算が優先
3+5*2であれば、掛け算が先
(3+5)*2 とかっこをつけると、かっこの中が優先

・文字列の足し算、掛け算もできる。引き算はできない。
> "こんち"+"くは"
こんちくは
> "こんち"*3
こんちこんちこんち

・論理演算 AND、OR、NOTなど
たとえば、以下
>>> True and False  ←AND条件
False
>>> True or False   ←OR条件
True
>>> not True  ←NOT(否定)
False

◆文字入力
javaに比べたら、驚くほど簡単である。なぜ、javaはあんなに面倒なんだろうか・・・

(例文)

print("文字を入力してください")
a=input() #1行で、a=input("文字を入力してください")としてもOK
print("あなたが入力した文字は" + a + "ですよねー。")


入力された文字をint型にするには
a=int(input())

◆関数
関数はあらかじめ作成されているものもあれば、自分で作ることもできる。
関数を使うことで、毎回処理を書く必要がないので、楽である。

あらかじめ作成されている関数は以下に記載がある。
https://docs.python.jp/3/library/functions.html

先に紹介したtypeもその一例
>>> a=2
>>> type(a)

→自分で関数を作ることに関しては、後述

◆print
C言語みたいに、変数の型に応じた表示が必要。
string(文字列)型は%s、int型は%d
(例)
moji="モジ"
atai=123
print("moji= %s,atai=%d" %(moji,atai))

・改行を無しにする
printで、end=''とする。

          • (例)

for i in range(5):
print(i,end='')

◆if文
if 条件式:
 処理 #{}がないので、位置が重要。tabでインデントの調整をする
elif 条件式: #else if じゃないよ
 処理
else:
処理

(例)
a=70

if a>=80: # この条件が正しければ、以降の処理は行われない
print("Good")
elif a>60:
print("WoW")
else:
print("Sorry")

※もちろん条件を組み合わせることも可能。
a>60 and a<=70

★重要
javaなどの場合、開始と終わりが{}で囲われていた。
なので、どこまでがif文の内容なのかがわかりやすかった。
しかし、pythonでは{}がないので、改行位置で終わりを判断する。

たとえば以下は、文字列mojiの中に、sがいくつ入っているかのプログラム

moji='I am a boy.I like sushi very much'

i=1
for a in moji:
if a=='s':
print(str(i) + '番目にsがあった!')
i += 1   ←この位置が重要。上のprintと同じインデントの場合、
a=='s'の条件の続き、つまり一致したらiのカウントを足す。インデントを
前にずらすと、if文とは条件とは関係なくiが加算される。

◆for によるループ

for i in range(5):
処理

例)

for i in range(5):
 print(i)
else:
    print(str(i)+'でした')

javaなどと同様に、break、continueも使える

◆while によるループ
i=0
while i<5
print(i)
i +=1

※こちらも、elseやbreak、continuなども使える

エスケープシーケンス
// /は無効化しているので、/を意味する
/' 上と同じで’を意味する。
/n 改行
/t タブ
"""で記載すると、コメントになるが、そのあとに書いた文字の改行がそのまま使われる。

◆リスト (=CやJavaなどの配列)
便利ですね。CやJavaで初めて学習したときは、ピンときませんでしたが・・・
以下、とても詳しいです。
https://www.sejuku.net/blog/23633

添え字というか、番号は0から始まる

・宣言方法
a=[]
or
a=[75,70,80,90,70] #5教科の点数をイメージ

以下を実行してみましょう。どうなるでしょうか。
a=[75,70,80,90,70] #5教科の点数をイメージ
print(a) # [75,70,80,90,70] と表示
print(a[0]) #75を表示
print(a[3]) #90を表示
print(sum(a)) #合計385を表示
print(sum(a)/len(a)) #平均点77を表示


・リストの操作
リスト(配列)のソート(小さい順に並べる)したり、逆にしたりできる
ab=[75,70,80,90,70]
print(ab)
ab.sort() // ソートする
print(ab) // [70, 70, 75, 80, 90]
ab.reverse() // 逆にする
print(ab) //[90, 80, 75, 70, 70]
ab.insert(0, 100) //先頭に100を追加する。0は位置で、先頭。-をつけると、後ろから何番目という書き方もできる。-2であれば後ろから3番目

■配列の処理 
・clear 配列の全ての要素を削除
・remove 該当する要素の最初を削除
・del  インデックスを指定するなど
・appendで末尾(end)に追加(app)
・extendでリストを結合できる

■( )と[ ]
[ ]は配列です。()もあります。

x = ('word',123)
print(x)
y=['word',123]
print(y)
z='word',123
print(z)

⇒結果
('word', 123)
['word', 123]
('word', 123)


◆range関数
range(5)を使って、[0,1,2,3,4,5]という配列を作る
http://programming-study.com/technology/python-range/

for i in range(5):
print(i)

これにより、0から4が表示される。
単に、0から4のループとしても使える。

さて、いくつか実行してみましょう。

>>> print(range(5))
range(0, 5)
>>> print(list(range(5)))
[0, 1, 2, 3, 4]


◆関数の作成
・def 関数名:
 処理

単純な例を作ります。helloという関数を作り、hello()で呼ぶ。ただこれだけ。

          • pg1.py 


def hello():
print("こんちくは")

hello()

 
・引数を渡すことができる。引数がない関数はkan()な感じ。
・戻り値をreturnで返せる。※returnの後の処理は実行されない。

・小文字のアルファベットで作ろう。先頭に数字はダメだったはず。

スクリプト言語なので、上から順に実行される。関数の順番にも注意が必要

(例)値を入力し、その値の2倍を返すプログラムを作る


def bai(x): #これが関数
y=x*2
return y #2倍にして返り値をyとして返す

print("数字を入力してください") #画面に表示
x=int(input()) #入力された文字をxに入れる。intにしておかないと、文字列として扱われてしまう
z=bai(x) #bai(x)だけにすると、関数baiで実行した返り値を受け取ることができない。なので、受け取る箱としてzを用意
print(z) #返り値として受け取った値を表示する。

 
◆モジュール
関数よりも大きな次元で、ファイルとして部品化すること。
たとえば、印刷機能などは、どのプログラムでも使うので、モジュールとしてどのプログラムからでも呼び込めるようにしたほうがいい。

モジュールを使うにはimportする。
標準モジュールの場合は、すでに組み込まれているので、宣言するだけ。
たとえば、randomのモジュールをimportすれば、ランダム数の簡単に作成できる。

作成したモジュールの場合は、たとえばそのモジュールをmod1.py とした場合は、以下を記述する。
import mod1

そして、モジュールの中の関数を使うには、モジュールを指定して関数をつける。たとえば、mod1.func

・追加のモジュールというかライブラリはpipコマンドでインストールできる。
Linuxyumのイメージ

※パッケージとモジュール
プログラムを部品化してモジュール化しますよね。
さらに、そのモジュールをまとめてパッケージにすることができます。
__init__.py という名前のファイルが、パッケージを含むディレクトリに(基本
的には)必要です。
http://www.tohoho-web.com/python/module.html

コマンドライン引数
CやJavaと同じである。コマンドを入力する際に、引数をいくつか渡す。
※最初にsysをインポートする。

        • pg1.py

import sys
print(sys.argv[1])
print(sys.argv[2])

※sys.argvという配列(リスト)に、入力された文字が格納されている
では、上記に引数を渡して実行してみよう。

>pg1.py 10 25
10
25

◆文字列の処理
いろいろなメソッドが用意されている。

replace() →文字列の置換
find()→文字列の検索
lower()→文字を小文字にする
split()→文字を区切る

◆クラス
クラス名の先頭は大文字。c.f.変数は小文字
インスタンスを作るには、インスタンス名=クラス名()とする。

(例)成績のクラスを作り、英語と数学の合計を出す
pg1.py

class Score:  #Scoreというクラスを作成
    def sum(self,english,math): #sumというメソッドを作成。最初の引数は必ずself
        return english+math
user1=Score() #Scoreクラスのuser1のインスタンスを作成
print(user1.sum(75,85))
user2=Score() #Scoreクラスのuser2のインスタンスを作成
print(user2.sum(70,65)) 

◆コンストラク
インスタンスを作成したときに実行されるもの
Classの中にインストラクタのメソッドを書く。
具体的には、__init__で作成する。

(例)
class Score: #Scoreというクラスを作成
def __init__(self,english,math): #最初の引数は必ずself
self.english=english #このように、self.となるので、selfはインスタンスみたいなものとも考えられる。
self.math=math
def sum(self): #合計を求める
print(self.english+self.math)
def avg(self): #平均を求める。
print((self.english+self.math)/2)

user1 = Score(75,85) #user1のスコアを代入←クラスにデータを持てる
user1.sum() #user1の合計を表示 ←クラスの手続きを実行できる
user1.avg()
user2=Score(70,80)
user2.sum()
user2.avg()


インスタンス変数
インスタンスで持つ変数。→クラス変数もある
「self.変数」の形で書く。
Classは概念で、インスタンスは実体という説明をしたと思いますが、車というクラスの中に、マーチやカローラセルシオなどの複数の実体があります。
クラスで変数を定義してしまうと、すべてのインスタンスで共通の変数になります。
一方、インスタンス変数であれば、インスタンスごとに独立した変数を持てます。

◆クラスの継承
親クラスのメソッドなどを子クラスに継承する。
たとえば
class Parent: #親クラスの定義
・・・
class Child(Parent): #親クラスParentを継承
・・・

親クラスのメソッドを使う場合にはsuper()を使う


◆メモリ空間
Pythonでまメモリの領域を表示するにはidを使う。

>>> a=123
>>> id(a)
140709562806928

◆例外処理
try:
except:
これにより、例外発生(0で割る)などが発生したときの対処ができます。
たとえば、以下

pg1.py

a=int(input('数字を入力してください'))
try:
    print(10/a) #aで割るので、aが0だと例外処理にしたい
except:
    print('ダメよーダメダメ')


c:\python>test.py
数字を入力してください5
2.0

c:\python>test.py
数字を入力してください0
ダメよーダメダメ


最後に、finallyをつけると、例外処理に関係なく処理を実行できる

◆ファイル操作
pythonでは、ログファイルを見て検索したり、ファイルから何かの処理をすることがある。
こういう使い方が多いかなー。
ファイル操作はぜひ知っておきましょう。

file1=open('file1.txt') #ファイルを開く
#通常は読み込みなので、これでいいでしょう。または、モードをつけることもできる。
w 読み(read)  ⇒w+でよみ書き
r 書き(write)
a 追記(add)

#file1=open('file1.txt','r')
file1.close() #ファイルを閉じる

・ファイルを読み込む。
メソッドを覚えましょう
file1.read() #すべてのファイルを読み込む
file1.readline() #1行を読み込む
file1.readline() #すべての行を配列で読み込む

・withを使うと、close()が不要になるので便利
with open('file.txt') as file1:

・1行ずつ読み込むのは以下がいいだろう

file1 = open('file1.txt', 'r')
for data in file1:
print(data,end='') #print(data)でもいいが、end=''で改行コードを無しにしている。
file1.close()

・読んで書き出すなどもよくあるだろう。
一例ですが、以下
http://python4study.9isnine.com/file

Linux上でPythonを動かし、OSのLinuxOSのコマンドを実行する
subprocessをimportする。
いろいろなメソッドが用意されているが、たとえば、callは実行できたかを0か1で
返す。
実際には、生のコマンド結果を見たいだろうから、check_outputのメソッドを使う。
このとき、半角スペースごとにコマンドは配列に入れて、['ls','-la']のようにする。
。またはSplitで分ける。
また、decode()を入れておくと、結果が改行されて普通に見ることができる。

import subprocess
print(subprocess.check_output(['ls','-la']).decode())


◆辞書型
辞書は英語のスペルと意味を持ちます。たとえば、red:赤 のように。
このように、辞書形式というか表形式の値を持てます。
辞書型は{}で囲います。

>>> a={'English': 70, 'Math': 40, 'Science': 80} #辞書型に値を入れる
>>> type(a) # 型を確認すると、dict(辞書型)とでる

>>> print (a['Math']) #aの中のMathの値を表示
40
>>> print(a.values()) # こちらでも同じくいろいろなメソッドがあり。これは値を表示
dict_values([70, 40, 80])


■もろもろ
①コメント
1行コメントは#
複数行の場合は'''または """

②終わりの;
Javaなどであった;は不要。;を使って、2つの行を一つにすることもできる。
たとえば
a=10
b=5
→a=10;b=5

python インタプリンタ

  • i 対話モード(おそらくintructive)
  • m モジュールの指定

■pycは、pythonのファイルでコンパイル済のもの


■sort
key=lambda で、そのあとに配列の番号を指定すると、その配列でSORTをする
https://qiita.com/n10432/items/e0315979286ea9121d57

■置換 replace
word = 'abcabcabc'
print(word.replace('a', 'x'))


xbcxbcxbc

最大置換回数を指定する場合は、数字をつける

print(word.replace('a', 'x',2))

xbcxbcabc

JSON形式にエンコード
import json でインポートした後
json.dumps(a) で、変数aをJSON形式にする
https://programming-study.com/technology/python-json-dumps/

■pass
何もしないけどコードを書く必要がある場合に使う

■数値
・a=1/0
としてみる。すると、0で割ることはできないので、以下のようなエラーが出る
ZeroDivisionError: division by zero

複素数 高校でやった3+2iみたいなやつ。実数+虚数(i)
iではなく、jを使う。
ちょっとやってみましょう
c = 1 + 2j
d = 1 - 2j
e = c*d
print(e)
print(type(c))

⇒結果
 (5+0j)
 
このように、jはcomplex型です。

■引数

引数 とすると、任意の数の引数をセットできる。

https://note.nkmk.me/python-args-kwargs-usage/


■対話環境
python_history に履歴が入っている。

■日付関数 datetime
import datetime
print(datetime.date.today())
print(datetime.datetime.today())

2019-01-01
2019-01-01 02:54:52.192751