投稿

Pythonのprint関数でendを指定した場合のループ処理で、sleep関数と合わせるとまとめて出力されてしまう件について

イメージ
Pythonでプログラミングしてこの動画のような出力になるようにしたのですが、そのときにややprint関数の動作が分からなかった点についてまとめておきます。 上の動画で何をしているのかというと、大雑把に言うと与えた文字列から1文字ずつ端末画面に出力するという処理をしています。基本の処理自体は単純で、1つの変数に全ての文章を収めて、それをループ処理で1文字ずつ出力しています。そして文章を流れるように出力するために、1文字出力するごとにコンマ数秒置くという処理をしています(timeモジュールのsleep関数を利用)。 さて、問題はそこのループ処理とコンマ数秒の処理待ちの部分。 まず、print関数で1文字出力すると改行も一緒にされてしまうので、改行を出力させないよう print(t1[i], end="") とendというオプションを与えています。 改行と一緒に出力する際は問題なかったのですが、endオプションを付けるとなぜか1文字ずつ出力がされず、しばらく待つと一度に全ての文字列が一緒に出力されてしまいました。 おそらくprint関数の出力がどこかしらにバッファされて、ループが終了したときに一度に吐き出されているようです。 で、あれこれ調べてみたのですが、print関数でその都度出力させるにはflushオプションを使えばいいということが分かりました。 簡単に書くと以下のようになります。 print(t1[i], end="", flush=True) こうすることで、想定通りの出力が出来るようになりました。めでたしめでたし。 Amazon Python関連書籍など

gnuplotのヘルプ機能の使い方

gnuplotにはいろんな機能があるのですが、コマンドライン操作が主体であるためどんな機能や設定があるのかを把握するにはドキュメントなどを頻繁に調べる必要があります。 (GUIがあるソフトのようなマウスでメニューから機能を選んで探すみたいなことが出来ないため) 調べるにはドキュメントを見て探すのもいいのですが、gnuplotのヘルプ機能を使えば項目を探す手間を減らすことが出来ます。 ヘルプ機能の使い方 ヘルプ機能は、インタラクティブモードに入っているときに help と入力して実行すると表示されます。この場合、gnuplotの使い方の概略などが出てきます。ここから各項目のヘルプを見るにはもう少し操作が必要です。 各項目を調べるには help 項目名 とすればいいのですが、まずどんな項目名があるのか把握しておく必要があります。 その場合は help ? と実行すると項目名(トピック)の一覧が表示されます。その一覧からどの項目を見たいのか決めたら help plot のように項目名を付けて実行します。 サブトピックの調べ方 また項目によってはさらに下位の項目(サブトピック)が存在します。例えばplotコマンドのfor機能を調べる場合は以下のようにします。 help plot for サブトピックにどんなものがあるのかはトピックの説明に書かれているのでそこから選びましょう。 さて、サブトピックを見る方法としてはこの他に、トピックを読んでいる状態からサブトピックに入って読む方法もあります。 まずトピックを読んでいると画面の一番下に 「Press return for more: 」 と表示されています。リターンキーを押すと次のページに移ります。 そしてサブトピックがある項目では最後のページになると画面の一番下の表記が 「Subtopic of plot: 」 のように変化します。この状態で調べたいサブトピックの項目名を入力することでそのヘルプを見ることが出来ます。 最後に Webで検索しても役立つ情報はたくさん出てくるのですが、大元の情報はやはり公式のドキュメントやヘルプになります。どういった調べ方がベストなのかはその人次第なので一概にこうすればいいというものでもないですが、やはり公式の情...

gnuplotで標準入力からコマンドを受け取りプロットする

イメージ
以前のブログ記事 gnuplotでコマンドラインから日本語入力したい場合の対処方法 で「-e」オプションを用いることで、gnuplotのコマンドラインに入らずにグラフをプロットする方法を解説しました。 (gnuplotのコマンドラインのことはインタラクティブモードと言うようです。またコマンドラインに入らずに実行することはバッチモードと言うようです。以降、用語としてインタラクティブモード、バッチモードを使っていくことにします) 標準入力から受け取る方法 gnuplotのバッチモードでは「-e」オプションの他に、標準入力からコマンド文を受け取ってプロットする方法があります。これはgnuplot以外のコマンドでもよく用いられている方法で、コマンドラインオプションに「-」を用います。 例 簡単な実行例は以下のようになります。 echo "plot x" | gnuplot -p - echoで「plot x」という文を生成、それをパイプを用いて標準入力としてgnuplot側に渡しています。 (gnuplotの-pオプションは以前のブログで説明しましたが「-persist」オプションのことです) 複数行の命令文を渡す場合は以下のようになります。 echo "set sample 500; set yrange [-1.5:1.5]; plot sin(x*3)" | gnuplot -p - 今回はechoで命令文を生成して渡しましたが、当然他のコマンドからでも渡すことが出来ます。「-e」オプションを用いる場合との違いはそれで、標準入力から受け取れることを利用すればシェルスクリプトと組み合わせるなど汎用的な使い方が出来るかと思います。 その他、gnuplot関連のブログ記事 Amazon データ解析関連書籍など

gnuplotで関数プロットの形がおかしい場合 : samplesの値の設定について

イメージ
gnuplotで関数をプロットしたとき、「そうはならないはずでは?」みたいなプロットになるときがあります。この場合の原因は そうなるはずと考えていたこと自体が単なる勘違いだった plotコマンドの書き間違い  plotの設定が不適切だった などに分かれるでしょう。1.と2.はよくあることなのでここでは考えないことにします。 3.についてもいろいろ状況によるのですが、今回は最も基礎的なsamplesの値の設定について解説していきます。 (追記 : 当初「sample」で説明していましたが、ドキュメントでは「samples」となっていたので表記をそちらに合わせました。なおコマンドからの設定ではsampleでもsamplesでもどちらも同じように使えるようです) 想定とは違うプロットになる例 まず plot sin(x) をプロットしてみます。これは特に問題はありません。 次に plot sin(x*5) をプロットしてみます。何やらカクカクしたプロットになってしまい、グラフ自体も単なるsin関数ではそうはならない形になってしまっています。 もっと分かりやすく plot sin(x*10) をプロットしてみると明らかにおかしいグラフになってしまうことが分かります。 samplesの値を適切に設定する こうなってしまう原因は、初期状態で設定されているsamplesの値が関数によってはプロットするには適切ではなくなるためです。 「samplesの値」とはなんぞや?というと、これはプロット時のサンプリングレートのことで、この値が大きければ大きいほどより詳細に関数をプロットすることが出来ます。 (ただ値を大きくすればいいというものではなく、あまりこの値を大きくするとプロット処理にかかる時間が長くなります) 通常は初期状態で設定されているsamplesの値で大丈夫なのですが、場合によっては値を変更して対応する必要が出てきます。 samplesの値の確認 まずいま現在のsamplesの値を確認するには show samples とします。すると以下のように出力されると思います。 sampling rate is 100, 100 ここではsamplesの値は100になっていま...

bashでのコマンドライン引数の扱いについて : その1 ワイルドカード(*)の場合

イメージ
前回、bashでのコマンドライン引数を調べるサンプルプログラムを作ってみたので、さっそくこれを使って実際の扱いを調べてみることにしました。 前回のブログ記事↓ コマンドライン引数の扱いがよく分からなかったので調べるためにサンプルプログラムを作成 ワイルドカード(*)について まずコマンドラインでよく使うワイルドカード(*)がどう引数として渡されるのかを調べてみます。 状況 : ディレクトリ内にあるファイルは以下の6つ。 ここでサンプルプログラム(argvtest01.py)を実行 $ python3 argvtest01.py * すると以下のように出力されます。 argv1 = argvtest01.py argv2 = file01.txt argv3 = file02.txt argv4 = file03.txt argv5 = file04.txt argv6 = file05.txt ディレクトリ内にあるファイルのファイル名がそれぞれ別の引数に渡されています。 次にエスケープ文字を前に置いた場合 $ python3 argvtest01.py \* argv1 = * 引数に*(アスタリスク)が文字として渡されています。 シングルクォートで囲んだ場合 $ python3 argvtest01.py '*' argv1 = * これも引数に*が渡されています。 ダブルクォートではどうなるか $ python3 argvtest01.py "*" argv1 = * これも*が渡されています。 ドットを前に置いた場合 $ python3 argvtest01.py .* argv1 = . argv2 = .. となりました。隠しファイルを作っておいた場合はそのファイル名も渡されます。 今回は特に変わったことはしていないので、ほぼ想定通りの結果でした。 ワイルドカードを使う場合、シェルで展開させたい場合とコマンドにワイルドカードを渡してコマンド側で展開などに使いたい場合があるかと思います。そういった場合にどう書けばよいかはこれでだいたい分かるかなと。 また、ダブルクォートで囲んだ場合に展開されるのかどうかがたまに思い出せないこ...

空模様(2018年10月21日〜27日)を映したタイムラプス動画

イメージ
2018年10月21日〜10月27日の空模様を映したタイムラプス動画をYoutubeにアップロードしています。 天気としては全体的に晴れが多かったです アップロードした動画は一週間分まとめたものになっています。 以下、Youtube動画内の各日付へのリンクと天気など情報になります。 10月21日 日曜日 おおむね晴れ 10月22日 月曜日 おおむね晴れ マーシャル諸島付近で台風26号発生 10月23日 火曜日 晴れ時々曇り 10月24日 水曜日 晴れ時々曇り 10月25日 木曜日 曇りのち晴れ 10月26日 金曜日 おおむね晴れ 10月27日 土曜日 曇り時々晴れ

コマンドライン引数の扱いがよく分からなかったので調べるためにサンプルプログラムを作成

コマンドラインからコマンドに引数を渡す際の挙動で、分かり難い状況🤔があったのでそれを調べるためにPythonでサンプルプログラムを作成してみました。 コマンドライン引数の扱いは、通常なら単にスペースで区切られているだけなので特に調べる必要はないんですけどね。ただ、ワイルドカードなどシェル補完がある場合の扱いがどうなるのかはちゃんと調べておきたいところ。それとシングルクォート、ダブルクォートを複数組み合わせて使うような場合とか。 作ったサンプルプログラムは以下に示した通り。 import sys l = len(sys.argv) for i in range(l) : if i == 0: continue print("argv{0} = {1}".format(i, sys.argv[i])) 以上をtest01.pyとして保存して次のようにコマンドライン引数をいくつか渡して実行  $ python3 test01.py test1 test2 test3 すると以下のように1つずつコマンドライン引数が分離されて出力されます。 argv1 = test1 argv2 = test2 argv3 = test3 argv[0]にはスクリプトファイル名が入ってるだけで引数を調べる上では必要ないため、サンプルプログラムではそれは出力されないようにしています とりあえずこれを元にいろいろ調べてみようかなと思います😉 Amazon プログラミング関連書籍など

スポンサーリンク