■LinuxでPython
①インストール
# yum -y install python3

※Centos7だと、デフォルトでPython2がインストールされていると思う。

②バージョンの確認
# python3 --version
Python 3.6.8

③Pythonの実行。対話モードで実験
[root@localhost user]# python3
>>> 1+2
3

このように、プログラムが動いてくれる。

■PythonをLinuxで
いろいろと処理をしてもらった。やはりPythonは便利だと思う。

①Pythonの起動
#python3
>>>
②四則演算の実行
>>> 1+3
4
③抜ける
>>>quit()

(1)CTF問題。配列を降順に並び替える
https://ctf.cpaw.site/questions.php?qnum=14

単純化して、[15,1,93,52,66,3]を降順に並べ替えたいと思う。

# python3
>>> a=[15,1,93,52,66,3]  ←aという配列に値を入れる
>>> a.sort()    ←ソートする(昇順)
>>> print(a)
[1, 3, 15, 52, 66, 93]
>>> a.reverse()   ←降順に並べ替え
>>> print(a)
[93, 66, 52, 15, 3, 1]
>>> b=map(str,a)   ←数字はこのあとのjoinが使えないので、文字に変換
>>> c=''.join(b)  ←結合して結合した間には''として何も入れない
>>> print(c)   
9366521531  ←CTFの目的の結果が得られた。

---以下は設定メモ
https://python3.hateblo.jp/entry/2019/02/03/103544

◆Python(パイソン)
・Pythonは、ニシキヘビの意味らしく、ロゴも蛇が2匹である。
・バージョン 2.x代と3.0代では大きく違う
現在では、Python3.6か3.7を使うだろう
 ・攻撃コード(PoCコード)などはPythonで書かれることが多い。セキュリティ系のエンジニアはPythonを使うことがよくある。
・Googleのサービスでは主にPythonで書かれている。AIでも活用されている。
・Pythonは手続き型のCとは異なり、オブジェクト指向型の言語です。これは、Javaと同じなのですが、Javaは基本はコンパイルしますが、
VBScriptやJavascriptなどのように、スクリプト言語です。※スクリプト言語の方がわかりやすくて便利ですよねー。
・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.足し算
2.引き算
3.掛け算
4.割り算
// 割り算で、少数以下を切り捨てる
 → 10//3  →3になる
% あまり (例)5%2 →あまり1

5.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):
処理

例)
pythonfor 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コマンドでインストールできる。
Linuxのyumのイメージ

※パッケージとモジュール
 プログラムを部品化してモジュール化しますよね。
さらに、そのモジュールをまとめてパッケージにすることができます。
__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
pythonclass 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
pythona=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