個人的な使用へのアクセスが間違っている場合にのみ、また私を修正してください。
その理由は、の高度な機能を使用することで、単純なにコードを。開発効率が高い、コードが少ないです。
薄切
同じリストやタプルをスライスします。文字列も同様です。
リストの例については
L = ["Harden", "Durant", "Jordan", "Curry", "O'Neal"] print(L[0:3]) # 取前3个元素 # output:['Harden', 'Durant', 'Jordan'] print(L[:3]) # 第一个索引是0,还可以省略 # output:['Harden', 'Durant', 'Jordan'] print(L[1:3]) # 从索引1开始,取出2个元素出来 # output:['Durant', 'Jordan'] print(L[:]) # L[:]实际上是复制,这种复制是浅拷贝。 # output:['Harden', 'Durant', 'Jordan', 'Curry', "O'Neal"] print(L[::2]) # 第三个参数表示每N个取一个 # output:['Harden', 'Jordan', "O'Neal"] # 倒序切片:记住倒数第一个元素的索引是-1。倒序切片包含起始索引,不包含结束索引。 print(L[-2:]) # 取最后两个元素 # output:['Curry', "O'Neal"] print(L[:-2]) # 删去最后两个元素 # output:['Harden', 'Durant', 'Jordan'] print(L[-3:-1]) # 从索引-3开始,取出两个元素 # output:['Jordan', 'Curry'] print(L[-4:-1:2]) # 从索引-4开始,每两个取一个,到索引-1前结束 # output:['Durant', 'Curry']
イテレーション
ための文字列、リスト、タプル、辞書サイクルを通過します。同等の行き来反復を。
あなたはすべてC言語やJava言語を知って学んだ場合は、反復インデックスによって行われます。次のコードを見てください。
for (i=0; i<list.length; i++) { n = list[i]; }
Pythonは経由で
for...in...
完了します。次のコードを見てください。for i in range(1, 100): if i % 7 == 0: print(i)
明らかに、Pythonの繰り返しではなく、インデックスの要素よりも、素子自体を除去します。
あなたが繰り返しの時にインデックスを取得したい場合は、できる
enumerate()
機能を得られます。L = ["Harden", "Durant", "Jordan", "Curry", "O'Neal"] for index, name in enumerate(L): print(index, "--", name) # output: 0 -- Harden 1 -- Durant 2 -- Jordan 3 -- Curry 4 -- O'Neal
enumerate()
基本的にLに入れ機能[(0, "Harden"), (1, "Durant"), (2, "Jordan"), (3, "Curry"), (4, "O'Neal")]
各要素はタプルの等価になります。また行くことにインデックスを介してアクセスすることができます。
注意:それは簡単でシンプルですので、これは書き込みのみの概念を理解するために使用され、上記の方法は、推奨されます。
for i in enumerate(L): index = i[0] name = i[1] print(index, "--", name)
言っ以前のリスト、タプルは、今やかなり特別なことである辞書
注意:辞書のPythonの3.6バージョンが順序付けられていない前に、この環境が発注されているのPython 3.6.5です。
デフォルトでは、辞書トラバーサルコンテンツが鍵
d = {"PF":"Jordan", "SF":"Durant", "C":"O'Neal", "SG":"Harden", "PG":"Curry"} for key in d: print(key) # output: PF SF C SG PG
あなたが値を通過する必要がある場合は、それを使用します
d.values()
。for value in d.values():
キー、値はの使用に、トラバースする必要がある場合
d.items()
for k, v in d.items()
それが決定された場合、オブジェクトはその反復可能なのですか?で必要とされる
collections
モジュールは、Iterable
タイプを決定します。実は、私は、共通の利益を覚えて、必要がないと思います。ので、少しではライン上の道を見つけることができます。
from collections import Iterable print(isinstance("a", Iterable)) # 字符串是 print(isinstance([a, b, c], Iterable)) # 列表是 print(isinstance(123, Iterable)) # 整数不是
式のリスト
これは、コードリストの単一行を達成することであり、このリストは柔軟性があります。
リストを生成
私たちは最も愚かな方法のリストを生成する前に、例えば、1を自分で作成することです。
使用する少しでも良い
list(range(1, 11))
し、次いで10 1〜10の数字を生成します。またはわずかに少し変化させ
list(range(1, 10, 2))
、その後、奇数1-10を生成します。あなたには、いくつかの操作を追加したい場合は循環を支援するために必要となる場合があります。しかし、サイクルはあまりにも面倒です。
その後、我々はPythonのこの問題を解決するためのユニークな式のリストだけでなく、コードの行を使用することができます。
例えば、生成する[1×1,2×2,3×3、...、10×10】
[x * x for x in range(1, 11)]
例えば、生成する[1×2,3×4,5×6,7×8、...、99×100]
[x * (x + 1) for x in range(1, 100, 2)]
条件フィルタ
名前が示すように、式が内部リストに追加することができるということである
if
声明。例えば、小文字ですべての文字列のリスト、文字列以外のフィルタエレメント
L = [35, "Durant", "Jordan", "Curry", "O'Neal"] print([name.lower() for name in L if isinstance(name, str)])
多層式
積層サイクルは、101121232222、例えば、3桁の対称性を検索します。
[x*100+y*10+z for x in range(1,10) for y in range(10) for z in range(10) if x == z]
ジェネレータ
式のリストを言及し、リストも容量が制限されることを理解しています。あまりにも多くのストレージスペースを占有。
リストの要素は、アルゴリズムアウトで計算することができるならば、あなたは多くのスペースを節約することができ、そしてこのメカニズムは、発電機です。
ジェネレータを作成し、最も簡単な方法は、使用することです
()
表すために。例えばg = (x * x for x in range(10)) print(g) # output:<generator object <genexpr> at 0x00000239CCD59C50> # 可以看到这是一个生成器,怎么去获取呢?使用next()函数,一个一个打印出来。 print(next(g)) # output:0 print(next(g)) # output:1 # 需要注意的是:生成器保存的是算法。 # 上面的next()方法是有点傻的,如果没有元素了,还会调用异常。所以一般都是用for循环去遍历的。 for n in g: print(n, end=",") # output:0,1,4,9,16,25,36,49,64,81,
以前、発電機がであることを特徴とするアルゴリズムを保存するアルゴリズムの複雑さ、リスト生成型の場合、
for
サイクルを達成することができない、あなたが使用することができます達成するための機能を。フィボナッチ数では、最初の2つの数字を加算した数値の何れかにより第一及び第二の数に加えてルールです。
1,1,2,3,5,8,13,21,34,55、...
明らかに、式リストに書き込み、しかし、機能を容易に実現することができます。
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'over' print(fib(6)) # output: 1 1 2 3 5 8 over
上述したように、この
fib
機能は、全体的なロジック・ジェネレータに沿って、アルゴリズムのルールを実装します。しかし、彼は常に機能しています。私たちは、必要な歩留まりキーワードをファンクション・ジェネレータに、。これは、発電機を作成する別の方法です。
実装プロセス:最初の反復は、に実行されます
yield b
から、その後、bの値を返し、戻り値は最初の反復として、2回目は、機能を実行するために行くしませんが、yield b
次のステートメントが続きます、それが再び出会うまではyield
。などなど。def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'over' print(fib(6)) # <generator object fib at 0x000001494CE09A40> for n in fib(6): print(n)
要約:発電機を使用することができる
[]
、またはyield
、イテレート可能オブジェクトの添加(発電機)イテレータ
話す発電機の前で、私たちは持っている
next()
機能を。イテレータは、その過去によって定義されます。それは次の()関数呼び出しであり、そして次の目標値を連続的に呼ばれるイテレータを返すことができます。
反復時間の前で言えば、我々はあなたがオブジェクトがオブジェクトを待っているかどうかを確認したい場合は、そこにある、について話しました
isinstance()
関数は。イテレータデータ型名は次のとおりです。
Iterator
、反復子は、データストリームに相当します。from collections import Iterator print(isinstance((x for x in range(10)), Iterator)) # 生成器是 print(isinstance([1,2,3], Iterator)) # 列表不是 print(isinstance({"a":1, "b":2}, Iterator)) # 字典不是 print(isinstance('abc', Iterator)) # 字符串不是
一部の学生は、リスト、辞書、文字列はイテラブル、なぜイテレータは、頼むかもしれません。
イテレータがの表現であるので、これはあるデータ・ストリーム。それが可能なため、
next()
機能を呼び出して、次のデータを返すように続けています。それはを通じて、対象となり、反復イテレータことができる
iter()
機能。L = [1,2,3,4,5] a = iter(L) print(next(a)) # output:1 print(next(a)) # output:2 print(next(a)) # output:3
概要: 2つの基本的な方法イテレータ
iter()
、next()
。