いーほろよいの技術ブログ

IT技術ブログになります。

Pythonで関数を定義する その2

はじめに

前回は簡単に関数定義について触れました。

今回も注意点なのですが、ドキュメントに書かれていた注意点で意味が『イマイチ分かり難いかな?』と思った点を書いていきたいと思います。

※あくまで個人的に分かり難いと思った箇所です。

 

イマイチ分かり難いドキュメント

こちら"4.7.2. キーワード引数"の"不適切"な使い方についての説明です。

4. その他の制御フローツール — Python 3.6.1 ドキュメント

 その前に下記の用語を理解する必要があります。

位置指定引数 

こちらはドキュメントに説明が無く、いきなり出てくる単語です。

前後の文書を読んでみると、どうやら初期値無しの引数の事を指すようです。

 

キーワード引数

こちらはドキュメントにもあるのですが、kwarg=valueと呼び出す(与える?)事のできる引数です。

 

上記を踏まえてドキュメントの"不適切"な点を確認してみましょう。

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")

parrot() # required argument missing
位置指定引数(voltage)が指定されているのに引数に与えてない

parrot(voltage=5.0, 'dead')  # non-keyword argument after a keyword argument
キーワード引数位置指定引数後でなければならないという原則がある。それを満たしていない。
一見満たしているようだが、第1引数がキーワード引数第2引数が位置指定引数になっている。 parrot(110, voltage=220) # duplicate value for the same argument 位置指定引数の後に続くキーワード引数前の位置指定引数と指定が被っている。
110がvoltageにも関わらず、第2引数のキーワード引数でvoltageが指定されている。 parrot(actor='John Cleese') # unknown keyword argument
存在しないキーワード引数を指定している。

 ざっとこんな感じです。

...余計に混乱させてしまったらゴメンなさい...

ようは下記の形式で呼び出さないといけないという事です。

位置指定引数1{, 位置指定引数n}{, キーワード引数n}

 

以上、最後まで読んでいただきありがとうございます。

Pythonで関数を定義する その1

はじめに

余程小さいプログラムで無い限り関数を定義する事を避けて通れないと思います。

本日はその関数の定義について書いてみたいと思います。

↓公式ドキュメントなので合わせてご確認ください。

4. その他の制御フローツール — Python 3.6.1 ドキュメント

 

関数の定義が必要な場面を考えてみる

例えば名簿にある住所、年齢、氏名を並べて表示するプログラムを組もうとします。

もし、関数定義を使用しないと下記のようなコードになると思います。(ファイルを読み込んでループしないと想定して

print("住所:%s/年齢:%s/氏名:%s" % ('東京', '31', '新宿太郎'))
print("住所:%s/年齢:%s/氏名:%s" % ('神奈川', '25', '神奈川次郎'))
print("住所:%s/年齢:%s/氏名:%s" % ('埼玉', '40', '埼玉三郎'))
... 

この場合、"氏名と年齢を入れ替えたい"となったら全部書き直さないといけません。

...無理です。

こんな規則性がある処理なら、これだけの処理をしてくれる"関数"があってもいいのではないか。

しかし、Pythonにそんなワガママを聞いてくれるやさしい標準関数はございません...

そこで自分で関数を定義する事になります。

 

関数の定義方法

定義自体はそんなに難しく無いのですが、正しく理解して使用しないと取れないバグを生み出してしまいます。

そのため、今回はその辺の注意点を中心に書いていきたいと思います。

 因みに関数定義のフォーマットは下記の通りです。

def  関数名(引数1[, 引数2...]):
  """処理を書く"""

 

 注意点

サンプルプログラムに詳しく記述したのでご参照ください。

github.com

  • 引数を指定できますが、引数を指定した場合は必ず呼び出し時に引数を設定する事になる
  • 引数にデフォルト値を渡す事ができる
  • 関数定義が評価された時点で引数の初期化される
  • 引数のデフォルト値は一度だけ

 

ざっとですがこんな感じです。

 

以上、最後までお読みいただきありがとうございます。

 

Pythonのおしゃれな制御文

はじめに

だいぶハードルを上げてますが、実は大した記事になりません。

本日は制御文のサンプルをGitHubにアップをした、ご連絡とif文とfor文に慣れてきたらよくやる書き方のご紹介です。

下記におしゃれな書き方以外のif文、for文もアップしてあります。

github.com

因みに制御文の公式ドキュメントはこちらです。

4. その他の制御フローツール — Python 3.6.1 ドキュメント

 

if文あるある

『単純なif文なので1行で書きたい!』ですよね〜

では↓のように書きましょう。スッキリです。

num = 10
result = "num = 10" if num == 10 else 'num != 10'
print(result)

 

for文あるある

『リストに空文字列が混じって邪魔だな...』

はい↓で解決です!

data = ['a', '', 'c', 'd', '', 'f', 'g']
data = [x for x in data if x != '']
print(data)

 

所感

特にfor文の空文字列判定して入れ直しする手法は色々なところで使用できるので覚えて置くと便利です。

 

以上、最後までお読みいただきありがとうございます。

これからPythonの学習を始める上で

はじめに

データ分析に興味があってPythonを始めるきっかけになりました。

どんなモジュールが存在するのか、用途とドキュメントの場所を簡単にまとめました。

 

モジュールの種類

Beautiful Soup

用途:スクレイピング

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

 

Scrapy

用途:クローリング

Scrapy | A Fast and Powerful Scraping and Web Crawling Framework

 

pandas

用途:データ解析ツール

Python Data Analysis Library — pandas: Python Data Analysis Library

 

NumPy

用途:科学計算をする基本パッケージ

NumPy — NumPy

 

Matplotlib

用途:NumPyを使用してグラフを描画(ライブラリ)

Matplotlib: Python plotting — Matplotlib 2.0.2 documentation

 

所感

正直、"Beautiful Soup"しか使用した事がありません。

使いやすかった事は覚えているのですが、習得コストが掛かるモジュールだった印象です。

これらを復習の後に試していきたいと思います。

 

以上、最後までお読みいただきありがとうございます。

Pythonの復習

はじめに

直近でPython3をやっていたのですが、年齢の影響か記憶が抜け落ちている箇所があるので復習します。

今回は基本中の基本である"変数"です。

とりあえず、何はともあれGitHubにサンプルプログラムをアップしたので、興味あるかたはご参照ください。(超入門です。)

github.com

 

変数について

今回は数値型(整数、浮動小数点、複素数)、文字列型、リスト型を試しています。

※その他にタプルとか辞書型とかありますが、切りが無いのでリクエストがあったら取り上げます。

ドキュメントはこちらになります。

4. 組み込み型 — Python 3.6.1 ドキュメント

 

本当はもっとやるはずだったのですが、GitHubの使用方法に躓いて出来ませんでした。(トホホ)

下記の順序で復習したいと思いますが、もしかしたら脱線するかも知れません。

  • 制御演算子(if文、for文)
  • 自作関数
  • クラス
  • 例外処理
  • from、import
  • ドキュメント(.__doc__)の書き方

今回のサンプルプログラムはドキュメント通りなので 、どちらかと言うとprint以降のformat関数を使用しない記述の仕方の方が参考になるかも知れません。

 

以上、お読みいただきありがとうございます。

python始めました

はじめに

『おい、Ruby on Railsはどうした?』と言う声が聞こえてきそうですが、Pythonを始めるという節操が無い事をお許しください。

...Pythonのお仕事ほしいのです。

Railsは世の中の流れに遅れないようにお勉強しているのです。

以前、Pythonの環境構築を記事にした内容に沿って今回も作ってみたいと思います。

e-horoyoi.hatenablog.com

e-horoyoi.hatenablog.com

 

構成

マシンとか

CentOS7 / Python3.6.1

※pyenv、pyenv-virtualenvをインストールが使える環境

 

リポジトリ

今回の学習用に作成したリポジトリです。

こちらに試しに組んでみたプログラムをドンドン溜めて行きたいと思います。

github.com

 

作業環境作成

リポジトリを~/works/pyhowto以下へ取得する。

>git cl git@github.com:gh-e-river/pyhowto.git ~/works/pyhowto

OR

>git cl https://github.com/gh-e-river/pyhowto.git ~/works/pyhowto

 

学習用の仮想環境を作成する。

>pyenv virtualenv 3.6.1 pyhowto361

※"Requirement already satisfied"と出るけど無視します。

 

作業ディレクトリへ移動して仮想環境を有効&確認します。

>cd ~/works/pyhowto

>pyenv activate pyhowto361

>pyenv versions

↓終了したいとき

>pyenv deactivate

 

ここまでの作業で学習用の環境が作成できます。

手始めにCSVファイルを読み込むような簡単なプログラムを試して見ようかと思います。

気が向いたらその辺もブログにアップしていきたいと思います。

 

以上、最後までお読みいただきありがとうございます。

Railsのマイグレーションファイルに外部キー制約はどう書くの?

はじめに

タイトル通り、Railsでモデルを作成する時にマイグレーションファイルが作成されますが、その時に外部キー制約を指定したい場合はどうするのか疑問に思ったので試してみました。

環境については後に記述するので一致しない方は別途ご自身で調べてみてください。

ある程度、開発に携わっている方なら、外部キー制約(FOREIGN KEY)をご存知かと思いますが、もし知らない方は下記を読んで外部キー制約の仕様について確認してみてください。(なぜ必要なのかも調べておくといいかも知れません。)

外部キー制約について

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.17.2 外部キー制約の使用

 

また、この辺の扱い方を詳しく書いているRailsのドキュメントが見当たらず(たぶん調べ方が悪いのだと思います...)、下記の記事が大変参考になりました。ありがとうございます。

参考にさせていただいた記事

suin.io

 

環境

Ruby on Rails4

MySQL5.7

 

手順

始める前に

あるプロジェクト管理テーブル(親テーブル)に紐付くタスクテーブル(子テーブル)という想定です。

親:projects

子:tasks

※外部キー制約の確認が目的なのでカラムを指定しません。

 

モデル作成

>bundler exec rails g model project

>bundler exec rails g model task

 

マイグレーションファイル編集

作成されたtasksのマイグレーションファイルを編集します。

>vi db/migrate/yyyymmddxxxxx_create_tasks.rb

class CreateTasks < ActiveRecord::Migration
  def change
    create_table :tasks do |t|
      t.references :project, foreign_key: true

      t.timestamps null: false
    end
  end
end

 

マイグレーション実行

>bundler exec rake db:migrate RAILS_ENV=development_root

 

作成されたテーブルの確認

mysqlクライアントでDBに接続してテーブル作成確認コマンドで確認してみましょう。

>mysql -uユーザー -p

>show create table table_name

希望通りにprojectsテーブルのidとtasksテーブルのproject_idが外部キー制約(FOREIGN KEY)になっております。

CREATE TABLE `projects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

CREATE TABLE `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `project_id` int(11) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_rails_02e851e3b7` (`project_id`),
  CONSTRAINT `fk_rails_02e851e3b7` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

 

所感

いつものようにRailsのお作法に則って記述すれば全く難しい事はありません。

しかし、全てのシステムがこのようになっているとは限りません...

例えば

  • idカラムが存在しないテーブルと外部キー制約をする場合はどうかいたらいいのか
  • 外部キーの名前を指定できないのか

この辺はもう少し掘り下げて調べてみる必要があるかも知れません。

もしかしたら、モデルだけ作成してマイグレーションファイルは作成しないとか...

 

以上、最後まで読んでいただきありがとうございます。