Pythonローズマリーキット【おすすめ】


原文:https://git.io/pytips
0 x 01は、ローズマリーの概念を紹介しています。iter_()同前next_()方法のオブジェクト、またはyieldによって定義された「反復可能オブジェクト」を簡略化する一方、いくつかの関数式プログラミング言語(0 x 02 Pythonの関数式プログラミングを参照)では、同様のディレイジェネレータは、特定のフォーマットのリスト(またはシーケンス)を生成するためによく使われています。このときのディケンサは、関数ではなくデータ構造のようなものです。この両者には本質的な差異がない)。PythonはAPL、Haskell、and SMLのいくつかのローズマリーの構造方法を参考にして、itertoolsで実現しました。
itertoolsモジュールは、次の3つのローズマリー構築ツールを提供しています。
無限の反復
2つのシーケンスの反復を統合
コンボジェネレータ
1.無限反復
無限とは、for...in...の文法で反復すると無限ループに陥ることを意味します。
  

count(start, [step])

  cycle(p)

  repeat(elem [,n])
名前から推測できるかもしれませんが、無限反復というからには、そのすべての要素を順番に繰り返して取り出したくはありません。通常はmap/zipなどを組み合わせて、無尽蔵のデータ倉庫として、限られた長さの反復可能なオブジェクトと組み合わせて操作します。
  

from itertools import cycle, count, repeat
print(count.__doc__)
  count(start=0, step=1) --> count object
  Return a count object whose .__next__() method returns consecutive values.
  Equivalent to:
  def count(firstval=0, step=1):
  x = firstval
  while 1:
  yield x
  x += step
  counter = count()
  print(next(counter))
  print(next(counter))
  print(list(map(lambda x, y: x+y, range(10), counter)))
  odd_counter = map(lambda x: 'Odd#{}'.format(x), count(1, 2))
  print(next(odd_counter))
  print(next(odd_counter))

  0

  1

  [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

  Odd#1

  Odd#3

  print(cycle.__doc__)

  cycle(iterable) --> cycle object

  Return elements from the iterable until it is exhausted.

  Then repeat the sequence indefinitely.

  cyc = cycle(range(5))

  print(list(zip(range(6), cyc)))

  print(next(cyc))

  print(next(cyc))

  [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 0)]

  1

  2

  print(repeat.__doc__)

  repeat(object [,times]) -> create an iterator which returns the object

  for the specified number of times. If not specified, returns the object

  endlessly.

  print(list(repeat('Py', 3)))

  rep = repeat('p')

  print(list(zip(rep, 'y'*3)))

  ['Py', 'Py', 'Py']

  [('p', 'y'), ('p', 'y'), ('p', 'y')]

2.2つのシーケンスの反復を統合する
2つのシーケンスを統合するというのは、2つの有限なシーケンスを入力として、それを統合して動作した後、1つのローズマリーに戻ります。最も一般的なzip関数はこのカテゴリに属します。zipは内蔵関数です。このカテゴリの完全な方法は以下を含む。
 

 accumulate()

  chain()/chain.from_iterable()

  compress()

  dropwhile()/filterfalse()/takewhile()

  groupby()

  islice()

  starmap()

  tee()

  zip_longest()

ここでは、すべての方法を例に挙げないで説明します。ある方法の使い方を知りたいなら、基本的にprintを通して説明します。doc_つまり、itertoolsモジュールは一種のショートカットを提供しているだけで、奥深いアルゴリズムを含んでいないことが分かります。ここでは次のような面白い方法だけを例に挙げて説明します。
  

from itertools import cycle, compress, islice, takewhile, count

  #      (      )        

  # print(compress.__doc__)

  print(list(compress(cycle('PY'), [1, 0, 1, 0])))

  #       l[start:stop:step]         

  # print(islice.__doc__)

  print(list(islice(cycle('PY'), 0, 2)))

  #      filter

  # print(takewhile.__doc__)

  print(list(takewhile(lambda x: x < 5, count())))

  ['P', 'P']

  ['P', 'Y']

  [0, 1, 2, 3, 4]

  from itertools import groupby

  from operator import itemgetter

  print(groupby.__doc__)

  for k, g in groupby('AABBC'):

  print(k, list(g))

  db = [dict(name='python', script=True),

  dict(name='c', script=False),

  dict(name='c++', script=False),

  dict(name='ruby', script=True)]

  keyfunc = itemgetter('script')

  db2 = sorted(db, key=keyfunc) # sorted by `script'

  for isScript, langs in groupby(db2, keyfunc):

  print(', '.join(map(itemgetter('name'), langs)))

  groupby(iterable[, keyfunc]) -> create an iterator which returns

  (key, sub-iterator) grouped by each value of key(value).

  A ['A', 'A']

  B ['B', 'B']

  C ['C']

  c, c++

  python, ruby

  from itertools import zip_longest

  #      zip             ,

  # zip_longest          ,        fillvalue

  # Python 2.7     izip_longest

  print(list(zip_longest('ABCD', '123', fillvalue=0)))

  [('A', '1'), ('B', '2'), ('C', '3'), ('D', 0)]

3.コンビネーションジェネレータ
ジェネレータの配列の組み合わせについて:

product(*iterables, repeat=1):           

  permutations(iterable, r=None):            

  combinations(iterable, r):        

  combinations_with_replacement(iterable, r):         

  from itertools import product, permutations, combinations, combinations_with_replacement

  print(list(product(range(2), range(2))))

  print(list(product('AB', repeat=2)))

  [(0, 0), (0, 1), (1, 0), (1, 1)]

  [('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]

  print(list(combinations_with_replacement('AB', 2)))

  [('A', 'A'), ('A', 'B'), ('B', 'B')]

  #     :4   2      (A^4_2)

  print(list(permutations('ABCDE', 2)))

  [('A', 'B'), ('A', 'C'), ('A', 'D'), 
 ('A', 'E'), ('B', 'A'), ('B', 'C'), 
 ('B', 'D'), ('B', 'E'), ('C', 'A'), 
 ('C', 'B'), ('C', 'D'), ('C', 'E'), 
 ('D', 'A'), ('D', 'B'), ('D', 'C'), 
 ('D', 'E'), ('E', 'A'), ('E', 'B'), ('E', 'C'), ('E', 'D')]

  #     :4         2      (C^4_2)

  print(list(combinations('ABCD', 2)))

  [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]