python_basic
おドン
python_basic
準備中
準備中
準備中

pythonの学習サイト

Youtube
Cord.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の基礎文法

print

デフォルトでsepはスペース, endは\nになっている.
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 > or
notは直後にしか効かないので, 全体を否定するときは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 random
random.seed(0)
random.randn(10)#正規分布, 平均0, 標準偏差1の乱数
random.rand()#0から1の一様分布

データのランダムな抽出

print(random.choice(data,10))
print(random.choice(data,10,replace=False))#重複なし
Copyright (C) 2017 Odon Laboratry  All Rights Reserved.