新しいアカウントで始めました。

身の回りの出来事や写真が中心です。

Pythonリスト内包記法をいじってみてました

2022-05-27 15:51:55 | Python

 2の累乗を求めるリスト内包記法ですが、ジェネレーターを使うときは、止める部分を用意しないと、終了できなくなるようです。遅延評価を理解できてないのですが、すべての計算をしようとする無限ループになるので、一旦中止して処理が終わったら、次の数に行くようには出来ないんですかね。

 Visual Studio 2022でpythonを組み込んでましたが、printに漢字をいれるとエラーになりました。python3だとそんなことはないのでしょうが、どうしてですかね?

これで暫く悩んでました。(涙)


コメント (4)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Visual Basicに高階関数ある... | トップ | F#イジってみました。其の一 »
最新の画像もっと見る

4 コメント

コメント日が  古い順  |   新しい順
リスト内包表記 (cametan_42)
2022-05-27 17:42:30
例えば、

def gen2bekijyo(n):
 i = 0
 while True:
  if i == n:
   break
   yield 2 ** i
   i += 1

として、

>>> [i for i in gen2bekijo(10)]
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

でいいでしょう。

また、べき乗そのものを書くなら

>>> [2**i for i in range(10)]
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
>>>

で充分でしょうね。

> これで暫く悩んでました。(涙)

なんだろ。
Linuxじゃあ問題がないんですが・・・・・・。
VS Codeが扱ってる文字コード、あるいは端末が扱ってる文字コードがUTF-8になってないのかなぁ。
返信する
cametan_42さん、コメント有難うございます (isam)
2022-05-28 23:05:42
 ジェネレーターにlimiterを含めればいいだけでした。リスト内包記法ですが、[]でなく()で括って、nextで取り出す方法もあるらしいです。まとめて取り出すことが出来ないようで、ここで無限ループに入ってしまいました。
 でもコメントのようにすれば、解決ですね。
返信する
あ〜。 (cametan_42)
2022-05-31 01:57:22
> リスト内包記法ですが、[]でなく()で括って、nextで取り出す方法もあるらしいです。

ジェネレータ式でしょう?

6.2.8. ジェネレータ式:
https://docs.python.org/ja/3/reference/expressions.html?highlight=%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF#generator-expressions
返信する
cametan_42さん、コメント有難うございます (isam)
2022-05-31 07:06:12
 リスト内包記法の()で括る方法ですが、nextで一個一個取り出すようですが、多少リストで返す方法と違うようです。
 多分ですが、リストで返す方はデータの全てを取り込むようです。()で返す方は個数がわからないので、最後はエラーが起きるので、エラー処理が必要だと思います。
 Visual Studio 2019のPythonのprintで漢字コードを入れるとエラーになったんですが、VSCodeで入力し直したら、解消しました。
返信する

Python」カテゴリの最新記事