キンサクプログラマー

お金儲けと技術のメモ

Cプログラマが直面したPythonの不自然さ

Pythonを書いたり読んだりしていると、慣れない用語や言語機能がバンバン出てくるので、勉強したこととしてまとめておきたい。

ジェネレータ

説明しずらいが、イテレータの一種で呼び出されるごとに生成されるってことらしい。
*ネットに転がっているサンプルソースにnext()を使っているものが多数あるが、これはpython2.*系の名前なので、3系の実行環境だと動かない。
2系と3系で互換とれてないのは致命的だよなぁ・・・

def fruits():
    yield "apple"
    yield "orange"
    yield "melon"

print(list(fruits()))#["apple","orange","melon]
fruits().__next__()#でもコールすることができる

デコレータ

説明が難しい上に理解できているか怪しいが、ラッパーを簡単にかける。

def cake(func):
    func()
    print("cake")

@cake
def melonCake():
    print("melon")
#melonCake = cake(melonCake) @cakeってやるとこの記述と同じ意味になるので、定義だけじゃなくて実行もされる

結果

melon
cake

初めは理解できないけどなれれば・・・  いや、初めから納得できない仕様はクソだな。

@Property

メンバー変数のセッター省略できるってことか?よくわからん!

class A():
    def __init__(self):
        self.x=0
    def getx(self):
        return self.x

a = A()
print(a.getx())
a.x = 5
print(a.getx())
print(a.x)

クロージャ

コールされたネームスペースにある変数を参照可能な関数内関数。らしい。

def  calc(start=0):
	num = start
	def closure():
		nonlocal num	# 外側の変数を参照
		num += 1
		return num

	return closure		# クロージャを返す

def main():
	func = calc(5)
	print(func())
	print(func())
	print(func())
	print(func())
	print(func())

main()

結果

6
7
8
9
10

C言語でいう静的なローカル変数のような感じかな。
ただ、静的なローカル変数使いたいだけなのに、わざわざ関数内に関数を宣言してわちゃわちゃやる意味はよくわからない。

感想

調べれば調べるほどよくわからない機能が出てくる。
これ自然に理解できるもんなのかな、すんなり理解ができない仕様だと思うんだけど。