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

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

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

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

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

 

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

Railsのモデル作成時にカラム指定をしてみた!

はじめに

お問い合わせフォームの時には特に考えてやっていなかったのですが、テーブル構築時に普通ならnot nullやデフォルト値の設定などすると思います。

今回はそんな設定をしてテーブル作成をしてみました。

 

手順

以前にもやったと思いますが、今後は"scaffold"を使用して一通り作成します。

scaffoldとmodelの違いがイマイチ分かりません...

>bundler exec rails g scaffold mogu code:string name:string zip:integer address:string telephone:integer

 

作成されたマイグレーションファイルを編集

お馴染みのマイグレーションファイルが生成されると思います。

先ほどのコマンドで"db/migrate/yyyymmddxxxxxx_create_mogus.rb"というファイルができます。

今回は下記の仕様でテーブルを作成したいと思います。

  • idカラムは使わない
  • idの代わりにcodeカラムをプライマリキー指定
  • codeの文字列は32文字がMax
  • zipカラムは20文字まで
  • addressカラムはデフォルト"Tokyo"
  • code, name, addressはnull不可

書き出すとこんな感じです。

class CreateMogus < ActiveRecord::Migration
  def change
    create_table(:mogus, :id=>false, :primary_key=>"code") do |t|
      t.string :code, null: false, limit:32
      t.string :name, null: false
      t.integer :zip, limit: 7
      t.string :address, null: false, default: 'Tokyo'
      t.integer :telephone

      t.timestamps null: false
    end
  end
end 

 

テーブル作成

>bundler exec rake db:migrate RAILS_ENV=development_root

 ※RAILS_ENV=development_rootは個人的に設定している値です。

確認

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| code       | varchar(32)  | NO   |     | NULL    |       |
| name       | varchar(255) | NO   |     | NULL    |       |
| zip        | bigint(20)   | YES  |     | NULL    |       |
| address    | varchar(255) | NO   |     | Tokyo   |       |
| telephone  | int(11)      | YES  |     | NULL    |       |
| created_at | datetime     | NO   |     | NULL    |       |
| updated_at | datetime     | NO   |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

 

個人的感想ですが、毎回テーブル作成する度にidカラムがデフォルトで用意されるのは気持ち悪いです。(古い人の考えだからかも知れませんが...)

この辺って文化的にどうなんでしょうか。

もし、優しくてRails=自分だという方は是非教えてください。

 

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