Pythonプログラミング入門・サンプル・チュートリアル

Pythonプログラミング入門・サンプル・チュートリアル

【Pythonプログラミング入門】Djangoで初期データを作成する

この記事を読んでわかること

  • Djangoで初期データを作成・ロードする方法
  • Djangoのテスト実行時に初期データをロードする方法

初期データについて

  • json,xml or yaml形式で初期データ用ファイルを用意する
  • アプリケーションのフォルダ配下に「fixtures」フォルダを作成する
  • 初期データ用ファイルはfixturesフォルダに保存する

初期データの投入

データ作成

例として、yaml形式で作成することとする。
ファイル名は「seed.yaml」としました。 「blog」アプリケーションがあり、その中にCategoryモデルがあるとする。
Categoryモデルは下記のとおりとする。

from django.db import models

class Category(models.Model):
    """掲示板のカテゴリ"""
    # 掲示板名
    name = models.CharField(max_length=30)
    # 表示順
    disp_order = models.IntegerField()
    # 削除フラグ
    deleted = models.BooleanField(default=False)

このモデルの場合、下記のように初期データを作成する。

- model: bloc.category
  fields:
    name: ゲーム
    disp_order: 0

- model: blog.category
  fields:
    name: ドラマ
    disp_order: 1

データのロード

python manage.py loaddata seed.yaml

テストで使用する場合

テストクラスのクラス変数「fixutures」に使用する初期データファイルを指定する。
後はsetUp()メソッド実行時に自動的にロードされる。

class PersonTest(TestCase):
    fixtures = ['seed1.yaml', 'seed2.yaml']

    # 以下テストコードなど

【Pythonプログラミング入門】ソートの基本(sorted()関数やsort()メソッド)

この記事を読んでわかること

  • sorted()関数やsort()メソッドの基礎的な使い方

sorted()関数とsort()メソッドの違い

  • sorted()関数は新しくリストオブジェクトを作成し、結果を返す
  • sort()メソッドはオブジェクトを直接変更する
  • sorted()関数はリスト以外にも使える。例えば、辞書。

ソートの基礎

# 数値のリストをソートする
numbers = [5,4,3,1,2]

# sorted()関数は新しくリストオブジェクトを作成し、結果を返す
print(sorted(numbers))
print(numbers)

# sort()メソッドはオブジェクトを直接変更する
numbers.sort()
print(numbers)

# sorted()関数は辞書にも使える。
person_dic = {"yamada", "sato", "ohashi"}
print(sorted(person_dic))

# リスト以外ではsort()メソッドはエラーになる
person_dic.sort()
print(person_dic)

結果

f:id:fjswkun:20170312210911p:plain

keyパラメータ

# 比較に使用する要素を指定する
words = ["Hello", "world", "Wow", "Python", "!!!"]
print(sorted(words, key=str.lower))

words.sort(key=str.lower)
print(words)

# 複数の要素の中のいずれかをkeyに使用する
# 辞書の場合
friends = [
    {"name":"yamada", "hobby":"cooking"},
    {"name":"sato", "hobby": "travel"},
    {"name":"inoki", "hobby": "game"},
]
print(sorted(friends, key=lambda x: x["hobby"]))

friends.sort(key=lambda x: x["name"])
print(friends)

# オブジェクトの属性もkeyに使用できる
class Person:
    def __init__(self, name, hobby):
        self.name = name
        self.hobby = hobby
        
    def __repr__(self):
        return repr((self.name, self.hobby))

persons = [
    Person('yamada', 'cooking'),
    Person('sato', 'travel'),
    Person('inoki', 'game'),
]
print(sorted(persons, key=lambda x: x.hobby))

persons.sort(key=lambda x: x.name)
print(persons)

結果

f:id:fjswkun:20170312211058p:plain

operatorモジュール

# operatorモジュールを使うことでkeyパラメータの指定が楽になる
from operator import itemgetter, attrgetter
friend_tuples = [
    ('yamada', 'm', 28),
    ('tanaka', 'f', 33),
    ('yamada', 'f', 29),
]

# 2番目の要素で比較 ※0番目から開始
print(sorted(friend_tuples, key=itemgetter(2)))

# 複数の要素で比較。0番目の要素で比較、次に2番めの要素で比較
print(sorted(friend_tuples, key=itemgetter(0,2)))

class Person:
    def __init__(self, name, hobby):
        self.name = name
        self.hobby = hobby
        
    def __repr__(self):
        return repr((self.name, self.hobby))

persons = [
    Person('yamada', 'cooking'),
    Person('sato', 'travel'),
    Person('inoki', 'game'),
]

print(sorted(persons, key=attrgetter('hobby')))
print(sorted(persons, key=attrgetter('name', 'hobby')))

結果

f:id:fjswkun:20170312211225p:plain

昇順、降順

# reverseパラメータでTrueかFalseを指定する
# 初期値はFalse
friend_tuples = [
    ('yamada', 'm', 28),
    ('tanaka', 'f', 33),
    ('yamada', 'f', 29),
]

print(sorted(friend_tuples, key=lambda x: x[2], reverse=True))
print(sorted(friend_tuples, key=lambda x: x[2], reverse=False))

結果

f:id:fjswkun:20170312211248p:plain

【Pythonプログラミング入門】クラスメソッドの定義と呼び出し

クラスメソッドの定義について

クラスメソッドを定義するには2つの方法がある。 - classmethod()を使う - @classmethodデコレータを使う

いずれを使って定義してもよいが、@classmethodデコレータを 使ったほうが、クラスメソッドが定義されていることがわかりやすい。

classmethod()を使う

# 定義
class Person:
    def greeting(cls):
        print("classmethod()を使う:","Hello!!!")
    greeting = classmethod(greeting)
    
# 呼び出し
Person.greeting()

@classmethodデコレータを使う

# 定義
class Animal:
    @classmethod
    def bark(cls):
        print("@classmethodデコレータを使う:","WooWo!!!")
    
# 呼び出し
Animal.bark()

実行結果

f:id:fjswkun:20170220080129p:plain

【Pythonプログラミング入門】可変の引数を持つ関数を定義する

可変の位置引数

  • 位置引数の前に*をつける
# 可変の位置引数
def greeting(*args):
    if not len(args):
        print('引数を指定しなかった場合:', 'No person')
        return
    
    print('引数を指定した場合:')
    for person in args:
        print(person, ', hello!!!')
    
## 引数を指定しなかった場合
greeting()

## 引数を指定した場合
greeting('Sato', 'Ito', 'Yamada')

結果

f:id:fjswkun:20170216223038p:plain

可変のキーワード引数

# 可変のキーワード引数
def my_profile(**kwargs):
    if not len(kwargs):
        print('可変のキーワード引数:', 'なし')
        return
        
    print('可変のキーワード引数:', kwargs)

# 引数を指定しなかった場合
my_profile()

# 引数を指定
my_profile(name='Sato', age=23, hobby='travel')

結果

f:id:fjswkun:20170216223506p:plain

【Pythonプログラミング入門】関数のデフォルト引数、デフォルト引数にリストや辞書を使うときは注意

デフォルト引数

  • 関数呼出し時に引数が渡されなかった場合に使用される引数となる
# デフォルト引数
def greeting(name, word="hello"):
    print(name, ',', word, '!!!')

# 引数wordに値を渡さない場合(デフォルト値「hellow」が使用される)
greeting('Sato')

# 引数wordに値を渡した場合
greeting('Yamada', 'See you')

## 結果 f:id:fjswkun:20170216214315p:plain

デフォルト引数にリストや辞書を使うときには注意が必要!

  • デフォルト引数は関数を定義したときに与えられる
# デフォルト引数にリストや辞書を使うときには注意が必要
def persons(arg, result=[]):
    result.append(arg)
    print(result)

## 呼び出すたびにresultには空配列を渡しているつもりが、
## resultに追加されていく
persons('Sato')
persons('Yamada')

f:id:fjswkun:20170216215624p:plain

呼び出すたびに空にする場合は関数内で初期化する

def persons(arg):
    result = []
    result.append(arg)
    print(result)
    
persons('Tanaka')
persons('Ito')

結果

f:id:fjswkun:20170216220230p:plain

【Pythonプログラミング入門】配列の要素取得、スライス

配列の要素取得、スライス

# 配列の要素の取得
alphabets = ["a", "b", "c", "d", "e"]

# n番目の要素を指定して取得
n = alphabets[1]  # 1番目の要素を指定
print("1番目の要素を指定", n)

n = alphabets[-1]  # 負の値も指定可能。一番最後の要素が-1番目。
print("負の値も指定可能。一番最後の要素が-1番目。", n)

# スライスして取得
sliced = alphabets[0:2]  # 0番目から(2-1)番目までの要素を取得
print("0番目から(2-1)番目までの要素を取得", sliced)

sliced = alphabets[:3]  # 0番目の場合は省略可能
print("0番目の場合は省略可能", sliced)

sliced = alphabets[1:]  # 最後の要素まで取得する場合は省略可能
print("最後の要素まで取得する場合は省略可能", sliced)

# 取得する要素の番目を増加させながら要素を取得
odds = alphabets[::2]  # 0番目から2つずつ増加(0+2), (2+2)、・・・しながら要素を取得
evens = alphabets[1::2]  # 1番目から2つずつ増加(1+2), (3+2)、・・・しながら要素を取得

print("0番目から2つずつ増加(0+2), (2+2)、・・・しながら要素を取得", odds)
print("1番目から2つずつ増加(1+2), (3+2)、・・・しながら要素を取得", evens)

# 負の値も指定可能。わかりづらくなるので使うのは控えたほうが良い
ns = alphabets[:3:-1]
print("負の値も指定可能", ns)

ns = alphabets[::-2]
print("負の値も指定可能", ns)

【Pythonプログラミング入門】位置引数のある関数、キーワード引数のある関数

位置引数のある関数

def my_profile(first_name, last_name, age, hobby):
    print("私の名前は", first_name, last_name, \
          "で、年齢は", age, "、趣味は", hobby, "です。" )

my_profile("Ichiro", "Sato", 24, "旅行")

## それぞれの位置にある引数の意味がわかってないといけないことに注意
## ↓意味がわからない結果となってしまう
my_profile("旅行", 24, "Sato", "Ichiro")

結果

f:id:fjswkun:20170207221338p:plain

キーワード引数を使って呼び出す

# 引数の名前を指定して関数を呼び出す
my_profile(age=24, hobby="旅行", last_name="Sato", first_name="Ichiro")

# 位置引数とキーワード引数の両方を使って呼び出す
# 先に位置引数を指定した後、キーワード引数を指定する
# キーワード引数の後に位置引数を指定するとエラーになる
my_profile("Ichiro", "Sato", hobby="旅行", age=24)

結果

f:id:fjswkun:20170207221623p:plain