2019年10月17日木曜日

開発環境

のリンク先の Python 3.8 の概要 (その1) - Assignment expression
これまで、データの編集と判定を同時に行うような処理は、リスト内包ではすっきりと書けませんでした。
でのコードの例について、少なくともこの例のみに関しては、リスト内包表記ですっきりと書けるのではないかと思って書いてみた。

コード

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 コメント:

コメントを投稿