2017-08-15 20 views
1
def mysum(L): 
    return 0 if not L else L[0] + mysum(L[1:]) 

def mysum(L): 
    return L[0] if len(L) == 1 else L[0] + mysum(L[1:]) 

def mysum(L): 
    first, *rest = L 
    return first if not rest else first + mysum(rest) 
  • 後者の二つはまた、単一の文字列引数例えばmysum('spam')に取り組んでいます。
  • 第3の変種は、オープン入力ファイルmysum(open(name))を含む任意のiterableで動作しますが、他のものはインデックスを使用するため、使用できません。
  • ファンクションヘッダーdef mysum(first *rest)は、3番目の変種と同様ですが、個々の引数が1つの繰り返し可能なものではないためです。

入力引数として(first, *rest)の亜種がファイルでは機能しないことを意味していると思われますが、実験したところ、機能することがわかりました。明確化

# Code I tried: 
def mysum(first, *rest): 
    return first if not rest else first + mysum(*rest) 

mysum(*open("script1.py"))が問題ありません。私は何のpythonが、その後見てしまうためmysum(open("script1.py"))が動作しないだろうと思い

[]が真ではないので、それはつもり私に<_io.TextIOWrapper name='script1.py' mode='r' encoding='cp1252'>を与えています意味first = open("script1.pyrest = []です。

+3

と同じです。SOに関する質問は、外部リンクに依存しない自己完結型でなければなりません。また、コードは画像ではなくコピー可能なテキストの形式でなければなりません。 [質問するときにSOのコードイメージをアップロードできないのはなぜですか?](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code- on-so-when-asking-a-question) –

+0

@ PM2Ringああ、ルーキーミスをほぼ犯したhaha – Dan

答えて

2

著者は、入力として反復可能(例:リスト、タプルなど)を取り、その合計を返します。このように:あなたは、これは、ここにコードが入力としてinterableを取ることはありません

f = open("script1.py").readlines() 
mysum(f[0], f[1], ..., f[n]) 

ノートとほぼ同等である

mysum(*open("script1.py")) 

書く

mysum(open("script1.py")) 

ではなく、それは別のいくつかの取り引数は、著者が望むものではないです。

+0

ああ説明に感謝!今私はよく理解しています:-) – Dan

1

何が起こるかを説明するためにタプルを使用する。アンパックには*sequenceの構文が使用されます。

numbers = (1, 2, 3) 

mysum(*numbers) # this happens: mysum(1, 2, 3) 

は、mysum(1, 2, 3)に相当します。メンバーは反復可能性から取り出され、引数として関数に渡されます。 *open('path/to/file')を使用すると、ファイルが開かれ、その内容が引数としてmysum(L)に渡されます。これはmysum(open('path/to/file').read())