python高級特性紹介


Pythonの5つの特性:スライス、反復、リスト生成式、ジェネレータ、サブジェネレータ。
スライス
スライスは他の言語のカットオフ関数に相当し、要素を指定する部分を取る。

L = list(range(100))

#         
print(L[0:10]) #     0 9  10   
print(L[-10:]) #   10   
print(L[10:20])#    10 19 10   
print(L[:10:2])#  10            
print(L[::10]) #      10       
実行結果:
インデックスから0から9までの最初の10個の要素をとります。[0,1,2,3,4,5,6,7,8,9]
最後の10個の元素を取ります。[90,91,92,93,94,95,96,97,98,99]
インデックス10から19までの10個の要素をとります。[10,11,12,13,14,15,16,17,18,19]
前の10個の要素の中から二つごとに一つの元素を取ります。[0,2,4,6,8]
すべての要素の中で10個ずつ元素を取ります。[0,10,20,30,40,50,60,70,80,90]
反復(Iteration)
反復、すなわち巡回。forサイクルを使う時は、反復可能なオブジェクトに作用すると、forサイクルが正常に動作します。
オブジェクトが反復可能なオブジェクトであると判断します。

from collections import Iterable

print('    is Iterable ?',isinstance('abc',Iterable))
print('list is Iterable ?',isinstance([1,2,3],Iterable))
print('   is Iterable ?',isinstance(123,Iterable))
実行結果:
文字列is Iterable?True
list is IterableTrue
整数is Iterable?False
反復可能なオブジェクトを巡回するいくつかの方法:

#     :
for ch in 'abc':
  print(ch)

#  list
L = ['A','B','C']
for tmp in L:
  print(tmp)

for i,value in enumerate(L):
  print(i,':',value)

#  dict
d = {'1':'111','2':'222','3':'333'}
for key,v in d.items():
  print('key:',key,'value:',v)
リスト生成式
一般的なリスト生成方式:

list(range(1, 11))
しかし、pythonに内蔵されているリスト生成式により、異なる姿勢でリストを生成することができます。

[x * x for x in range(1,11)]

#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
このように:

[x * x for x in range(1, 11) if x % 2 == 0]

[4, 16, 36, 64, 100]
このようにしてもいいです

[m + n for m in 'ABC' for n in 'XYZ']

['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
姿勢が上がっていますか?ははは~
ジェネレータ(generator)
上のリスト生成式により、直接リストを作成することができます。しかし、メモリの制限を受けて、リストの容量はきっと限られています。だから、もしリスト要素があるアルゴリズムによって推計できたら、私達は循環過程の中で継続的に後続の元素を推計できますか?このようにして、完全なリストを作成する必要はなく、スペースを節約します。Pythonでは、このように循環しながら計算する仕組みが、ジェネレータとなります。
ジェネレータを作成する最も簡単な方法:リストの[]を()に変更する。

L = [x * x for x in range(1,10)]
print(L)

g = (x * x for x in range(1,10))
print(g)

//    :
[1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x10cc14938>
また、generatorも反復可能なオブジェクトであり、forによって巡回することができます。
generatorを定義する別の方法:

def fib(max):
  n,a,b = 0,0,1
  while n < max:
    yield b
    a,b = b, a+b
    n = n + 1
  return 'done' 

print(fib(6))
関数定義にyieldキーワードが含まれている場合、この関数は普通の関数ではなく、一つのgeneratorです。一番分かりにくいのは、generatorと関数の実行プロセスが違います。関数は順番に実行されます。return文または最後の行の関数文があったら戻ります。そして、generatorの関数となり、next()を呼び出すたびに実行され、yield文が戻ってきて、再度実行する時に前回返したyield文から実行を継続します。
ディレクタ(Iterator)
生成器はforループに作用するだけでなく、next()関数によって継続的に呼び出されて次の値に戻ることができます。最後にStopIterationエラーが出たら次の値に戻り続けることができないということです。next()関数によって呼び出され、次の値に戻ってくるオブジェクトを重ねて「Iterator」と呼びます。
isinstance()を使って、オブジェクトがIteratorオブジェクトかどうかを判断できます。

from collections import Iterator
print('list is Iterator ?',isinstance([], Iterator))
print('dict is Iterator ?',isinstance({}, Iterator))
print('string is Iterator ?',isinstance('123', Iterator))

//    :
list is Iterator ? False
dict is Iterator ? False
string is Iterator ? False
以上はpythonの高級な特性の簡単な紹介の詳しい内容で、更にpythonの高級な特性の資料に関して私達のその他の関連している文章に関心を持って下さい!