開発環境
- macOS Catalina - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Python 3.7 (プログラミング言語)
のリンク先の Python 3.8 の概要 (その1) - Assignment expressionのhttps://t.co/QXIuybPhgq
— kento (@denjiry) October 17, 2019
この記事によるとそうみたいです
(同様にresult = [text.strip() for text in data if text.strip()]
がresult = [t for text in data if (t:=text.strip())]
と書けるなどうれしい例がいくつかあるみたいです。)
これまで、データの編集と判定を同時に行うような処理は、リスト内包ではすっきりと書けませんでした。でのコードの例について、少なくともこの例のみに関しては、リスト内包表記ですっきりと書けるのではないかと思って書いてみた。
コード
Python 3
#! /usr/bin/env python3
# dataはこのコード自身
with open('sample.py') as f:
data = f.readlines()
# result = [text.strip() for text in data if text.strip()]
result = [text.strip() for text in data if not text.isspace()]
print('編集前')
for i, line in enumerate(data, 1):
print(f'{i}: {repr(line)}')
print('編集後')
for i, line in enumerate(result, 1):
print(f'{i}: {repr(line)}')
入出力結果(Zsh、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))
% ./sample.py
編集前
1: '#! /usr/bin/env python3\n'
2: '\n'
3: '# dataはこのコード自身\n'
4: '\n'
5: "with open('sample.py') as f:\n"
6: ' data = f.readlines()\n'
7: '\n'
8: '# result = [text.strip() for text in data if text.strip()]\n'
9: 'result = [text.strip() for text in data if not text.isspace()]\n'
10: '\n'
11: "print('編集前')\n"
12: 'for i, line in enumerate(data, 1):\n'
13: " print(f'{i}: {repr(line)}')\n"
14: '\n'
15: "print('編集後')\n"
16: 'for i, line in enumerate(result, 1):\n'
17: " print(f'{i}: {repr(line)}')\n"
編集後
1: '#! /usr/bin/env python3'
2: '# dataはこのコード自身'
3: "with open('sample.py') as f:"
4: 'data = f.readlines()'
5: '# result = [text.strip() for text in data if text.strip()]'
6: 'result = [text.strip() for text in data if not text.isspace()]'
7: "print('編集前')"
8: 'for i, line in enumerate(data, 1):'
9: "print(f'{i}: {repr(line)}')"
10: "print('編集後')"
11: 'for i, line in enumerate(result, 1):'
12: "print(f'{i}: {repr(line)}')"
%
ただ、stripを2回呼び出す代わりに、stripを1回、文字列のisspaceメソッドを1回で合計2回メソッドを呼び出してるから、あまり変わらないかも。 また、この例以外にデータの編集と判定を同時に行いたいような時もあるだろうし。
開発環境がPython 3.7なのは、MacPortsにまだPython 3.8がきてなかったから。ということで、codehexさんの例のコードと挙動が同じかどうかの確認はしてないです。
0 コメント:
コメントを投稿