ichirin2501's diary

いっちりーん。

pythonで可変引数

# -*- coding: utf-8 -*-

def __gcd(a,b):	
	return a if b==0 else __gcd(b,a%b)

def gcd(*args):
	return reduce(__gcd, args)

def __lcm(a,b):
	return a*b/__gcd(a,b)

def lcm(*args):
	return reduce(__lcm, args)
	
def main():
	print gcd(8,4,12)
	print lcm(8,4,12)
	

if __name__ == '__main__' :
	main()

可変引数便利!と初めて思った。


Python三項演算子書きたいなーって調べたら、
Python2.5以降でしか使えないらしく、その上、'真の場合 if 式 else 偽の場合' という…きもちわるい
真の場合 if 式
という記述だけならまだしも、後ろにelseが絡んでるので式を真ん中にして両端に返す値が来てる。
基本的に左から右の流れである手続き型言語をずっとやってきた人にとっては抵抗を感じる構図ではないだろうか。
そんなわけで、真ん中から見て 左が真、右が偽 のように捉えれば問題ない。よし、あとは慣れの問題だ。


最小公倍数を書いてるときに、

def lcm(*args):
	return reduce(lambda a,b:a*b, args)/gcd(args)

とか、アルゴリズム的にも間違ってる書き方をしてしまったんだけど、得たものがあったw
'int'と'tuple'の除算なんてねーよばーかと言われた。

print type(gcd(args)) # <type 'tuple'>
print type(gcd(2,3)) # <type 'int'>

ほえ?
gcd(args)という記述が悪かった。

print type(gcd(*args)) # <type 'int'>

こんな感じで書いたら動作した。
アスタリスクは関数定義するときの引数が可変かどうかだけだと思ってたんだけど、調べてみたところ

gcd(args) ==> gcd((8,4,12)) の意味で、
gcd(*args) ==> gcd(8,4,12) の意味になる(展開?)っぽい。
インタプリタ上で、
print *(1,2,3) とか、
print *((1,2,3),(2,3)) とかはだめみたいで、エラーはかれたw
list型で試してみたけど、同様にエラーはかれた。


tupleじゃなくても当然動作するよね!ということで試してみたが、

def test():
	data1 = [8,4,12] #list
	print type(data1) # type 'list'
	return gcd(*data1)

list型でも同様に動作(当然)


風邪をひいて4日目突入である。