Python3:空白で区切られた文字列を元にforeachループする
個人的にはかなり使用頻度の高いループ文なので、シェルスクリプトとPython3.7.9と対比させながら進めます。FreeBSDの用語を使用している可能性がありますが、自分用なので特に書き換えは考えていません。なお、foreach文とは書いていますが、シェルスクリプトでもpythonでもforeachと書かないみたいです。ですが一般的にはこちらのほうが通りが良いためあえてforeach文と書きます。
■前提
変数countryには"america brazil china"の文字列が入っています。
これをameria、brazil、chinaの文字列に分割しつつ、ループ文で表示できればこの記事の目標は達成。
■モデル(シェルスクリプト)
01: $ cat country.sh
01: $ cat country.sh
02: #!/bin/sh
03:
04: country_string="america brazil china"
05:
06: for args in `echo ${country_string} | tr ' ' '\n'`
07: do
08: echo ${args}
09: done
10: $ sh country.sh
03:
04: country_string="america brazil china"
05:
06: for args in `echo ${country_string} | tr ' ' '\n'`
07: do
08: echo ${args}
09: done
10: $ sh country.sh
11: america
12: brazil
13: china
シェルスクリプトは環境変数IFS値によってデリミタが異なります。通常では改行(\n)やタブなどが含まれているのでそれをデリミタに使用できる他、IFS値を再設定することにより変更することができます。しかしながら、環境変数のデフォルト値はできるだけ変更しないほうが良いと思われる他、trコマンドにより半角空白をそのままUNIXの改行コード(\n)に変更してしまう手が使えるので、echoコマンドでcountry_string値を出力しパイプでつなぎ、直接入力を半角空白から改行へ書き換えることで、IFS値で分離できる形に変えています。なお、"`"はバッククォートで、その中でシェルコマンドを実行する事ができます。バッククォートで囲まれたコマンドは、その実行結果に置き換えすることができます。
for args in 〜は、環境変数IFS値を元にスプリットした文字を変数argsに代入します。これはdo〜doneの間で使用することができます。今回の場合echo ${args}となっており、単純に出力するだけですが、これがecho "country: ${args}"とすると、1回めのループでは"country: america"と出力されるはずです。
■書き換え(Python3)
01: $ cat country.py
02: country_string="america brazil china"
03:
04: for args in country_string.split(" "):
05: print( args )
06: $ python3.7 country.py
07: america
08: brazil
09: china
Python3でもforeach文の記法は変わりませんが配列の代わりに文字列をそのまま配列に変換するテクニックが必要になりますので、文字列.split(デリミタ)というようなsplit関数が必須となります。行数としてはこちらのほうが短いので使う分にはシェルスクリプトよりは楽かもしれません。
シェルスクリプトは環境変数IFS値によってデリミタが異なります。通常では改行(\n)やタブなどが含まれているのでそれをデリミタに使用できる他、IFS値を再設定することにより変更することができます。しかしながら、環境変数のデフォルト値はできるだけ変更しないほうが良いと思われる他、trコマンドにより半角空白をそのままUNIXの改行コード(\n)に変更してしまう手が使えるので、echoコマンドでcountry_string値を出力しパイプでつなぎ、直接入力を半角空白から改行へ書き換えることで、IFS値で分離できる形に変えています。なお、"`"はバッククォートで、その中でシェルコマンドを実行する事ができます。バッククォートで囲まれたコマンドは、その実行結果に置き換えすることができます。
for args in 〜は、環境変数IFS値を元にスプリットした文字を変数argsに代入します。これはdo〜doneの間で使用することができます。今回の場合echo ${args}となっており、単純に出力するだけですが、これがecho "country: ${args}"とすると、1回めのループでは"country: america"と出力されるはずです。
■書き換え(Python3)
01: $ cat country.py
02: country_string="america brazil china"
03:
04: for args in country_string.split(" "):
05: print( args )
06: $ python3.7 country.py
07: america
08: brazil
09: china
Python3でもforeach文の記法は変わりませんが配列の代わりに文字列をそのまま配列に変換するテクニックが必要になりますので、文字列.split(デリミタ)というようなsplit関数が必須となります。行数としてはこちらのほうが短いので使う分にはシェルスクリプトよりは楽かもしれません。
この記事は以上です。
必要に応じて追記見込みです。
コメント
コメントを投稿