Python3超基礎(1)

今までちゃんとPythonの学習をしたことがなかったので、超基礎的な部分だけでも備忘録として残しておく。なお基本的にはPython3の学習になる

型・変数

特筆すべきものはないが、モダンな言語らしい使いやすさは感じる。

int型に上限はなく、メモリが許す限りということになる。

# int型 (python3以降はlong型が廃止されてint型に統合)
intval1 = 123 #10進
intval2 = 0O777 #8進
intval3 = 0xff #16進
intval4 = 0b11000100 #2進

Pythonのfloat型は、C言語のdouble型に相当する。

# float型
fltval1 = 1.234
fltval2 = 1.2e3  # 1.2 × 10^3
fltval3 = 1.2E-3 # 1.2 × 10^-3
# 虚数(複素数)
compval = 2.5j # 虚数 (2乗したら負の数になる)
compval = 1.2e3 + 1j # 複素数 jではなく1j
# bool型
bval = True
bval = False
# string型
strval1 = "hello world"
strval2 = "he said \"Hello.\" yesterday"
strval3 = "This is " + "a pen."
strval4 = "hello \
world"
# 型変換
print("1+"+str(23)) # 1+23
print( 1 + int("23")) # 24
print( 1.0 + float("2.3")) # 3.3
print( int(True) ) # 1
print( int(False) ) # 0
# 計算
print(1+1) # 2
print(1+1.0) # 2.0, 複雑な型に統一される(int -> float)
print(3-1) # 2
print(3-1.5) # 1.5
print(3*2) # 6
print(1/2) # 0.5 C言語みたいに`1/2=0`ではなく、ちゃんとfloat型になる。
print(10%4.0) # 2.0
print(10//3) # 3
print(9//2.0) # 4.0
print(2**3) # 8
print(2j**2) # -4+0j

日付

import datetime

#datetime
dt = datetime.datetime.now()
print(dt) # 2019-04-20 02:11:52.799008
print(dt.year) # 2019
print(dt.month) # 4
print(dt.day) # 20
print(dt.hour) # 2
print(dt.minute) # 11
print(dt.second) # 52
print(dt.microsecond) # 799008

# datetime作成
dt = datetime.datetime(2020,1,24,15,30,21)
print(dt) # 2020-01-24 15:30:21

# dateに変換
dt2 = dt.date()
print(dt2.today()) # 2019-04-20

#time delta
dt1 = datetime.datetime.now()
dt2 = datetime.datetime(2020,1,24,15,30,21)
print(dt2 - dt1) # 280 days, 0:11:44.521481

#今から10day,2hours先の未来
dt_delta = datetime.timedelta(days=10, hours=2)
dt1 = datetime.datetime.now()
print(dt1 + dt_delta) # 2019-04-29 17:21:20.630320

#書式の変換
dt1 = datetime.datetime.now()
print( dt1.strftime("%Y-%m-%d %H:%M:%S")) # 2019-04-20 02:14:44
print( dt1.strftime("%A, %B %d, %Y")) # Saturday, April 20, 2019

#文字から日時へ変換(フォーマットが合ってないとエラーになる)
date_str = "2019/04/22 14:32:50"
dt2 = datetime.datetime.strptime(date_str, "%Y/%m/%d %H:%M:%S")
print(dt2) # 2019-04-22 14:32:50

フォーマット処理(sprintfやformat)

概ね、3種類のやり方がある

# C#ライクなフォーマットは .format() を使う
print( "{0},{2},{1}".format(1,2,3) )

# C言語ライクなものは % で区切って入力
print( '%d,%d,%02d,%.02f' % (1,2,3, 0.329) )

# 文字列の連結は +
print("x="+str(0.45))

制御文

  • Bool値の判定
bval = True
if bval is not True and bval is False :
    print("bval = False")
elif bval is None :
    print("bval is null.")
else :
    print("bval is other")
  • 整数の判定
ival1 = 20
if ival1 > 20 :
    print("ival1 > 20.")
elif ival1 == 20 :
    print("ival1 = 20")
else :
    print("ival1 < 20")

ival2 = 30
if 10 <= ival2 and ival2 <= 30 :
    print("10<= x <=30")

ival3 = 100
if 10 <= ival3 or ival3 <= 30 :
    print("10 <= ival3 or ival3 <= 30")
  • 文字列の判定
strval1 = "abc"
if strval1 == "ABC" :
    print("strval1 = ABC")
elif strval1 == "abc" :
    print("strval1 = abc")
else :
    print("strval1 is other")

for、whileループ

  • range()を使ったループ
# range() その1
for ii in range(5): # for(ii=0; ii<5)
    print("ii=%d" % (ii)) #ii=0 ~ ii=4
    
# range() その2
for ii in range(5,10): # for(ii=5; ii<10)
    print("ii2=%d" % (ii)) #ii=5 ~ ii=9
    
# range() その3
for ii in range(0,10,3):
    print("ii3=%d" % (ii)) #ii=0, 3, 6, 9

# break
for ii in range(5):
    if ii == 3 :
        break
    print("ii4=%d" % (ii)) #ii4=0 ~ 2
    
# continue
for ii in range(5):
    if ii % 2 != 0 :
        continue
    print("ii5=%d" % (ii)) #ii5=0, 2, 4
  • タプル、配列、文字列
# タプル
for x in ('red','green','blue') :
    print(x)
    
# 配列
for x in ['xx','yy','zz'] :
    print(x)
    
# 文字(一文字ずつ)
for x in "This is a pen." :
    print(x)
  • while文
a = 0
while a < 5 :
    a += 1
    print("a=%d" % a)

# do ~ whileのような感じ
b = 0
while True :
    b += 1
    print("b=%d" % b)
    if( b > 5) :
        break

コレクション

リスト・配列

# リスト
col = ["cat", "dog", 0.345]
print(col) # ["cat", "dog", 0.345]

# リストの結合
col = ["cat", "dog"] + ["lion", "tiger"]
print(col) # ["cat", "dog", "lion", "tiger"]

# リストの繰り返し
col = [3] * 5
print(col) #[3, 3, 3, 3, 3]

# リストのN番目の要素
elm = [1,2,3,4,5][3]
print(type(elm))
print("elm=%d" % (elm))

# リストのN番目以降
col = [1,2,3,4,5][2:]
print(col) # [3, 4, 5]

# リストのN番目未満
col = [1,2,3,4,5][:2]
print(col) # [1, 2]

# リストのサイズ
col = [1,2,3,4,5]
print(len(col))

# リストに含まれるか
if 'cat' in ['dog', 'cat', 'snake'] :
    print("found cat")
else:
    print("not found cat")

# リストに要素を追加
col = ['dog', 'cat', 'snake']
col.append("rat")
print(col)

# リストから要素を除去
col = ['dog', 'cat', 'snake']
animal = "cat"
if animal in col :
    col.remove( animal )
print(col)

タプル

使い方はほぼリストと同じだが、以下の点が異なる

  • タプル内の要素の参照を変更することができない
  • タプル内の要素のオブジェクトを変更することはできる
    つまり、要素の追加や削除ができない
     (配列を定数化したようなイメージ?)

使いどころは?

  • 変更を許可したくないリストを定義するとき
  • Enumリストのような使い方やディクショナリのキー
  • リストよりはパフォーマンスが良い(劇的ではないが。。)

リストに似ているので省略

ディクショナリ

# ディクショナリの定義
dic = {'name': 'taro', 'gender': 'male', 'age': 23}
print(dic)
print(dic["gender"])

# 値の変更
dic["age"] = 25
print(dic["age"])

# キーの存在チェック
key = "weight" in dic
print(key) # False
key = "name" in dic
print(key) # True

# 存在しないキー値をエラーを発生させずに取得(取得できないけど)
keyval = dic.get("hobby")
print(keyval) # None
if keyval is False :
    print("keyval is false.")
if keyval is None :
    print("keyval is none.")
    
#print("hobby="+keyval) # comment out => error
print("hobby="+str(keyval)) # hobby=None
-->