python 4:高度なプロパティ

7642 ワード

スライス
≪スライス|Slice|oem_src≫:索引の範囲を指定するアクション
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
      
>>> L[0:3]
['Michael', 'Sarah', 'Tracy']
#L[0:3]  ,   0   ,    3  ,      3。   0,1,2,   3   
#   0     . L[:3]
Python  L[-1]        ,           
>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']

スライス操作は非常に有用です.まず0~99の数列を作成します.
>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]

スライスで簡単に数列を取り出すことができます.たとえば、最初の10の数:
>>> L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

あと10個
>>>L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

最初の11~20の数:
>>>L[10:20]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

最初の10の数は、2つごとに1つずつ取ります.
>>>L[:10:2]
[0, 2, 4, 6, 8]

すべての数は、5つごとに1つずつ取ります.
>>>L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

文字列を逆出力
>>>str = 'abcd'
>>>str2 = str[::-1]
>>>print(str2)
dcba

tupleもlistで、唯一の違いはtupleが可変ではないことです.したがって、tupleはスライスで操作することもできますが、操作の結果はtupleです.
>>> (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)

文字列「xxx」はlistと見なすこともでき、各要素は文字である.したがって、文字列はスライスで操作することもできますが、操作結果は文字列です.
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'

反復
listまたはtupleが与えられた場合、forループによってこのlistまたはtupleを遍歴することができ、この遍歴を反復(Iteration)と呼ぶ.
Pythonでは、反復はfor...inで完成した、swiftとOCのfor...in類似
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
...        print(key)
...
a
b
c
#  dict       list       ,  ,              。

デフォルトではdict反復はkeyです.valueを反復する場合はfor value in d.values()、keyとvalueを同時に反復する場合はfor k、v in d.items()を使用します.
for k, v in d.items():
    print(k,v)

a ,1
b ,2
c ,3

文字列も反復可能なオブジェクトであるため、forループにも使用できます.
>>> for ch in 'ABC':
...  print(ch)
...
A
B
C

したがって、forループを使用すると、反復可能なオブジェクトに作用すれば、forループは正常に動作しますが、リストなのか他のデータ型なのかはあまり気にしません.反復可能オブジェクトかどうかを判断する
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str     
True
>>> isinstance([1,2,3], Iterable) # list     
True
>>> isinstance(123, Iterable) #        
False

listにJavaのような下付きループを実装するにはどうすればいいですか?Pythonに内蔵されたenumerate関数はリストをインデックス-要素ペアにすることができ、forサイクルでインデックスと要素自体を同時に反復することができます.
>>> for i, value in enumerate(['A', 'B', 'C']):
...  print(i, value)
...
0 A
1 B
2 C

リスト生成
リスト生成式はList Comprehensionsであり、Pythonに内蔵された非常に簡単で強力なlistを作成するための生成式である.
list[1,2,3,4,5,6,7,8,9,10]を生成するにはlist(range(1,11))を使用します.
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

[1 x 1,2 x 2,3 x 3,...,10 x 10]を生成するには:
>>> [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]

リスト生成式は、2つの変数を使用してlistを生成することもできます.
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

L=['Hello','World',18,'Apple',None]Lのすべての文字列を小文字にして出力し、結果:['hello','world','apple']を出力します.
>>>[x.lower() for x in L if isinstance(x,str)]
['hello', 'world', 'apple']

ビルダー
リスト生成式により、リストを直接作成できます.ただし、メモリの制限を受けると、リストの容量は限られているに違いありません.また、100万個の要素を含むリストを作成すると、大きなストレージスペースを消費するだけでなく、前のいくつかの要素にアクセスするだけで、後ろのほとんどの要素が消費するスペースが無駄になります.だから、リスト要素が何らかのアルゴリズムで推定できるなら、ループの過程で後続の要素を絶えず推定することができますか?これにより、listを完全に作成する必要がなくなり、大量のスペースを節約できます.Pythonでは,このようにループしながら計算する機構をジェネレータ:generatorと呼ぶ.
一丶generatorを作成する:リスト生成式の[]を()に変更し、generatorを作成する
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
 at 0x1022ef630>
#  L g          [] (),L   list, g   generator。
generatorはアルゴリズムを保存し、next(g)を呼び出すたびにgの次の要素の値を計算し、最後の要素まで計算し、より多くの要素がない場合、StopIterationのエラーを投げ出す.しかし、generatorを作成すると、next()は基本的に呼び出されず、forサイクルによって反復され、StopIterationのエラーに関心を持つ必要はありません.
二丶generatorを定義する別の方法.関数定義にyieldのキーワードが含まれている場合、この関数は通常の関数ではなく、generatorです.
#      (Fibonacci)
def fib(max):
 n, a, b = 0, 0, 1 
   while n < max: 
     yield b
     a, b = b, a + b 
     n = n + 1 
  return 'done'
generatorと関数の実行フローは異なります.関数は順番に実行され、return文または最後の行の関数文に遭遇すると返されます.generatorとなる関数は、next()が呼び出されるたびに実行され、yield文の戻りに遭遇し、再実行時に前回返されたyield文から実行が継続される
反復器
forサイクルに直接作用できるデータ型は、リスト、tuple、dict、set、strなどの集合データ型である.1つのクラスはgeneratorであり、ジェネレータとyield付きgenerator functionを含む.
これらのforサイクルに直接作用することができるオブジェクトは、総称して反復可能なオブジェクト:Iterableと呼ばれる.isinstance()を使用して、1つのオブジェクトがIterableオブジェクトであるかどうかを判断できます.
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

一方、 は、forサイクルに作用するだけでなく、next()関数によって絶えず呼び出され、次の値を返すことができ、最後にStopIterationエラーが投げ出されて次の値を返すことができないことを示すまで戻ることができる.next()関数によって呼び出され、次の値を継続的に返すことができるオブジェクトを反復器:Iteratorと呼ぶ.isinstance()を使用して、1つのオブジェクトがIteratorオブジェクトであるかどうかを判断できます.
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

ジェネレータはいずれもIterator対象であるが、listdictstrIterableであるがIteratorではない.listdictstrなどのIterableIteratorにするには、iter()関数を使用します.
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

**list、dict、strなどのデータ型がIteratorではないのはなぜですか?**これは、PythonのIteratorオブジェクトがデータストリームを表しているためであり、Iteratorオブジェクトはnext()関数によって呼び出され、データがないときにStopIterationエラーが投げ出されるまで次のデータを繰り返し返すことができる.このデータストリームは秩序化されたシーケンスと見なすことができるが、シーケンスの長さを事前に知ることはできず、next()関数を通じて次のデータをオンデマンドで計算するしかないため、Iteratorの計算は不活性であり、次のデータを返す必要がある場合にのみ計算される.Iteratorは、全体の自然数のような無限大なデータストリームを表すこともできる.listを使用すると、自然数全体を格納することは永遠に不可能です.