python基本的な構文メモ


---
####while文
条件がTrueの間は繰り返す

```
while　条件:
```

####for文
イテラブルの値がなくなるまで繰り返す

```
for 変数 in イテラブル:
```

####条件演算子

```
Trueの場合の値　if 条件　else Falseの時の値
```
---
###リスト

```
リスト名 = [] 　　#空のリストの作成

リスト名.append(値)　　#リストの末尾に値を追加

リスト名.insert(位置,値)　　#場所を指定（インデックス）してリストに値を追加する

del リスト名[インデックス]  #インデックスを指定して削除。関数ではなくステートメント

リスト名.remove(値)  #値を指定して削除する

リスト名.pop(インデックス)　#リストから削除してその値を取得

リスト名.clear()  #全ての要素を削除

リスト3 = リスト1+リスト2　#リストを結合して新しいリストオブジェクトの作成

リスト1.extend(リスト2)   #リストの連結(リスト1の拡張)

リスト名[開始値:停止値:間隔]　#スライスして指定した範囲を抜き取る。文字列にも使用できる
lst = [0,0,0,0,0,0,0,0,0,0,0,0]
変数[:6] = [1,2,3,4,5,6]
結果　[1,2,3,4,5,6,0,0,0,0,0,0]

reversed(リスト名)   #逆順のイテレータを得る関数
使用例　list(reversed(イテレータ))     イテレータからコンストラクタで逆にしたリストを作成する

リスト名.reverse()   #逆順のオブジェクトを得る

リスト名.pop()  #引数で指定された要素をリストから削除してその要素を返す。引数に入るのはインデックスで、指定されなければ末尾の要素を削除して返す。

リスト名.clear()　　#リスト中の全ての要素を削除します。

zip(lst1,lst2) #リストの値同士のペアを作る

enumerate(イテラブル) #インデックスと値を組み合わせる

for 変数1,変数2 in zip(リスト,リスト):   unpack。組み合わせた各要素を分解して2つの変数を取り出す

変数　= [処理 for 変数 in リスト if 条件]　#処理したイテラブルを変数に代入（コンプリヘンション）

リストの集計
max(リスト)
min(リスト)
sum(リスト)
sorted(イテラブル) #昇順
sorted(イテラブル,key=none,reverse=True) 　#降順 keyには1引数関数を指定する
リスト名.sort()　　#リストのオブジェクト自体を並べ替える

リスト名.index()　　#引数にとった値をもつ最初の要素の位置をゼロから始まる添字で返す。なければValueErrorがでる。

リスト名.copy()　　#リストの浅いコピーを返す。

リストをキューとして使う例
from collections import deque
list = deque([1,2,3])
list.popleft()
>>>1

リスト内包使用例
>>>[(x,y)for x in [1,2,3]for y in [3,1,4]if x!= y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

ネストしたリストの内包表記
num = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]
[[num[i]for num in numbers]for i in range(4)]

は


for i in range(4):
    number.append（[num[i]for num in numbers])
と等価

```
---
####ディクショナリ
```

作成　
　　　　ディクショナリ名 = {キー:value, キー:value, キー:value}

取り出し　
　　　　ディクショナリ名[キー]

要素の追加
　入力例
		k = input("追加するキーを入力してください")
		d = int(input("追加するデータを入力してください"))
    		sale[k]=d

要素の変更（追加との違いはディクショナリの中にすでにキーが存在するかどうか）
		k=input("どのキーのデータを変更しますか？")
		d= int(input("データを入力してください"))
    		sale[k]=d

要素の削除
		del sale[k]

　　キーの取得
		ディクショナリ名.keys()
    値の取得
		ディクショナリ名.values()
    キー、値をタプルで取得
		ディクショナリ名.items()

    ディクショナリにほかのディクショナリを追加する
		ディクショナリ名.update(追加するディクショナリ名)
		※重複するデータは追加する値に更新される


str.replace(置き換えされる文字,置き換えする文字,*番目に見つかった文字を置き換え)

辞書内包表記
構文例
{x:x*2 for x in (1,2,3)}
結果
{1: 1, 2: 4, 3: 9}
```
---
####セット
重複する要素を持たない、順序づけられていなん要素の集合。コンストラクタで生成した場合、重複した値は統一される。空の要素を作るにはset()

```
セット名 = set([値,値,値])　　　　コンストラクタ

セット名.add(値)　　　　　　　　　 値の追加

セット名.remove(値)		 値の削除

cityA = {"値1", "値2", "値3", "値4"}
cityB = {"値4", "値5", "値6"}

print("共通するデータは",cityA & cityB)
print("Aのみのデータは",cityA - cityB)
print("Bのみのデータは",cityB & cityA)
print("すべてのデータは",cityA | cityB)
```
---
####関数

```
関数の定義
	def 関数名(仮引数)
		処理

呼び出し　
	関数名(本引数)

デフォルト引数　　　　　　　　　　　　　
	def 関数名(仮引数, 仮引数=値):　　　　この場合指定してある要素は本引数を指定しなければデフォルト値が入るデフォルトで値が指定されていない引数から記述する。

キーワード引数
	関数名(本引数, 本引数=値, 本引数=値)　　　　　本引数で代入し順番に依存せず、引数名で値が仮引数に渡される

可変長引数
	def 関数名(*引数名自由):　　　　　仮引数の前に*をつけると本引数から複数取得し、タプルで格納。

　　　　def 関数名(**引数名自由):　　　　　仮引数の前に*をつけると本引数から複数取得し、ディクショナリで格納。

複数の戻り値を返す
　　　　def 関数名():
           return 値,値,値
       変数1,変数2,変数3 = 関数名()       呼

び出し元でアンパックして代入できる

		
```
---
###その他

```

ラムダ演算子
　　キーワードlambdaを使うと名前のない小さい関数を生成できる。
　　lambda　渡される引数:式
　構文例
　　data = [1,2,3,4,5]
　　x2 = []
　　for d in map(lambda x:x*2, data):
    　　x2.append(d)
　　print(x2)
　出力結果
　　[2,4,6,8,10]

map()関数
　　引数に関数とイテラブルを指定し、組み合わせる関数。上ではラムダを第一引数としている
　　上の構文例ではfor文を使って無名関数による処理が行われた結果を得る。戻り値はイテレータ

   リスト内包を使った例
　　　　lst = list(map(lambda x:x*2,data)

firter(関数, イテラブル)
　　第２引数を処理する関数
　　イテラブル：リストなどのイテレート可能なオブジェクト
　　戻り値：イテレート可能なオブジェクト


yield文    #繰り返しをそこでいったん止める。また呼び出されたら動き、一周してまたそこで止まる。その時、値を返す

global 変数名   #ローカル変数名の前に書くと、そのローカル変数はグローバル変数として扱われる

dir()   #その場所でその時に定義されている変数の名前を確認することができる

abs(変数)　　#絶対値の取得
```

---
####クラス

```


インスタンス操作

　　インスタンス変数 = クラス名()        インスタンスの生成（コンストラクタ）して変数に代入
　　
　　インスタンス変数名.データ属性名 = 値　　　　　データ属性に値を代入

　　インスタンス変数名.メソッド名（引数リスト）　　　メソッドの呼び出し
　
　　インスタンス変数名（属性名）　　　　インスタンスの属性値の取り出し

コンストラクタ
	def __init__(self,　引数リスト):

　　　　構文例　　def __init_(self, 属性1, 属性2):     #インスタンスを作成する際に呼び出される
		self.属性1 = 変数　　#属性名の指定
		self.属性2 = 変数　　 #属性名の指定
	すると
	　変数 = クラス名(属性値1, 属性値2)　　　#これでインスタンスを作成できるようになる
	
	pr(属性名1,属性名2)	          #属性値の取り出し


クラスメソッド
　クラス全体の値を扱うメソッド。@classmethodという指定の下に定義する。
　　構文例　@classmethod
	def 関数名(cls):
	return cls.データ属性

呼び出し
	クラス名.関数名()

カプセル化
_属性名　　勝手にデータ属性を変えないように慣習的な命名をする
__属性名　　アクセスを制限する

マングリングされた値の取り出し
	インスタンス変数名._クラス名マングリングされた属性名(クラス変数も同じ)

セッターとゲッター
　　バイパスのような仕組みを使用してマングリングされた値を取り出したり更新したりもできる。
	property(取得する関数名,設定する関数名)


基底クラスのコンストラクタを呼び出し
	super().基底クラスのコンストラクタ()

名前の決められたメソッドに処理を定義する
　　　__呼び出しの名前に応じたメソッド名__(self):
     　　　　処理

```
---

####文字列操作

```
文字列置き換えフォーマット
　　%演算子のフォーマット
	文字列内で%dなどと記述しその後%で続いて変換したい値を後ろに記述する。
　　構文例
	print("\rNo, %d" % i, end="")

　　　　
        文字列[開始値:停止値:間隔と方向] 　文字列のスライス 
	文字列.upper() 	文字列を大文字に
	文字列.lower()	文字列を小文字に
	文字列.swapcase()	大文字と小文字を反転
	文字列.capitalize()	先頭を大文字にする
	文字列.title()	単語ごとに先頭の文字を大文字にする
	文字列.center(文字数)	文字列を引数の範囲の中でのセンターに表示する
	文字列.ljust(16)	文字列を引数の範囲の中で左寄せ
	文字列.rjust(16)	文字列を引数の範囲の中で右寄せ
	文字列.strip()	文字列の前後のスペースまたは引数に入れた文字を取り除く
	文字列.lstrip()	左のスペースを取り除く
	文字列.rstrip()	右のスペースを取り除く　使用例　改行を無効化したりできる
	文字列.split()	文字列を引数に入れた文字で区切る。デフォルトでは空白で区切る
	文字列.split(sep",", maxsplit = 2)     ,で区切るが、二回までしかくぎらない
	文字列.splitlines()        文字列を行で分割して各行をリストで取得する。引数にTrueを含めると改行を含む
	文字列.join()	引数にイテレータの文字列を入れると結合して取得する


文字列を検索
	文字列入り変数.find(検索する文字列)　　#発見した文字の位置を返す。無い場合-1を返す

format関数の構文
　　print("{インデックス番号:位置 表示するスペース数 桁のカンマ 少数点以下の桁　データ型}" .format(表示する値入り変数))
構文例1
	str ="{2}は{1}{2}です".format("今日","よい","天気")

	出力結果
	天気はよい天気です


import myperson      #fromなどをつけない場合の書き方
 
class Customer(myperson.Person):　　#Customerの引数にモジュール名とクラス名を追加することで指定している
    def __init__(self, nm, ag, ad, tl):　　　#コンストラクタで基底クラスを利用
        super().__init__(nm, ag)


文字の検索

　　find()メソッド　　文字列をの中を検索して文字の位置を整数で返す。見つからない場合-1を返す
	構文　検索される文字列.find(検索する文字)
　　rfind(メソッド　　findの逆からの位置を返す（文字末から）
　　index()メソッド　文字の場所を返す（findと同じ）
　　count()メソッド　文字の個数を数える
　　startwith()メソッド　　引数に入れた文字で文字列が始まればTrueを返す
　　endswith()メソッド　引数に入れた文字で文字列が終わればTrueを返す

小技
　　　　　lower().count(数える文字)　　　
	まずはすべてを小文字にしてからcountする。このように同じ行で処理して帰ってきた文字列を次の文で処理できる。
　　　　　　　pythonではこのような処理が可能なのでコードを詰めて書くことができたりする
　　
場所を知りたくない場合はinを使う
　　　　if 検索する文字　in 検索される文字列:

文字の置き換え
	検索対象.replace(置き返される文字,置き換える文字,回数(省略したらすべて置換え))


```
---

####正規表現

```
正規表現
　　検索条件はパターン、パターンを指定してコンパイルという処理を行っておく
構文例
	コンパイル済のパターンを表す変数  = re.compile(パターン) 

　	コンパイル済のパターンを表す変数.search(検索対象の文字列)
		なければNoneが返される


メタ文字

　　　　　^  行頭
　　　　　$　行末
         .  任意の一文字

構文例　
	import re 

	ptr = ["TXT", "^TXT", "TXT$","^TXT$, ..TXT"]
	str = ["TXT", "TXTT", "TXTTT","TTXT, TTTXT"]

	for valueptr in ptr:
    		print("------")
    		pattern = re.compile(valueptr)　　　#re.compileによってパターンを設定
    		for valuestr in str:
        			res = pattern.search(valuestr)　　　#searchで引数からpatternを検索する
        			if res is not None:
            				m = "〇"
        			else:
            				m = "×"
        			msg = "(パターン)"+ valueptr + "(文字列)" + valuestr + "(マッチ)" + m
        
        			print(msg)
        			print(res)

文字列クラス
　　[]でかこったなかのいずれかの文字列をを検索する。頭に^をつけると否定形になる
　　　構文例　
	ptr = [012]
	str = 0
　　　　　　　pattern = re.compile(ptr)
	res = pattern.search(str)
	結果　　　res空白（マッチしなかったらNoneを返すため）



メソッドは数珠つなぎで使用　
  例
　　　文字列.lower().count(文字)  #文字列を小文字にしてから文字を検索する


繰り返しを表す正規表現
	文字*  0回以上　　（直前の文字が0回以上繰り返し）　be*r →br,ber,beer,beeeeer
	文字+ 1回以上　　　be+r →　ber,beer,beeeeer
	文字? 0回または1回　　　be?r　　→    br,ber
	文字{a回} 　文字{a回,}  　a回以上　　文字{a,b}  a～bまで

上の繰り返しを表す正規表現では繰り返しの最も長い部分にマッチするようにできているので
最短部分をマッチするにはstr = aaabaaならばstr[0]にマッチする　　文字+?の場合
	文字*?   0回以上の繰り返しのうち最も短い部分にマッチ	
	文字+?  1回以上の繰り返しのうち最も短い部分にマッチ


正規表現にマッチした文字を置き換える
	コンパイルされたパターンオブジェクト.sub("置換える文字",置換えされる文字を含んだ文字列オブジェクト)


　　¥を文字の前につけると、パターン設定で文字として使用できる
	使用例　 ¥. や　¥++(+が一回以上くりかえし)　など

　　()はパターンをグループ化するときに使用する。また、|は選択する文字を区切る　　
	例　(文字){2}→　文字の二回以上の繰り返し　
	例　(文字|文字|文字)


```
---

####ファイルと例外処理

```ファイルと例外処理

　ファイルの呼び出し
	import 形式名

　テキストファイル
	ファイル変数　= open(ファイル名,オープンモード,文字形式（utf-8などの指定があれば）)　
	ファイル変数.write(書き込む内容)    テキストファイルに書き込む　　
	ファイル変数.readlines()   テキストファイルを読み込む
	ファイル変数.close()     ファイルをクローズする
	with open(ファイル名,モード)　as　ファイル変数:　　　close()しなくてよい記述方法

　構文例　書き込み	
	f = open("sample.txt","w",encoding="utf-8")
	f.write("こんにちは\n")
	f.write("さよなら\n")
	f.close()
  構文例　読み込み
	f = open("sample.txt", "r",encoding="utf-8")
		lines=f.readlines()
		for line in lines:
    			print(line,end="")
		f.close()

　　CSVファイル  　　,で区切られたデータ。
	csv.reader(ファイル変数)　　　　ファイルの読み込み
	csv.writer(ファイル変数)　　　　　ファイルに書き込み
　　
　　JSONファイル　　読み込んだらディクショナリ。
	json.load(ファイル変数)
	json.dump(ディクショナリ形式で書き込む内容, ファイル変数)
	
	構文例
		import json
			with open("Sample2.json", "w", encoding="utf_8") as f:
   			 json.dump(data, f, ensure_ascii=False, indent=4)

例外処理
　　基本構文
	try:
		処理
	except:
		例外が発生した時の処理
	else:
		例外が発生しなかった時の処理
	finally:
		例外があってもなくてもする処理

　　
　自分で定義する場合
	class 例外クラス名(Exceptionクラスかそのサブクラスから拡張):
	例　class MyException(RuntimeError):
　　　　呼び出し側
　新たな例外を定義
		raise 例外クラス名
	例　　if n >= 10                       #例外をif文で作成
	    	raise MyException
	

datetime.datetime.now()    現在時刻を取得する

datetimeオブジェクト引数.strftime(書式)　　　　日時情報から文字列を取得する
datetimeオブジェクト引数.strptime(日時,書式)　　　文字列から日時情報を取得する

ネットワークの利用
urlopen()関数
	openしたurを入れるl変数 = urllib.request.urlopen("URLを指定")　　URLを指定して開く
	読み込んだurlを入れる変数 = openしたurl変数.read()     urlを読み込み
	文字列を入れる変数　=  読み込んだurl が入った変数.decode()


```

####モジュールの利用

```

import モジュール名　　　基本の形

import モジュール名　as 自分でつけるモジュール名

from モジュール名　import クラス名, クラス名
 インスタンスの生成などの時、クラス名を記述するだけでいい。
 例　変数= クラス名(属性値,属性値,)

from モジュール名　import *
 モジュール内のすべてのクラスをインポート


```

##まとめ
人に見せれる代物ではないほど散らかっているので、とりあえず個人的メモとして保存。
検索に引っかからないことを祈る。