2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-26

#はじめに
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章終了。
とりあえずご飯食べたいのでこの記事はここまで。

2
1
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?