python 4:高度なプロパティ
7642 ワード
スライス
≪スライス|Slice|oem_src≫:索引の範囲を指定するアクション
スライス操作は非常に有用です.まず0~99の数列を作成します.
スライスで簡単に数列を取り出すことができます.たとえば、最初の10の数:
あと10個
最初の11~20の数:
最初の10の数は、2つごとに1つずつ取ります.
すべての数は、5つごとに1つずつ取ります.
文字列を逆出力
tupleもlistで、唯一の違いはtupleが可変ではないことです.したがって、tupleはスライスで操作することもできますが、操作の結果はtupleです.
文字列「xxx」はlistと見なすこともでき、各要素は文字である.したがって、文字列はスライスで操作することもできますが、操作結果は文字列です.
反復
listまたはtupleが与えられた場合、forループによってこのlistまたはtupleを遍歴することができ、この遍歴を反復(Iteration)と呼ぶ.
Pythonでは、反復はfor...inで完成した、swiftとOCのfor...in類似
デフォルトではdict反復はkeyです.valueを反復する場合はfor value in d.values()、keyとvalueを同時に反復する場合はfor k、v in d.items()を使用します.
文字列も反復可能なオブジェクトであるため、forループにも使用できます.
したがって、forループを使用すると、反復可能なオブジェクトに作用すれば、forループは正常に動作しますが、リストなのか他のデータ型なのかはあまり気にしません.反復可能オブジェクトかどうかを判断する
listにJavaのような下付きループを実装するにはどうすればいいですか?Pythonに内蔵されたenumerate関数はリストをインデックス-要素ペアにすることができ、forサイクルでインデックスと要素自体を同時に反復することができます.
リスト生成
リスト生成式はList Comprehensionsであり、Pythonに内蔵された非常に簡単で強力なlistを作成するための生成式である.
list[1,2,3,4,5,6,7,8,9,10]を生成するにはlist(range(1,11))を使用します.
[1 x 1,2 x 2,3 x 3,...,10 x 10]を生成するには:
偶数のみの平方をフィルタします.
リスト生成式は、2つの変数を使用して
L=['Hello','World',18,'Apple',None]Lのすべての文字列を小文字にして出力し、結果:['hello','world','apple']を出力します.
ビルダー
リスト生成式により、リストを直接作成できます.ただし、メモリの制限を受けると、リストの容量は限られているに違いありません.また、100万個の要素を含むリストを作成すると、大きなストレージスペースを消費するだけでなく、前のいくつかの要素にアクセスするだけで、後ろのほとんどの要素が消費するスペースが無駄になります.だから、リスト要素が何らかのアルゴリズムで推定できるなら、ループの過程で後続の要素を絶えず推定することができますか?これにより、listを完全に作成する必要がなくなり、大量のスペースを節約できます.Pythonでは,このようにループしながら計算する機構をジェネレータ:
一丶
二丶
反復器
forサイクルに直接作用できるデータ型は、リスト、tuple、dict、set、strなどの集合データ型である.1つのクラスはgeneratorであり、ジェネレータとyield付きgenerator functionを含む.
これらの
一方、
ジェネレータはいずれも
**list、dict、strなどのデータ型がIteratorではないのはなぜですか?**これは、Pythonの
≪スライス|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
対象であるが、list
、dict
、str
はIterable
であるがIterator
ではない.list
、dict
、str
などのIterable
をIterator
にするには、iter()
関数を使用します.>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
**list、dict、strなどのデータ型がIteratorではないのはなぜですか?**これは、Pythonの
Iterator
オブジェクトがデータストリームを表しているためであり、Iterator
オブジェクトはnext()
関数によって呼び出され、データがないときにStopIteration
エラーが投げ出されるまで次のデータを繰り返し返すことができる.このデータストリームは秩序化されたシーケンスと見なすことができるが、シーケンスの長さを事前に知ることはできず、next()
関数を通じて次のデータをオンデマンドで計算するしかないため、Iterator
の計算は不活性であり、次のデータを返す必要がある場合にのみ計算される.Iterator
は、全体の自然数のような無限大なデータストリームを表すこともできる.list
を使用すると、自然数全体を格納することは永遠に不可能です.