pythonの軽いおさらいと朝のネイチャーウォーキング

12月15日くらいから冬休みが始まって弟の高校であるVAに滞在中。1月4日に帰る予定。アメリカのママンとパパン、そして子供達にも会って遊んだり本読んだり。ちょっとした仕事くらいはしているが事務的なことが主なのでそこまで苦ではない。日課としてELSAとProject Eulerを毎日やっている。あとは最近発見したのだが、朝のネイチャーウォーキングにハマっている。朝の散歩は一日の幸福度上昇に関係があるに違いない。

f:id:whipmegrandma:20171231095855j:plain
今朝犬と散歩した時に撮った一枚

f:id:whipmegrandma:20171231095859j:plain
やっと撮れたこの一枚

普段は外食か手作りなので家庭で切り盛りされた豪華なご飯を食べると感動してしまう。

f:id:whipmegrandma:20171231095843j:plain
毎日こんな感じのイタリアンフュージョンなご飯を食べている

そういえば最近pythonを使っていなかったから細かいところで若干ググることがあったので備忘録としてちょっとここにメモっておこうかな。

List Slicing in Python

コロンが境界線になっていると覚えれば簡単かもしれない。言い換えればコロンよりある数字の場所によってそのポジションにある数字をとるのかそのポジション以外にある数字をとるのかが決まる。コロンより右にある場合はその数字が指定したポジションにある数字をとる何個とるかを決める。コロンより左にある場合はその数字が指定したポジションにある数字以外の要素を全て取ってきてくれる。

a[start:end] # items start through end-1
a[start:]    # items start through the rest of the array
a[:end]      # items from the beginning through end-1
a[:]         # a copy of the whole array

>>> lst = [1,2,3]
>>> lst[:1]
[1]
>>> lst[1:]
[2, 3]
>>> lst[0:]
[1, 2, 3]
>>> lst[:0]
[]

a[-1]    # last item in the array
a[-2:]   # last two items in the array
a[:-2]   # everything except the last two items

| |<

しかしこのスライス方法はあまり効率的ではなくいくつかmの副作用があることを知っておいたほうがいいかもしれない。例えばこれは厳密にはスライスというよりはリストを新たに生成していそれを加工しているのだ。そのためpopやdelといった関数の方が効率は良い。

*Tail Recursive on Lists

>|python|
>>> def listSum(ls):
...     # Base condition
...     if not ls:
...         return 0
...
...     # First element + result of calling `listsum` with rest of the elements
...     return ls[0] + listSum(ls[1:])
>>> 
>>> listSum([1, 3, 4, 5, 6])
19

>>> def listSum(ls, result):
...     if not ls:
...         return result
...     return listSum(ls[1:], result + ls[0])
... 
>>> listSum([1, 3, 4, 5, 6], 0)
19

| |<

Tail Recursionは予め引数としてresultを渡しておくことでより効率的に動かせるという利点がある。