『Python基礎教程』学習ノート(6-7抽象)

16817 ワード

6.抽象
6.1関数
def定義関数の使用
def fibs(num):
    result = [0, 1]
    for i in range(num - 2):
        result.append(result[-2] + result[-1])
    return result

print fibs(10)

6.1.1記録関数
関数の先頭に文字列を書くと、ドキュメント文字列と呼ばれる関数の一部として格納されます.doc関数プロパティからアクセスします.
def fibs(num):
    '        '
    result = [0, 1]
    for i in range(num - 2):
        result.append(result[-2] + result[-1])
    return result

print fibs.__doc__
help(fibs)
print fibs(10)

//   
        
Help on function fibs in module __main__:

fibs(num)
            

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

6.2パラメータ
文字列(および数値とメタグループ)は可変ではありません.すなわち、関数内でパラメータに値を割り当てると、外部の変数の値は変更されません.
キーワードパラメータ
def hello(name, greeting):
    print '%s, %s' % (greeting, name)

hello(greeting='hello', name='world')

パラメータのデフォルト
def hello(name="world", greeting="hello"):
    print '%s, %s' % (greeting, name)

hello(greeting='greeting')

可変パラメータ
パラメータの前に「*」を付けることで、可変パラメータを表し、結果はメタグループになります.
パラメータの前に「**」を付けることで、可変キーワードパラメータを表し、結果は辞書になります.
def print_params(x, y, z=3, *pospar, **keypar):
    print x, y, z
    print pospar
    print keypar

print_params(1, 2, 4, 5, 6, 7, foo=9, bar=10)

//   
1 2 4
(5, 6, 7)
{'foo': 9, 'bar': 10}

リバースプロセス
>>> def addTest(x, y): return x+y
>>> params=(1, 2)
>>> print addTest(*params)
3

6.5役割ドメイン
x = 1


def change_global():
    global x
    x = x + 1

change_global()
print x

#   
2

6.6再帰
6.6.1階乗
ループ
def factorial(n):
    result = n
    for i in range(1, n):
        result *= i
    return result

print factorial(5)

再帰
def factorialRecursion(n):
    if n == 1:
        return 1
    else:
        return n * factorialRecursion(n - 1)

print factorialRecursion(4)

6.6.2べき乗
ループ
def power(x, n):
    result = 1
    for i in range(n):
        result *= x
    return result

print power(2, 3)

再帰
def powerRecursion(x, n):
    if n == 0:
        return 1
    else:
        return x * powerRecursion(x, n - 1)

print powerRecursion(3, 3)

6.6.3二元検索
def search(sequence, number, lower=0, upper=None):
    if upper is None:
        upper = len(sequence) - 1
    if lower == upper:
        assert number == sequence[upper]
        return upper
    else:
        middle = (lower + upper) // 2
        if number > sequence[middle]:
            return search(sequence, number, middle + 1, upper)
        else:
            return search(sequence, number, lower, middle)

seq = [34, 67, 8, 123, 4, 100, 95]
seq.sort()
print seq
print search(seq, 34)
print search(seq, 100)

#   
[4, 8, 34, 67, 95, 100, 123]
2
5

6.7この章の新しい関数
関数#カンスウ#
説明
map(func, seq [, seq, …])
シーケンス内の各要素に関数を適用
filter(func, seq)
関数が真の要素のリストを返します.
reduce(func, seq [, initial])
func(func(func(seq[0],seq[1]),seq[2],...)に等しい
sum(seq)
seq内のすべての要素の和を返します.
apply(func[, args[, kwargs]])
パラメータを指定できる関数を呼び出す
7.より抽象的
7.1クラスの作成
class Person:

    def setName(self, name):
        self.name = name

    def getName(self):
        return self.name

    def greet(self):
        print "hello, world! I'm %s." % self.name

foo = Person()
bar = Person()
foo.setName('Luke Sky')
bar.setName('Ana Walker')
foo.greet()
bar.greet()

#   
hello, world! I'm Luke Sky.
hello, world! I'm Ana Walker.

selfパラメータは実際にはメソッドと関数の違いであり、メソッドはそれらの最初のパラメータを所属するインスタンスにバインドします.
def func():
    print "I don't"

bar.greet = func

bar.greet()

#   
I don't

同じメソッドを参照する他の変数は、任意に使用できます.
fooTest = foo.greet
fooTest()
#   
hello, world! I'm Luke Sky.

厳密な意味での私有化はなく、単一の下線を使用して内部データを定義できます.このような名前はアスタリスク付きimports文にインポートされません.
7.2継承
class Filter:
    def init(self):
        self.blocked = []

    def filter(self, sequence):
        return [x for x in sequence if x not in self.blocked]


class SPAMFilter(Filter):  # SPAMFilter Filter   
    def init(self):  #   Filter    init  
        self.blocked = ['SPAM']


s = SPAMFilter()
s.init()
print s.filter(['SPAM', 'egg', 'SPAM', 'test'])

#   
['egg', 'test']
#   SPAMFilter   Filter   
print issubclass(SPAMFilter, Filter)

#       
print SPAMFilter.__bases__

#            
s = SPAMFilter()
print isinstance(s, SPAMFilter)
print isinstance(s, Filter)

#          
print s.__class__
print type(s)

#   
True
(<class '__main__.Filter'>,)
True
True
<class '__main__.SPAMFilter'>
<class '__main__.SPAMFilter'>

7.3多重継承
class Calculator:
    def calculate(self, expression):
        self.value = eval(expression)


class Talker:
    def talk(self):
        print 'Hi, my value is', self.value


class TalkingCalculator(Calculator, Talker):
    pass

tc = TalkingCalculator()
tc.calculate('1+2*3')
tc.talk()


#             
print hasattr(tc, 'talk')
print hasattr(tc, 'fnord')

#   
Hi, my value is 7
True
False

7.4この章の新しい関数
関数#カンスウ#
説明
callable(object)
オブジェクトが呼び出されるかどうかを決定します(関数やメソッドなど).
getattr(object, name[, default])
プロパティの値を決定します.デフォルト値の指定を選択できます.
hasattr(object, name)
オブジェクトに特定のプロパティがあるかどうかを確認します.
isinstance(object, class)
オブジェクトがクラスのインスタンスであるかどうかを決定します.
issubclass(A, B)
AがBのサブクラスかどうかを確認
random.choice(sequence)
空でないシーケンスから要素をランダムに選択
setattr(object, name, value)
オブジェクトの所与の特性をvalueに設定
type(object)
オブジェクトのタイプを返す