【Python】これは便利だなーとメモしたまとめ(基礎編)

★編集中★

勉強ついでにメモ程度にまとめます。基本的には書いたソースは実際に検証しながら書いています。コメント部分に結果を書いていることが多いです。

他のプログラミングでの経験を元にこれは便利だと思ったり、今後使いそうと思ったことをメモしておきます。個人的かつ感覚的な重要度も合わせて記載しておきます。
※重要度は数字が大きくなるほど重要とします(★1などで表記)

乗算は「a*b」、減算は「a-b」など、他のプログラムと同じだったりすると、記載しません。

★1・・・気になったときに調べればいいレベル
★2・・・1と3の間くらい
★3・・・普通に使うレベル(できれば覚えてしまいたい)
★4・・・3と5の間くらい
★5・・・かなり使うレベル。覚えておきたい

★5)コメントの書き方

# コメントです

#~でコメントになります。この後に何度も出てくるので先にご紹介します。

★1)printの改行

改行1つ

print( ’普通に’)
print( ’改行します。’)

▼結果

普通に
改行します。

改行2つ(end=’\n\n’

print( ’1つ空行ができます。’,  end=’\n\n’)
print( ’↑1行空きました。’)

▼結果

1つ空行ができます。

↑1行空きました。

改行なし(end=’’

print( ’改行無し。’, end=’')
print( ’続きます。’)

▼結果

改行無し。続きます。

★3)型が異なる演算はエラーになる(数と文字)

a=1    # int
b=2.5 # float
c='a'   # str

# 演算
a+b # int型とfloat型はOK
a+c # int型とstr型はNG

int型とstr型を加算するとエラーになります。ただ、int型とfloat型であれば問題ありませんでした。数と数はOKみたいです。

★3)除算(小数点以下切り捨て

a//b # 除算(小数点以下切り捨て)

# 例1
1/2  # =0.5
1//2 # =0

# 例2
5/2  # =2.5
5//2 # =2

これ便利じゃないですか?小数点以下切り捨ての「floor」とか型変換「int」とか利用しなくても一発でいけます。

★1)累乗

a**b # 累乗(aのb乗)

# 例
2**4 # =16

phpでも5.6で導入されているようです。今までのphpなどではあまり使う機会がなかったので知らなかったです。

★1)乱数

import random
random.randrange(0,100) # 0以上100未満の間で乱数を生成
random.random() # 0以上1未満の間で乱数を生成

その他細かいものは必要になったときに見ようかなと。とりあえずは「random」をimportする必要があることだけ覚えておけば良さそう。

★1)ベルが鳴る

print('\a') # ベルが鳴る

ベルが鳴ります。使うかどうかは定かではありませんが、実際に音が鳴ったので、載せておきます。音を聞いた時はメールでも届いたのかと思いました。

★3)エスケープシーケンスを無視する

print('\a')  # ベルが鳴る
print(r'\a') # \aと表示される

これ便利じゃないですか?ソースとかを表示する機会があるかはわかりませんが、そういったときに一発で対応できます。文字列の前に「r」「R」のいずれかを書けばOK。

★3)複数行の文字列

print('''aaa
bbb
ccc
ddd''') # '''~'''で複数行の文字列がかける

print('''aaa
    bbb
    ccc
    ddd''') # '''~'''の中であればインデントも問題なし

Pythonにおいてインデントは特別な意味を持つらしいですが、この場合はOKみたいです。

★4)部分文字列

'abcde'[0]    # a
'abcde'[1]    # b
'abcde'[0:2] # ab
'abcde'[1:4] # bcd

これはかなり良いですね。substrといった関数などを使う必要がないです。更に直感的。

0が1文字目を指すというのはプログラムをやってる人からすると気になりません。[0:2]この部分は少し癖があると感じました。「:」の後ろに指定したindexの1つ前のindexまでを取得するとのことです。[1:4]であれば、2文字目(index=1)から4文字目(index=3)までですね。

★4)文字列の判定

# すべてアルファベットか判定
'abc'.isalpha() # True
'ABC'.isalpha() # True(全角OK)
'ABc'.isalpha() # True(大文字OK)
'ab3'.isalpha() # False
'aびー3'.isalpha() # False

# すべて数か判定
'123'.isdecimal() # True
'123'.isdecimal() # True(全角OK)
'a23'.isdecimal() # False
'1びー3'.isdecimal() # False

#すべてがアルファベットか数か判定
'123'.isalnum() # True
'abc'.isalnum() # True
'123abc'.isalnum() # True
'123ABC'.isalnum() # True
'123ABC'.isalnum() # True
'あ'.isalnum() # True?(「あ」だけど…)
'いち23ABしー'.isalnum() # True?(平仮名入ってるけど…)
'123+abc'.isalnum() # False

基本的には便利です。正規表現とかを利用しなくても簡単に判定できます。ただ、「isalnum」に関しては全角ひらがなとか入っててもTrueになったので、ちゃんと調べるまでは使用は避けようかと思います。記号が入れば、Falseにはなるようです。

★4)文字列を含むか判定

'Luck' in '私はLuckです' # True
'Rack' in '私はLuckです' # False
'LUCK' in '私はLuckです' # False(大文字・小文字は違う文字と判断される)
'Luck' in '私はLuckです' # False(全角は違う文字と判断される)

今までの「strstr」や「indexOf」などよりかなり直感的ですね。というよりそのままですね。使いやすいそうです。
ちなみに、大文字・小文字や全角は違うと判断されました

★1)ヌルオブジェクト

a=None
a==None # True

値を持たないことを持たせれるので、エラー回避ができそう。初期値として設定しておきNone比較でオブジェクトが正常に取得できたか判定できそう。

★3)型変換

# int型へ変換
int(2.1) # 2
int(2.6) # 2
int('2')  # 2
int('2.1') # Error
int('2.6') # Error
int(float('2.1')) # 2
int(float('2.6')) # 2 
int(True)  # 1
int(False) # 0
int(None) # Error

# float型へ変換
float(2) # 2.0
float('2.1') # 2.1
float(True) # 1.0
float(False) # 0.0
float(None) # Error

# str型へ変換
str(1) # '1'
str(1.5) # '1.5'
str(True) # 'True'
str(False) # 'False'
str(None) # 'None'

# bool型へ変換
bool(0) # False
bool(1) # True
bool('0') # True
bool('1') # True
bool('True') # True
bool('False') # True
bool(None) # False

型変換の方法は色々とありましたが、やはりこの形が一番シンプルですね。

思いつく結果を一通り試しました。以下、注意が必要に感じた点です。

  • int(2.6)は2となり切り捨てになる
  • int(‘2.1’)やint(‘2.6’)はエラーになる。float型⇒int型は暗黙的には行われない。int(float(‘2.1’))と書けば問題ない
  • int(None)はエラーになる
  • float(None)はエラーになる
  • True、False、Noneをstr型へ変換するとそのまま文字列になる
  • bool(None)はFalseになる
  • str型⇒bool型変換はすべてTrueになる

★2)16進数⇔10進数の変換

# 16進数を10進数へ変換(文字列部分が16進数)
int('0', 16)   # 0
int('66', 16) # 102
int('80', 16) # 128
int('cc', 16)  # 204
int('ff', 16)  # 255

# 10進数を16進数へ変換(括弧内が10進数)
hex(0)     # '0x0'
hex(102) # '0x66'
hex(128) # '0x80'
hex(204) # '0xcc'
hex(255) # '0xff'

rgbの変換に便利だなと思い、16進数をピックアップしました。

# 2進数を10進数へ変換(文字列部分が2進数)
int('1010', 2) # 10

# 8進数を10進数へ変換(文字列部分が8進数)
int('7654', 8) # 4012

# 10進数を2進数へ変換(括弧内が10進数)
bin(10) # '0b1010'

# 10進数を8進数へ変換(括弧内が10進数)
oct(4012) # '0o7654'

他にも2進数、8進数とあります。

★4)リスト

a = [2017, 2018, 2019] # リスト
b = [2017, '平成', 2018, '平成', 2018, '令和'] # 型が異なってもOK
c = [2017, ['平成', 'H'], 2018, ['平成', 'H'], 2018, ['令和', 'R']] # リスト内にリストがあってもOK

# 値へアクセス
a[0] # 2017
b[1:4] # ['平成', 2018, '平成']
c[1][0] # '平成'

リストから一部リストとして抜き出せますね。アクセス方法は配列と同じです。

★4)リストの操作

# 値の編集
a = [2017, 2018, 2020]
a[2] = 2019 # [2017, 2018, 2019]

# 要素の追加
a.append('2021') # [2017, 2018, 2019, 2021]

# 要素の挿入
a.insert(3, '2020') # [2017, 2018, 2019, 2020, 2021]
a.insert(3, '2020') # [2017, 2018, 2019, 2020, 2020, 2021]
# 要素の削除
del a[0] # [2018, 2019, 2020, 2020, 2021]
del a[0:2] # [2020, 2020, 2021] ※複数削除もできる
a.remove('2020') # [2020, 2021] ※最初に見つかった値を持つ要素のみ削除

配列と大きく変わらないです。ただよく利用するとは思います。

★4)リストとリストの操作

# リストの連結
a = [2017, 2018]
b = [2019, 2020]
a + b # [2017, 2018, 2019, 2020]※aもbもリストは変わらない

# 拡張
a.extend(b) # a=[2017, 2018, 2019, 2020]※a自身のリストが変わる

リストの連結も色々と関数を見かけましたが、+で対応することとします。場合によっては、extend。

★4)リストpop(FILO、FIFO)

# FILO
filo=[]
filo.append('a') #filo=['a']
filo.append('b') #filo=['a', 'b']
filo.append('c') #filo=['a', 'b', 'c']
filo.pop() # 'c'
filo.pop() # 'b'
filo.pop() # 'a'

FILOとはFirst in last out。先入れ後出しです。

例えばメスシリンダーにちょうど入るボールを複数入れます。すると先に入れたボールは奥に入っていきます。取り出すときは最後に入れたボールから取り出すことになります。これがFILOです。

先に次のFIFOについても説明しておきます。FIFO、First in first out。先入れ先出し。次はメスシリンダーではなく筒にボールを入れます。筒には両方穴が空いているので先に入れたボールから取り出しました。これがFIFOです。

# FIFO
fifo=[]
fifo.append('a') #filo=['a']
fifo.append('b') #filo=['a', 'b']
fifo.append('c') #filo=['a', 'b', 'c']
fifo.pop(0) # 'a'
fifo.pop(0) # 'b'
fifo.pop(0) # 'c'

★3)リストの存在チェック

luck = ['l', 'u', 'c', 'k']
'l' in luck # True
'r' in luck # False

リスト内に存在するかどうかの判定ができます。そのままなので、わかりやすいです。inArray(js)、in_array(php)などと同じです。

★3)リストの値からindexを取得

luck = ['l', 'u', 'c', 'k']
luck.index('l') # 0
luck.index('u') # 1
luck.index('c') # 2
luck.index('k') # 3
luck.index('r') # Error

要素の値を指定することでindex(何番目に入っているか)を取得できる。案外使えるような気がします。ただ、無いものの場合エラーになるので、注意が必要。

★3)リストの数

luck = ['L', 'u', 'c', 'k', 'is', 'l', 'u', 'c', 'k', 'y', '.']

# 指定した文字の数
luck.count('L') # 1※大文字・小文字は区別される
luck.count('l') # 1※大文字・小文字は区別される
luck.count('u') # 2
luck.count('R') # 0

# 文字数
len(luck) # 11

lenの方は他のものと同じ感じです。ただ、指定した文字の数を数えられるのは面白いですね。あまり使ったことはなかったので、良さそうに思います。エクセルの「countif」と同じですね。

★3)リストのソート

numbers = [3, 2, 1, 4, 5, 6, 9, 8, 7]

# 昇順にソート
numbers.sort() # numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 降順にソート
numbers.sort(reverse=True) # numbers = [9, 8, 7, 6, 5, 4, 3, 2, 1]

# 昇順にソートした値を取得(自身は変わらない)
sorted(numbers) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers # [9, 8, 7, 6, 5, 4, 3, 2, 1]

# 降順にソートした値を取得(自身は変わらない)
numbers.sort(reverse=True ) # numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
sorted(numbers, reverse=True ) # [9, 8, 7, 6, 5, 4, 3, 2, 1]

 

 

モジュール

後で見直すためのメモ。

sys・・・システム的な最大値など
math・・・数学的なもの
fractions・・・
random・・・乱数
secrets・・・乱数(より安全に)
unicodedata・・・
string・・・

同じだなーと思ったこと

※(js)はjavascript、何もないものはphp等

四則演算、剰余、文字列連結(js)、リストの連結・分割(js)、文字列置換(php&js)、