初心者の躓きポイントと知っておくと良いテクニックのメモ
公式:(変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
score = 100
result = "good" if score > 80 else "bad"
print(result) # good
ループ処理が終わったタイミングもとれるらしい
while
i = 0
while i < 3:
print(i)
i += 1
else:
print("while, end")
for
for i in range(3):
print(i)
else:
print("for, end")
何もしない。外枠だけざっと決めたいときなどに使う
def say_hello():
pass
print(say_hello()) # None
cf. Pythonのpass文の使い方
str(1)
といったキャストが複数続いた時に使えるとよりスマート
text = 'name -> {0:>10s}\nscore -> {1:<10.2f}'.format('sato',30.2)
# name -> 表示幅:10, s:string, >:右揃え
# score -> 表示幅:10, 小数点以下2桁, f:float, >:左揃え
print(text)
# name -> sato
# score -> 30.20
↓こういうのも便利
桁数指定でゼロ埋め
print('{:05}'.format(255)) # 00255
print('{:08}'.format(255)) # 00000255
関数内でのグローバル変数の扱い
代入する場合はglobal宣言しないとエラー
x = 5
def add():
global x # 宣言しないと書き換えられない
x += 1
add()
print(x)
参照するだけならglobal宣言は要らないけど・・・
# 参照するだけでもglobal宣言しておいた方がわかりやすい
x = 5
def print_x():
print(x)
print_x()
しかし副作用を防ぐため、できる限り関数内からグローバル変数にアクセスしないほうがいい
引数で渡す形が良い
x = 5
def add(x):
x += 1
return x
x = add(x)
print(x)
リストの落とし穴
x = ["a", "b", "c"]
y = x.append("d")
print(x) # ['a', 'b', 'c', 'd'] 変数が置き換わる
print(y) # None 返ってくるのはNone
文字列の場合
x = "abcdef"
y = x.upper()
print(x) # abcdef 変数はそのまま
print(y) # ABCDEF 返ってくるのは文字列
オブジェクトの種類 | メソッドを実行した後の変数 | メソッドが返すもの |
---|---|---|
文字列 | 変数はそのまま | 文字列 |
リスト | 変数が置き換わる | None |
[expression for var in iterable if condition]
mapとfilterを同時に処理できているイメージ
if文でTrueとなったものがリスト作成の対象になる
eを含む名前を取り出し小文字にする
users = ["Yo", "Ken", "Nao", "Shin", "Lee"]
users = [u.lower() for u in users if u.find("e") != -1]
print(users) # ['ken', 'lee']
{key:value for v in iterable}
users = ["Yo", "Ken", "Nao", "Shin", "Lee"]
users = {u.upper(): len(u) for u in users}
print(users) # {'KEN': 3, 'LEE': 3, 'NAO': 3, 'SHIN': 4, 'YO': 2}
「あいうえお・・・」を分解し元に戻す
str_ = list('あいうえおかきくけこさしすせそ')
a = str_[::2] # 奇数
b = str_[1::2] # 偶数
print(a) # ['あ', 'う', 'お', 'き', 'け', 'さ', 'す', 'そ']
print(b) # ['い', 'え', 'か', 'く', 'こ', 'し', 'せ']
# 区切り文字列.join(シーケンス)
moto = "".join([ _a + _b for _a,_b in zip(a,b) ])
print(moto) # あいうえおかきくけこさしすせ
https://docs.python.jp/3/library/functions.html#zip
set => 重複なし、順序なし、ハッシュで捜査
dictionary => setにおけるハッシュの使い方にValueを追加したもの
s = {1,2,3,4,5}
print(type(s)) # <class 'set'>
d = {} # 空だとdictionaryになるので注意
print(type(d)) # <class 'dict'>
記述 | 受け取る型 |
---|---|
* | タプル |
** | 辞書型 |
# 可変長引数、キーワード引数の順番は守る
def print_args_kwargs(*args, **kwargs):
print(args) # (1, 2, 3)
print(kwargs) # {'age': 25, 'name': 'sato'}
print_args_kwargs(1,2,3, age=25, name='sato')
引数をdictionaryで渡す
def say_hello(name, age):
print(name, age) # sato 25
user = {'name':'sato', 'age':25}
say_hello(**user) # ** 辞書型
cf. Python超入門(番外1):*arg と **kwarg
クラスから作られるインスタンスを指す。
クラスのインスタンスメソッドやコンストラクタの第一引数。忘れがち。
selfに紐づく変数は「インスタンス変数」、メソッドは「インスタンスメソッド」と呼ぶ。
classに紐づく変数は「クラス変数」、メソッドは「クラスメソッド」と呼ぶ。
class Player:
# クラス変数
count = 0
# クラス定数(大文字)
GUILD = "KoB"
def __init__(self):
Player.count += 1
# クラスメソッド
@classmethod
def show_count(cls):
# selfを受け取っていないので
# インスタンス変数・メソッドは使えない
print("{} instances".format(cls.count))
# スタティックメソッド
# 第一引数のないクラスメソッドのようなもの
@staticmethod
def show_guild():
print(Player.GUILD)
player01 = Player()
player02 = Player()
player03 = Player()
# インスタンス化せずに呼べる
print(Player.count) # 3
Player.show_count() # 3 instances
# 同名のインスタンス変数がない場合、インスタンスからもクラス変数を呼べる
print(player01.count) # 3
Player.show_guild() # KoB
↓こんな感じでデータを管理すると便利
定数で色を管理する
class Color:
MAIN = '#f00'
SUB = '#00f'
FONT = '#fff'
print(Color.MAIN) # #f00
アンダースコア2つ「_」で外部からアクセスできなくなる
アンダースコア1つ「」は形だけ
class Player:
def __init__(self):
self.name = 'sato'
def __method(self):
print(self.name)
player01 = Player()
player01.__method() # error
※プライベートメソッド・変数は「name mangling」されているだけなので、強引に呼び出そうと思えば可能だがやっちゃダメ。
外部から操作する必要のあるインスタンス変数に使う
lambda 引数:式
関数をオブジェクトとして返す
関数渡しの際にいちいち関数をつくるのではなく、無名関数で済ませられる場合などに使えるとスマート
lambda_test = lambda x, y : print('lambda_test : {}, {}'.format(x, y)) # function <lambda>
lambda_test('hello', 'lambda') # lambda_test : hello, lambda
filter()と相性がよい
# filter(関数,リスト)
filter_obj = filter(lambda x : x % 2 == 0, range(10))
print(list(filter_obj)) # [0, 2, 4, 6, 8]
cf.