Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

JavaおじさんがPythonを使えるようになるまでの全記録(その4)

はじめに

1日1回投稿すると言ったな、あれは嘘だ。
いや時間あるんだものw

しかしまさかこんなおっさんの備忘録にコメントやいいねが来るとは予想外。
絶対誰も見てないだろうと思ったのにね。

関数

テキストの4章のタイトルが「関数、スコープ、抽象化」ということで一応制御構造は一段落なのかな。
たぶんまた小出しにしてくるんだろうけども。

まずは関数。

定義の書式としては型指定が必要ないって点ではJavascriptあたりと似たような感じかな。
一回キーワード引数で呼び出しを記述したらそのあとは最後までキーワード引数でないとダメなのね。
つまり

OK : printName('Koji', lastName='Nagahara', reverse=True)
NG : printName('Koji', lastName='Nagahara', True)

てことか。
パラメータのデフォルト値の設定はまあJavaにもあるし。

では練習がてらお題を解いてみよう。

2つの文字列を引数とし、このどちらか一方の文字列が他方の文字列に含まれる場合Trueを返し、それ以外の場合にFalseを返す関数を書け。inを使ってよし。

関数定義は上に書くのか下に書くのかって議論はありそうよね。
メインの処理の下に書く方が自然かなーとは思うけど、それ以外の構成は割とカオスにならざるを得んかな。
と思って下に書いたらエラーになりやがんの。

NameError: name 'isIn' is not defined

ですってよ奥さん。要するに前に書いてあるシンボルでないと名称解決ができないということかな。
まあインタープリタ型の言語だしな。
最終的に落ち着いたのはこちら。

4-1.py
def isIn(t1, t2):
    return t1 in t2 or t2 in t1

print('abcとabを引数に与えたisInの結果:', isIn('abc', 'ab'))
print('abとcaabbを引数に与えたisInの結果:', isIn('ab', 'caabb'))
print('abcとxyzを引数に与えたisInの結果:', isIn('abc', 'xyz'))

実行結果はこんな感じ。

abcとabを引数に与えたisInの結果: True
abとcaabbを引数に与えたisInの結果: True
abcとxyzを引数に与えたisInの結果: False

いたって普通。

スコープ

まあ(その1)の親切なコメントのおかげでPythonのスコープの種類がいろいろあるのはわかったし、Javaほどネームスペースが細切れになったりしないということもわかった。

テキストにはスタックフレームについて凄い詳細に書いてあるけど、ぶっちゃけ今はそこまではいいや。
しかし関数内で関数定義ができるのか...無名関数とかでなくて普通に関数定義ができるとなるとこれはむしろ教えづらい気がするな...

まあ同一モジュールの中で同名変数はなるべく使わないようにする方が無難ぽいかな。
テキストにも

気にしなくてよい

って書いてあるしなw

仕様

ふむ、Design by Contractの話ね。終了。
"""から始まるドキュメンテーション文字列ってみんなどのくらい使ってるんだろう。
Javadocの使用率からみて推して知るべしなのかしらね。
しかしここに出てくる抽象化の例は面白いけど抽象化って言っていいのかなw

再帰

再帰もなー。散々他の言語でもやったし「あーやっぱできるんだー」で終了する話ではある。

広域変数

グローバル変数も使えます、で終了かな。
1970年代に既に批判されていたと...70年代...
日本でグローバル変数あかんて言われ始めたのってもうちょい最近じゃなかったっけw
「本当に必要とされる時もある」とだけ書かれてても説得力はないのよなー。
グローバル変数が有用だった事例って思い出せないな...

モジュール

これはどっちかって言うと構造化言語からオブジェクト指向言語に至る過渡期の機能ってイメージかな。
importでモジュールに対する参照関係を設定するわけだけど、情報隠蔽の概念はなし。
モジュール同士はネームスペースが違うので明示的にどのモジュールで定義されたメンバか指定する必要はある、と。
モジュールとクラスの使い分けを明示的にやってるケースってどのくらいあるのかな。
8章あたりで解説あるみたいだしそれまではおいとこうか。

ファイルの扱い

openでファイルハンドルを取得して、read/writeで読み書きして最後にファイルハンドルをcloseする、でおしまい。
うん、C言語から変わらない由緒正しいいつもの流れですね。
for ... inで読み込みが簡潔に書けますってのはいいんだけどJavaの例外処理に慣れた身だとコードがシンプルすぎて不安になるな...w

と、ここまでで4章終了。
とりあえずご飯食べたいのでこの記事はここまで。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?