pythonの学習サイト
YoutubeCord.org
pythonのインストール方法(Windows)
pythonのインストール方法(Mac)
命名規則
変数, 関数: 小文字と"_".定数: 大文字と"__".
クラス: 最初の一文字と、各単語の最初の文字を大文字. 例) ClassOneTwoThree. 例外もクラスであるのでこの規則を適応する. 例外の名前の末尾はErrorにする.
規約
#!/usr/bin/env python# -*- coding: utf-8 -*-
"="の前後には空白を入れる. ただし, キーワード引数のイコールには入れない.
主にダブルクオーテーションを使う.
複素数にjを使うのでiとkだけを用いる.
if, while, for文は括弧で囲む.
ライブラリ
TensorFlow: Googleが中心となって開発しているオープンソースのディープラーニング専用のライブラリ.Beautiful Soup: Webスクレイピング.
Selenium: Webスクレイピング.
pythonの基礎文法
- 変数の先頭の1文字目に数字を使うことはできない.
- シングルクォーテーション, ダブルクォーテーションどちらを使っても良い.
- 複数行をまとめてコメントする場合にはコメントの部分をシングルクォーテーション3つ, またはダブルクォーテーション3つで囲む. ドキュメンテーション文字列という.
- int(), float()でそれぞれfloat型をint, foloat型をintに変換できる.
- 文字列はイミュータブルであり, 変更できない.
- 文字列もスライスできる.
- round()関数は偶数への丸めを行うために厳密に四捨五入を行うときはdecimal.quantize()関数を利用する.
- pythonのfloatはIEEE 745の倍精度小数点演算形式が用いられる. 64bitで浮動小数点を表現する.
- pass 何もしない.
- """で複数行にわたって文字列代入した場合, 改行したところで\nが自動で入れられる.
- //割り算の商, %割り算のあまり.
- 変数=input("画面に出力する文字列") inputで数字を入力しても文字列として認識されるので, 数字として入力する場合は, 変数=float(input("画面に出力する文字列"))とする.
- 長い命令を途中で改行したいとき, 行の末尾に\をおく. このとき, コメントをつけることはできない
- 括弧内なら\を打つことなく改行しても構わない.
- unixでは, 改行コードをLFにしなければならない.
- chmod +x hoge.pyで権限をつけて, ./hoge.pyで実行
print('Hello', name, 'さん',sep='',end='')
raw文字
print(r'C:\windows\AppPatch\en-US')print(r'usr/bin/bash')
型
type()を使うと型がわかる.intで作った後にfloatを代入するとfloatになる. その後intを代入するとintになる. したがって方はその都度変わっていく.
a=1
print(type(a)) #>>> < class 'int'>
a=1.0
print(type(a)) #>>> < class 'float'>
a=1
print(type(a)) #>>> < class 'int'>
floatに代入するとき指数表記でも良い.
1.7e3
1.7E3
大文字でも小文字でも良い
アンパック代入
a,b,c=[0,1,2]data=[1,2,3,4,5]
a,_,b,_,c=data
*a,b,c=data #a=[1,2,3], b=4,c=5
比較演算子
< ,>, ==, <=,>= ,!=is [not] # 左辺と右辺のオブジェクトが等しい場合にTrue# [1,2] is [1,2]
[not] in # 左辺が右辺に含まれているか# 3 in [1,2,3]
近似比較
比較するとき, intなら気にしないで良いが, floatの場合, 無限小数になることがあるので注意が必要である. 0.2*3==0.6 がFaleseになる. 次の2つの対処法がある.1.
abs(0.2*3-0.6) < 0.00001 2.
math.isclose(0.2*3,0.6) #(デフォルトで小数点9桁)
math.isclose(0.2*3,0.6,rel_tol=0.0001) #小数点を設定できる.
イテラブル

tupleの要素を取り出すときもlistと同じ表記で, my_tuple[0]のように表記する.
スライス
シーケンス名[開始位置:終了位置:ステップ]
省略すると[0,len(シーケンス名),1]になる.
全て省略した場合, シーケンスのcopyが得られる. これは値渡しになるので, ポインタを渡すだけの参照渡しではない.
list2=list1[::]
=> list2 = list1.copy()
スライスによる変更と削除
まとめて変更リスト名[開始位置:終了位置:ステップ]
まとめて削除
del リスト名[開始位置:終了位置:ステップ]
# del構文はオブジェクトを削除(メモリ上から破壊する)機能を持つ.
# del オブジェクトで使う.
リストの演算
文字列, リスト, タプルの要素が増える.複合演算子も使える.
list1 = [1,2,3]
list1 += [4,5] # [1,2,3,4,5]
index, countメソッド
シーケンス名.index(データ)# 引数で指定されたデータが最初に見つかった位置の添字を返す.
シーケンス名.count(データ)
# 引数で指定されたデータがシーケンスの中にある個数を返す.
pythonは全てのデータがオブジェクトである
"hello".isdigit() #>>> falseどんなデータ型でもイテラブルの要素にできる.
list1=[1,"hoge"]
print(type(list1[0]),type(list1[1]))
#>>> < class 'int'> < class 'str'>
文字列も演算できる
例)str1="Hello\n"+"World"
>>> HelloWorld
str2="Hello"*3
>>> HelloHelloHello
リストの添字にはマイナスも設定できる.
末尾はlist[-1]list[-3:]
=> list[-3:-1:0]
=> [list[-3], list[-2], list[-1]]
破壊的(インプレースin-place)演算
sorted(list)はlist自体は変更されない.list.sort()はlist自体がソートされる.
list2=sorted(list)はできるが, list2=list.sort()をすると, list2はNoneになる.
降順にsort
sorted(list,reverse=True)
# デフォルトでFalseと昇順になっているのでTrueにすると降順になる.
reverse(list) #list自体は変わらない list.reverse() #list自体が逆順になる
enumerate
行番号(0から)と多次元配列を作る.list1=[4,5,6]
a = [list(x) for x in enumerate(list1)]
# >>> [[0, 4], [1, 5], [2, 6]]
listnの主なメソッド
append(x), appendleft(), extend(iterable), insert(i,x), remove(x), pop(i), popleft(), clear(), index(x), count(x), sort(key, reverse), reverse()list1.pop()
=> list1.pop(len(list)-1)
list.pop()だと, popされて画面に出力されるが,
a=list.pop()にすると, aに代入され, 画面に出力されない.
append()はスタックする.
list1.extend(list2)
=> list1+=list2
insert(i,x)
はn番目(n >= i)の要素をn+1番目の要素にしてi番目の要素をxにする.
list.clear()はリストの要素を全て消す. []になる.
3項演算子
値1 if 条件 else 値2例)
a= 500 if age <= 12 else 1000
=>
if age <=12: a=500 else: a = 1000
論理演算子の優先順位
not > and > ornotは直後にしか効かないので, 全体を否定するときはnot()を使う.
if文
False, None, 0, からの文字列, 空のiterableは偽とみなされる.if(a < b < c ):
=> if(a < b and b < c ):
for文
for x in list:# C言語 for(int i =0; i < 100; i++)
for i in range(100):
=> for i in range(0:100:1)
range(10,5,-1)
=>[10,9,8,7,6] #5は入らない.
break, continue
1重だけループを抜ける.例)
while True:
if price=="q"
break
zip関数
for a,b in zip(my_listA,my_listB):print(a,b)
# len(my_listA) = len(my_listB)でなければいけない.
list(zip(my_listA,my_listB))とすると, [(A0,B0),(A1,B1),(A2,B2)]のようにタプルで返される. タプルにしないためには下記のように記述する.
[list(x) for x in zip(my_listA,my_listB)]
#xにタプル(a,b)として代入され, それをlistに変換している.
リスト内包表記
list1=[要素を使った計算式 for 要素 in イテレータ]=>
list1=[]
for 要素 in イテレータ:
list1.append(要素を使った計算式)
[要素を使った計算式 for 要素 in イテレータ if 条件式]
例)
squares = [n**2 for n in range(1,6) if n%2 == 1]
multiple = [i*j for i in range(1,4) for j in range(1,4)]
2次元配列から2次元配列を作る.
list1=[[1,2,3],[4,5,6]]
list2=[[j + 3 for j in i]for i in list1] #全ての要素に3を足す.
フォーマット f文字列
a = f"私は{list}です"#str()で文字列に変換する必要がない.
#注意!数値は四捨五入ではなく偶数側への「丸め」です。(5捨6入)
a = f"半径{radius:.2f}"
raw文字と併用するときはfr''のように使う
print(f'percent: {f:.2%}')
# percent: 12.30%
少数点2桁%
print(f'exponen: {f:.3e}')
# exponen: 1.235e+01
少数点3桁指数表記
mathモジュール
sqrt(),sin(),cos(),tan(),radians(),degrees(),log(),fabs(),ceil(),floor(),factorial(),gcd()このサイトによくまとまっている.
エラー
エラーには構文エラー(Syntax Error)と例外(Exception)がある.文字列チェック
"abcABC".isalpha() #英字"123".isdigit() #数字
"abcABC123".isalnum() #英数字(アルファベット ナンバー)
"abc".islower() #英字小文字か
"ABC".isupper() #英字大文字か
# これら全ては記号(#$$%など)はFalseになる.
例外(Exception)処理
except句は順番に確認していき, 当てはまると他のexcept句は確認されない.NameError: 変数が定義されていないとき
ZeroDivisionError: 0で割り算を行なったとき
TypeError: 数値と文字列など型が異なる値を合わせようとしたとき. タイプ相性が悪いとき.
ValueError: 整数に変換するときに文字列が数字ではないなど型が不適切なとき.
try:
通常の処理
except ValueError:
ValueErrorが発生した時の処理.
except:
それ以外のエラー
else:
エラーが発生しなかった時
ユーザ定義例外
1.try:
通常の処理
if(not(NUM=1 or NUM =2)):
ranse ValueError("NUMは1か2にしてください.")
except ValueError as msg:
print(msg)
2.
class MyError(Exception): #exceptionを継承 pass
try:
raise MyError
except MyError:
print("MyErrorが発生しました.")
while文
Trueの間繰り返す.whileの特定の条件下でFalseになってループを抜けるか,
無限Trueでbreakで抜けるか.
ゼロか空オブジェクトはFalse
while文でもfor文でも繰り返しブロックの後にelseブロックをおくことができる.
繰り返しの最後まで終わった後に1回だけ実行したい処理がある時に使う.
elseブロックは「breakされなければ」と覚える.
関数
関数に引数と戻り値があることは必須ではない.def function(hoge1,hoge2):
hoge3=hoge1+hoge2
return hoge3
hoge4=function(hoge2=3,hoge1=4)
陽に引数=数字とした場合には, 引数の順番は変更できる.
タプルのアンパックによって, 複数の戻り値を返すことができる.
def function():
return (a,b,c)
デフォルト引数の後に普通の引数があってはいけない.
ダメな例) def function(variable_x=1,variable_y):
可変長引数
def variable_args(first,*args):print(args)
最初の引数がfirstに2番目以降の引数がargsにタプルとして格納される.
map()
numpyを使わずにlistの要素一つ一つに演算を行う.list(map(function,list))
例)
list1=[1,2,3]
def double(x):
return x*2
list2=map(lambda x: x*2,list1)
print(list(list2))
>>> [2, 4, 6]
filter()
list1=list(range(6))list2=list(filter(lambda x:x % 2,list1))
print(list2)
>>> [1, 3, 5]
# このように引数に関数をとる関数を高階関数と呼ぶ.
pythonの関数は参照渡し
参照渡しなのでミュータブルなイテラブルを関数の引数に渡すと関数内での変更が関数の外でも反映されてしまう. int, float, strはイミュータブルなので変更が反映されることはないため, 値渡しになる.x="hoge"
y=x
x="apple"
print(x,y) #>>> apple hoge
# コピーされるわけではないが, y=xとした後にxで新しいオブジェクトを代入して作ったとみなされるときは, 値渡しのようになる.
x=1
y=x
x=3
print(x,y) #>>> 1 3
x=1.7
y=x
x=3.14
print(x,y) #>>> 3.14 1.7
x=[1,2]
y=x
x=[3,4]
print(x,y) #>>> 1 3
x=[1,2]
y=x
x[0]=3
x[1]=4
print(x,y) #>>> 1 3
如実にイミュータブルが反映される例
def double(x):x=x*2
return x
x=1
y=double(x)
print(x,y)
>>> 1, 2
def double(list1):
list1[0]=3
return list1
list1=[1,2,3]
list2=double(list1)
print(list1,list2)
>>> [3,2,3][3,2,3]
スワッピング
スワッピング可能x,y=y,x
ジェネレータ関数
ジェネレータ関数とはyeild文を使用する関数のことである. 前に実行した結果が保存され, 次々に処理が実行されるようにできるのがジェネレータ関数である. ジェネレータ関数は処理を順に追って行っていくときに前の値を保持しておく必要がないときに使用される. リストを使用するとリスト全体を保持しておく必要があるためメモリを多く消費してしまうがジェネレータ関数は直前だけを保持するのでメモリを節約できる.def count_up():
n =1
while True:
yield n
n+=1
generator=count_up()
next(generator) #>>> 1
next(generator) #>>> 2
lambda 関数
プログラムの特定の場面だけに使われ, 処理が1行だけの時lambda式を使う.ラムダ関数が最もよく使われるのはデータをソートする場合である.
month_name=[[1,"January"],[2,"February"],[3,"March"]]
sorted(month_name,key=lambda x:x[1])
警告
警告を全て無視して非表示にする.import warnings
warnings.simplefilter('ignore')
class
関数が外部から渡されたデータ(引数)を使って処理を行うのに対し, メソッドはクラスが内部に保持しているでデータを使って処理を行う.共通で同じ変数を使用する関数をまとめて, クラスを作成する.
クラス自体は抽象的なデータ型でそのままでは実行できない.
クラスからインスタンスを作成する必要がある.
初めの文字は大文字にする.
クラス自体は抽象的なデータ型でそのままでは実行できない.
内部に保持しているデータの値が初期値の状態から様々に変更されて, それぞれの時点でその時点のデータの値で処理を行うという用途があってこそ関数ではなくクラスを使う意味がある.
イニットメソッド
def __init__(self,variable_x,variable_y):
# インスタンスを作成したときに, 生成される.
self.variable_x=variable_x
self.variable_y=variable_y
# 名前にselfをつけることでクラスが内部に保持するデータと, 引数やローカル変数を区別できる.
クラス変数
class MyClass:
PI=3.14
def hoge(self):
surface = r**2 * MyClass.PI
クラスメソッド
インスタンスが存在しなくても処理できるメソッド.class MyClass:
@classmethod
def radians(cls,deg):
return deg*(cls.PI/180)
Circle.radians(180) # >>>3.14
# クラスを関数のように使うことができる.
継承を行わないならcls.PIとMyClass.PIは同じ.
MyClass2へ継承を行なった場合,
cls.PI => MyClass2.PI # (現在のクラスの定数).
MyClass.PI => MyClass.PI # MyClassの定数.
MyClass2.PI => MyClass2.PI # MyClass2の定数.
となる.
インヘリタンス
class Subclass(Superclass):で継承(インヘリタンス)できる.
カプセル化
クラスの外からアクセスを制限する(イミュータブルにする)ことをカプセル化という.カプセル化を行って外部から参照できなくした変数のことをプライベート変数という.
Pythonではダブルアンダースコア"__"をつけるとその変数はプライベート変数になり, カプセル化を行うことができる.
インスタンス名.インスタンス変数名とすればインスタンス変数の値を取得できる.
インスタンス名.インスタンス変数名=値とすると, インスタンス変数の値を変更できる.
プロパティ
class MyClass: #初期化メソッド, カプセル化
def __init__(self,variable_x):
self.__variable_x=variable_x
# インスタンス変数variable_xのgetter
@property
def variable_x(self):
return self.__variable_x
# インスタンス変数variable_xのsetter
@variable_x.setter
def variable_x(self):
if(isinstance(variable_x,int) or isinstance(variable_x,float)):
self.__variable_x=variable_x # こうすることでvariable_xに代入する値が適切な時だけ書き込める.
# instance(オブジェクト, クラス名)は引数で指定されたクラスのインスタンスならTrueを返す.
# setterを作らずにgetterのみ作った場合は, 値の読み出しのみができるリードオンリーのプロパティになる.
コピー
pythonのリストの変数を別の変数にコピーすると, コピーされた変数には先頭のポインタの値が格納される. そのためリストそのものの値は複製されない.プログラミング言語によってはlist1=list2でオブジェクトのコピーができるがPythonではできない.
import copyが必要.
変数=copy(オブジェクト)
2次元以上の配列の場合は,
変数=deepcopy(オブジェクト)
を使う.
ファイルの出力
モード: "wt", "a"encoding="utf-8"
with open("sample.txt","wt",encoding="utf-8")
in 演算子, not in 演算子
データ in イテラブルデータ not in イテラブル
イテラブルの中にデータが一つ以上あればTrue(/False).
クロム
https://sites.google.com/a/chromium.org/chromedriver/downloadsでドライバーをインストールこの時, クロムのバージョンにあったものを使用しなければならない.
pythonでpip install selenium
https://chrome.google.com/webstore/detail/selenium-ide/
mooikfkahbdckldjjndioackbalphokd/related?hl=ja
でselenium ideの拡張機能追加
無形関数lambda
(lambda a,b:a*b)(3,10)numpy
data=np.array([9,2,3,4])print('次元数:,data.ndim')
print('要素数:',data.size)
data*2 #listと違って要素を2倍にできる.
data**2
data1/data2
など割り算や掛け算もできる
data.sort()
data[::1-].sort()#降順ソート
data.min()
data.sum()
乱数
import numpy.random as randomrandom.seed(0)
random.randn(10)#正規分布, 平均0, 標準偏差1の乱数
random.rand()#0から1の一様分布
データのランダムな抽出
print(random.choice(data,10))print(random.choice(data,10,replace=False))#重複なし
