PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

Similar documents
正規表現応用

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 ゲームプログラミング スプライトの衝突判定 スプライトの衝突判定 スプライトの衝突判定の例として インベーダーゲームのコードを 下記に示す PYTHON3 #coding: utf-8 import pygame from pygame.lo

ICONファイルフォーマット

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 ゲームプログラミング スプライト スプライト Pygame では pygame.sprite を用いる事でスプライトの管理 描画 衝突判定等を簡単に行う事が出来る 此れを利用してキャラクター操作に関する各種機能をスプライトクラスとして 1 個

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 文字列 文字列リテラル プログラムの中で文字列を表す方法は幾つか有るが 基本的な方法は下記の 2 種で有る 対象と成る文字の集まりをダブルクオーテーション ( " ) で囲うか シングルクオーテーション ( ' ) で囲う PYTHON3 "

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

Microsoft PowerPoint - ruby_instruction.ppt

ファイル操作-バイナリファイル

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

Microsoft PowerPoint ppt

VB.NET解説

構造体

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

プログラミング基礎I(再)

レコードとオブジェクト

プラグイン

データアダプタ概要

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

クラスⅠ

Userコントロール

Prog1_6th

ファイル操作-インターネットキャッシュ

Javaプログラムの実行手順

Microsoft PowerPoint - prog04.ppt

PowerPoint プレゼンテーション

レコード class Point attr_accessor("x", "y") インスタンス変数の宣言 point.rb

データベースプログラミング

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

GUIプログラムⅣ

万年暦プログラム

プログラミング入門1


Microsoft PowerPoint - chap10_OOP.ppt

Microsoft PowerPoint - Ruby n

NotifyIconコントロール

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

JavaプログラミングⅠ

第二回独習 Java ゼミ 第二章クラスとメソッド 2.1 メソッドの構造 2.2 静的メソッドと静的変数の概要 2.3 インスタンスメソッドとインスタンス変数の概要 2.4 Integerクラス 2006/04/19 神津健太

Program Design (プログラム設計)

Microsoft PowerPoint - prog03.ppt

ファイル操作

ハッシュテーブル

レコードとオブジェクト

メソッドのまとめ

プログラミング入門1

グラフィックス

JavaプログラミングⅠ

JavaScriptプログラミング入門 2.JavaScriptの概要

Ruby演習テキスト1

JAVA入門

Prog1_15th

GEC-Java

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

JEB Plugin 開発チュートリアル 第4回

永和システムマネジメント SP 安井力 東京支社 Python 勉強会実習資料 2005/12/28 この資料の使い方最初から順に試してください 初心者は 書かれたとおり入力して ほかにも似た例を試してみてください 初級者は 書かれたとおり入力して なぜそれで動くのか調べてください 中級者は 設問か

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

Microsoft PowerPoint - 計算機言語 第7回.ppt

JavaプログラミングⅠ

PowerPoint プレゼンテーション

GEC-Java

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

JavaプログラミングⅠ

基本情報STEP UP演習Java対策

モグラ叩きプログラム

メディプロ1 Javaサーブレット補足資料.ppt

Microsoft PowerPoint - 09.pptx

Microsoft Excel操作

2

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

intra-mart Accel Platform — 招待機能プログラミングガイド   初版  

インベーダープログラム

Prog1_10th

データベース1

VB6互換のファイルの処理

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

回文作成支援プログラム

データベース1

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

微分方程式 モデリングとシミュレーション

PowerPoint プレゼンテーション

JAVA とテンプレート

PowerPoint プレゼンテーション

初心者用

復習 プログラミング 1 ( 第 4 回 ) 関数の利用 2 ループ処理 (while 文 ) 1. Chapter の補足 2 1. 関数とローカル変数 2. Chapter 3.1 の補足 1. Iteration, looping ( 反復処理 ) 2. ループ処理の例 実行例 3

PowerPoint プレゼンテーション

アスペクトの相互作用を解消するアスペクトの提案

PowerPoint Presentation

Microsoft Word - VBA基礎(6).docx

回文作成支援プログラム

レコード class Point attr_accessor("x", "y") インスタンス変数の宣言 point.rb

Java講座

piyo0704a.rtfd

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

VB実用⑦ エクセル操作Ⅰ

PowerPoint Presentation

VB実用Ⅲ⑩ フリーデータベースⅡ

デザインパターン第一章「生成《

プログラミング 1 ( 第 5 回 ) ループ処理 (for 文 ) range() 関数とリストによるシーケンス集合表現 1. Chapter 3.2 For Loops 1. もう一つのループ処理 2. シーケンス集合とコード例 2. Chapter 3.4 A Few Words About

Transcription:

PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスがインスタンス化されてからメソッドに成る ) # 関数 def test_func(): print('call test_func') # メソッド def test_method(): print('call test_method') print('------------------------') print(test_func) print(testclass.test_method) print('------------------------') print(type(test_func)) print(type(testclass.test_method)) print('------------------------') t = TestClass() print(test_func) print(t.test_method) 関数の基礎 関数の最も単純な例を下記に示す def で関数を宣言し インデントに依りてブロック化された所属の処理を記述する 下記の例では test_func が関数の名前で パーレン ( ( ) ) の中に引数を指定する 関数の最後には必ずコロン ( : ) を記述する def test_func(): print('call test_func') test_func() 引数の基礎 引数を設定する例を下記に示す 下記では 第 1 引数と第 2 引数に数値を 第 3 引数に四則演算の識別子を指定し 2 個の数値を計算させて居る 複数の引数を設定する場合は カンマ (, ) で区切る -1-

def test_func(num_1, num_2, op): if op == '+': print(' 足し算開始 ') print(num_1 + num_2) elif op == '-': print(' 引き算開始 ') print(num_1 - num_2) elif op == '*': print(' 掛け算開始 ') print(num_1 * num_2) elif op == '/': print(' 割り算開始 ') print(num_1 / num_2) else: print(' 不明なオペレーション指定です ') test_func(100, 10, '*') 引数の初期値 引数は初期値を指定すると 関数を呼び出す際に省略する事が可能と成る 下記では 第 3 引数の初期値を '+' と設定し 第 3 引数の指定無しで呼び出された場合は足し算を行う def test_func(num_1, num_2, op='+'): if op == '+': print(' 足し算開始 ') print(num_1 + num_2) elif op == '-': print(' 引き算開始 ') print(num_1 - num_2) elif op == '*': print(' 掛け算開始 ') print(num_1 * num_2) elif op == '/': print(' 割り算開始 ') print(num_1 / num_2) else: print(' 不明なオペレーション指定です ') test_func(100, 10) -2-

可変長引数 関数の定義に於いて 引数名の前にアスタリスク ( * ) を付けると 其の引数は可変長引数と成る def test_func(*args): print(args) test_func(1, 2, 3, 4, 5) # (1, 2, 3, 4, 5) アスタリスクを用いた可変長引数は 関数内に於いてタプルとして引き渡される 猶 下記の様に 通常の引数と併用する事も可能で有る def test_func(code, name, *args): print(code, name) print(args) test_func(100, 'python-squid', 'JP', 'US') 引数名は必ずしも *args でなくても良いが 慣習的に *args とする方が良い場合も有る ( 汎用的な用途の関数等 ) 因みに args は arguments の略で有る 引数名の前にアスタリスク 2 個 ( ** ) を付ける事でも可変長引数と成る アスタリスク 2 個 ( ** ) を用いた可変長引数は 関数内に於いてディクショナリとして引き渡される (key が引数名 value が値 ) 此れも通常の引数と併用する事が可能で 更に アスタリスク 1 個 ( * ) を使用した可変長引数と併用する事も可能で有る def test_func(code, name, kana, *args, **kwargs): print(code, name, kana) print(args) print(kwargs) test_func( 100, 'python-squid', ' パイソン烏賊 ', 'JP', 'US', email='uno@squid.jp', city='kyoto' ) 此の引数名も同様に 必ずしも **kwargs でなくても良いが 慣習的に **kwargs とする方が良い場合も有る ( 汎用的な用途の関数等 ) 因みに kwargs は keyword arguments の略で有る メソッドの種類 Python のクラスに於けるメソッドの種類には インスタンスメソッド クラスメソッド スタティックメソッドが有る -3-

メソッドの種類インスタンスメソッドクラスメソッドスタティックメソッド 説明クラスをインスタンス化して呼び出すメソッドクラスをインスタンス化しなくても呼び出す事が出来るメソッドクラスをインスタンス化しなくても呼び出す事が出来るメソッド亦 self やcls 等のインスタンスやクラスを表す変数を必要としない # インスタンスメソッド def sample_instancemethod(self, arg_1): print(' Instance Method ') # クラスメソッド @classmethod def sample_classmethod(cls, arg_1): print(' Class Method ') # スタティックメソッド @staticmethod def sample_staticmethod(arg_1, arg_2): print(' Static Method ') インスタンスメソッド インスタンスメソッドは所謂通常のメソッドで クラスをインスタンス化してから呼び出す必要が有る 其の定義に於いて 第 1 引数にはクラスのインスタンス自身を表す self が必要と成る def init (self, x, y): self.x = x self.y = y # インスタンスメソッド def sample_instancemethod(self, display_x=true, display_y=true): if display_x: print('x is {}'.format(self.x)) if display_y: print('y is {}'.format(self.y)) test_class_1 = TestClass(100, 50) test_class_1.sample_instancemethod(display_x=false) インスタンスメソッドは self.xxx の様にインスタンス属性 ( インスタンス変数 ) へアクセスする事が出来る クラスメソッド クラスメソッドはインスタンス化しなくても呼び出す事が出来るが インスタンスからでも呼び出す事が出来る クラスメソッドの実装には @classmethod デコレータを用いる -4-

下記の例では 年月日を保持するクラスを作成し 其処にクラスメソッドとして今日の日付を基準としたインスタンスを生成出来る様にして居る 猶 self を用いたインスタンス属性 ( インスタンス変数 ) にはアクセス出来ない import datetime def init (self, year, month, day): self.year = year self.month = month self.day = day # クラスメソッド @classmethod def sample_classmethod(cls, date_diff=0): today = datetime.date.today() d = today + datetime.timedelta(days=date_diff) return cls(d.year, d.month, d.day) # インスタンス化しないで呼び出し test_class_1 = TestClass.sample_classmethod() print(test_class_1.year, test_class_1.month, test_class_1.day) # インスタンス化しないで呼び出し test_class_2 = TestClass.sample_classmethod(-10) print(test_class_2.year, test_class_2.month, test_class_2.day) # 通常のインスタンス test_class_3 = TestClass(2000, 1, 1) print(test_class_3.year, test_class_3.month, test_class_3.day) @classmethod でデコレートされたメソッドはクラスメソッドと成る インスタンスメソッドの第 1 引数には self が必要だが クラスメソッドには cls が必要で有る 此れはクラス自身を表し self が表すクラスのインスタンス其の物とは異なる 亦 cls と謂う引数名は強制ではないが 然うした方が良いと謂う暗黙のルールが有る スタティックメソッド スタティックメソッド ( 静的メソッド ) は インスタンス化しなくても呼び出す事が出来るが インスタンスからでも呼び出す事が出来る 猶 self を用いたインスタンス属性 ( インスタンス変数 ) にはアクセス出来ない スタティックメソッドの実装には @staticmethod デコレータを用いる @staticmethod でデコレートされたメソッドは スタティックメソッドと成る インスタンスメソッドには self クラスメソッドには cls が必要だが スタティックメソッドには必要無い # スタティックメソッド @staticmethod def sample_staticmethod(x, y): return x + y -5-

# インスタンス化しないで呼び出し print(testclass.sample_staticmethod(10, 100)) # インスタンス化してからも呼び出せる test_class = TestClass() print(test_class.sample_staticmethod(100, 1000)) ジェネレータ関数 - yield ジェネレータは反復可能なオブジェクトで有る for 文等でループ処理を行う事が出来るが リスト等で反復処理を行う場合と異なる点は 其の都度必要な分丈値を生成して返す点に有る ジェネレータを用いる利点はメモリを効率的に使用出来る事で有る 例えば 10 個位のデータなら問題無いが 100000000 個のデータの場合 最初から総てを確保すると大量のメモリを消費する 其の為 其の都度 必要な分丈の値を生成し 其れを返すジェネレータが有効な手段と成る ジェネレータ関数の例を 下記に示す def func_sample(): yield(' おはよう ') yield(' こんにちは ') yield(' こんばんは ') for i in func_sample(): print(i) Python では 関数内に yield が含まれると 其の関数はジェネレータと成り 反復可能なオブジェクトと成る 其の為 for 文でループ処理を行う事が出来る 亦 ジェネレータは 下記の様に値を取り出す事も出来る def func_sample(): yield(' おはよう ') yield(' こんにちは ') yield(' こんばんは ') f = func_sample() print(next(f)) print(next(f)) print(f.next()) 上記の様に next( ジェネレータ ) やジェネレータ.next() で結果を得る事も出来る 1 回目の next で最初の おはよう が返さる 此の時点で func_sample は次の呼び出しが有る迄 yield(' おはよう ') の行で待機状態に入る 更に次の next で こんにちは が返され 同じ様に待機状態と成り 最後の こんばんは も同じで有る 此の様に其の都度 yield で値を返すのがジェネレータで有る 猶 next を用いて値を取得するのは for 文等が内部で行って居る事と同じで有る 上記コードは既に総ての yield を処理して居るので 今一度 next を呼び出すと StopIteration が発生する for 文等は 此の例外を捕捉してループを抜ける処理を行って居る -6-