VSCodeは使ったことはありませんが、問題はそこではないと思います。
9行目にブレークポイントを置けば止まってくれるのですがそうしてなかった場合に勝手にループを実行されないようにしたいです
「勝手に」というと、「プログラムの動作とは別にデバッガが違う動作をして」ループを実行している、と解釈されていると思いますが、それは間違いです。
デバッガは、基本的にプログラムの通りに動かなければなりませんし、もし違う動作をするのであればデバッガの不具合です。
まぁデバッガも人が作ったものですから、バグがないとは言いませんが、今回の場合は完全に「プログラムがそのように動いているから、デバッガもその通りに動いている」のです。
試しに、fortest
の中を以下のようにしてみて、実行してみてください。
python
1def fortest():
2 for i in range(0, 5):
3 print('a:', i)
4 yield i
実行結果は、以下のようになるはずです。
a: 0
0
a: 1
1
a: 2
2
a: 3
3
a: 4
4
この結果を見ても、fortest
の中のyield
文とtest
の中のfor
文の中の処理が交互に実行されているのが解ると思います。
なぜこのような動きになるか、ですが、以下のfor文
python
1for i in fortest():
2 print(i)
この部分を、for
文を使わずに書き直してみると、以下のようになります。
python
1it = iter(fortest())
2while True:
3 try:
4 i = next(it)
5 except StopIteration:
6 break
7 print(i)
一番勘違いしやすい点は、fortest()
です。
通常の関数であれば。これで関数の中の処理が実行されますが、関数ではなくジェネレータの場合には中の処理は実行されず、単にジェネレータオブジェクトと呼ばれるものを返すだけになります。
次に、next
関数が呼ばれると、ようやくジェネレータの中の処理が始まり、yield
文まで実行され、yield
文で指定した値がnext
関数の戻り値として返されます。
そして、次にnext
関数が実行されると、ジェネレータの中の以前のyield
文で中断された箇所から、また次のyield
文まで実行されます。
最後に、ジェネレータの中の処理が終わると、StopIteration
例外が投げられます。
このように、for文がジェネレータの中の処理とfor文の中の処理を並列に処理しているわけなので、デバッガが勝手にfor文の中の処理を実行しているわけではないのです。
長々と書きましたが、ここまで理解した上で「挙動を変えたい」というのであれば、それもありでしょう。
あくまでバグを取るのが目的であり、そのための手段であれば何も問題ありません。
ただ、冒頭で言ったとおり自分はVSCodeは使っていないので、その辺りの助言はできませんが、ただあまりなさそうだな、と思いますし、一時的に下記のように書き直したほうが早いかもしれません。
python
1for i in list(fortest()):
2 print(i)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。