今回時間のズレを修正するために、IF文を用いました。
なのでif文の説明をした後に実装部分を説明したいと思います。
if文とは
if文はプログラムの中で条件分岐を書きたいときに使う文です。
条件分岐は以下のような場合に、はいかいいえで表すことができます。
- この数字は5ですか? はい/いいえ
- この数字はマイナスはですか? はい/いいえ
つまりif文は、与えられた条件が、
- True(ここでいうはい)であるか
- False(ここでいういいえ)であるか
はいといいえは、プログラムではTrue(1)、False(0)と表します。
if文を使った条件分岐は、プログラミングそのものの基本的な考え方の一つになります。
3つのパターン
実際にif文の使い方は以下の3つのパターンがあります。
- if文の基本
- if else
- if elif
if文の基本
if文の基本的な構文は以下のようになります。
if [条件式]:
[条件式がTrueのときに行う処理]
これが基本的な形です。if文はTrueかFalseの値を持つ条件式と一緒に書きます。この条件式がTrueのときにif文の中に書かれた処理を実行します。
例として計算の結果が0以上であるかを条件式として使う。
x = 5
if x * 2 >= 0:
print("+です")
実行結果
+です
条件式は論理演算子や比較演算子で計算されて、TrueかFalseを返す。
比較演算子の基本は以下の表にまとめます。
記号 | 比較 | 意味 |
---|---|---|
== | x == y | xとyは等しい |
!= | x != y | xとyは等しくない |
> | x > y | xはyより大きい |
>= | x >= y | xはy以上 |
< | x < y | xはyより小さい |
<= | x <= y | xはy以下 |
if else
先程のコードは、条件式がTrueになるときのみの処理でした。
Trueのときだけでなく、条件式がFalseになったときに動く処理も書くことができます。
Falseのときの処理を書くには、elseを使います。elseを使った基本は以下です。
if [条件式]:
[条件式がTrueのときに行う処理]
else:
[条件式がFalseのときに行う処理]
elseは条件式を持ちません。elseの上のif文がFalseになったときだけ、実行してくれます。
例として以下を見てみます。
x = -3
if x * 2 >= 0:
print("+です")
else:
print("-です")
実行結果
-です
実行結果ではif文の条件式がFalseなので、elseの「-です」と出ていますね。
そしてif文のprintは実行されず、elseのみが実行されていることがわかります。
if elif
別の条件に当てはまったらelseとは別の処理がしたいときにelifを使います。
例として以下を見てみます
if [条件式1]:
[条件式がTrueのときに行う処理]
elif [条件式2]:
[elifの条件式2がTrueのときに行う処理]
else:
[if文の条件式1もelifの条件式2もどちらもFalseのときに行う処理]
使い方はif文のときとほぼ変わらず、条件式を持ちます。
例として以下を見てみます
x = 200
if x == 100:
print('x = 100')
elif x == 200:
print('x = 200')
elif x > 0:
print('x = 300')
elif x == 0:
print('x = 400')
else:
print('条件を満たしていません')
実行結果:
x = 200
xの値は200なので、ここでは「x == 200」の条件式に一致して処理を実行しています。
elifはif文とelseに挟まれるように書きます。
自動購入Botへの実装
if文を使ってやりたいこと
時間のズレは遅れたり進んだりします。
遅れた場合にはこうする。進んでる場合はこうする。という動作を行いたい。
遅れた場合+進んだ場合-になると仮定します。
(前回の記事でそのようにズレの値を出したため)
プラスマイナスの判別は以下のコードで
if t4 >= 0:
また遅れた場合に行いたいこと(処理を早くする)
- ズレの小数点の切り上げ
- 切り上げた値分早く動作
- 切り上げられた分sleepで待機
小数点の切り上げはmath.ceil()でできます。(import mathを忘れずに)
(また切り捨てはmath.floor()でできます。)
また進んでる場合に行いたいこと(処理を遅くする)
- ズレの分sleepで待機
完成のコード
前回の記事のズレの検出のコードと併せて以下になります。
import requests
from bs4 import BeautifulSoup
import time
import math
r = requests.get('https://ntp-a1.nict.go.jp/cgi-bin/jst')
soup = BeautifulSoup(r.text,'lxml')
t1 = soup.find("body").string
t2 = t1.rstrip('\n')
t3 = time.time()
t4 = float(t2)-t3
print(t2,t3,t4)
if t4 >= 0:
t5 = 0
t6 = math.ceil(t4)
t7 = t6 - t4
else:
t5 = -t4
t6 = 0
t7 = 0
これで出したtをそれぞれの役割の場所に配置したら終わりです。
無料でPythonが学ぶオススメ講座
techgym(テックジム)というプログラミングスクールが初心者向けに週4で無料講座を開いてくれています。
プログラミングの勉強法などから教えてくれます。
直接的に自動購入Botのことやスクレイピングについては学べませんが、
Pythonの基礎が学べるので第一歩としておすすめします。
また、参加後には講座についていけなかったり復習したい方向けに解説動画ももらえます。
Python勉強してみたいなーと思っている方は一度参加してみてはいかがでしょうか?
テックジムのサイトはこちら
以下の記事で詳しく書いてみたのでよかったら覗いてみてください。
【無料】ゼロからPython学習したいなら「テックジム」がおすすめ!
Pythonを勉強して間のないプログラミングド素人です
習い事の予約自動化で時刻修正で悩んでいました
こんなやり方があるんですね、参考になりました ありがとうございます!
早速使ってみたかったのですが下記の文章の意味が分からず適用できておりません
「これで出したtをそれぞれの役割の場所に配置したら終わりです。」
もしよろしければ具体的にどのようにコードを書けばいいかご教示いただけないでしょうか
コメントありがとうございます。
参考になったとのコメントとてもうれしいです。
https://kacchanblog.com/programming/python-bot-comp
こちらの記事のコードのところを参考にしてみてください。
また、t7 = t4 – t6となっていましたが、t7 = t6 – t4が正解でした。(いま修正しました。)
早速のご教示ありがとうございます
コードの書き方がキレイで非常に分かりやすく勉強になります
なるほど、timedeltaとtime.sleepで差を吸収させるイメージなんでしょうか??
ところで、遅れた時の 3.切り上げられた分sleepで待機 というのはなぜ必要なのでしょうか?
単純に標準時よりPCの時刻が
早ければsleepで待機、
遅ければtimedeltaを使って前倒しで処理、
でできそうな気がするのですが・・・
schedule.every().day.at(“09:00:00”).do(reserve)といった形で記述しており、timedeltaをどうやって組み込もうか検討中です
理由としてはミリ秒単位での調整をしているからです。
秒単位までならすけのまつさんの言った通りでいいですが、ミリ秒だと.at(“09:00:00”)この中に入れれないからです。
timedeltaをどうやって組み込もうか検討中です
>>毎日となるとこのやり方だとできないですね。
自分は前にscheduleの中にscheduleを入れたいときがあったのですがうまくいかなかったですね。
1つ思いついたのは、08:50:00とかで指定して、指定した時間との差を出して単純にSleepさせてあげるかですかね。
さすがに10分のズレはできないと思いますので。
なるほどですね
いただいたアドバイスを元にコード組んでみます
改めて調べてみるとOSの時間ってズレまくっていますね
OSの時間はすぐズレちゃいますね。
https://www.vector.co.jp/soft/win95/personal/se050672.html
こういうのもあるので活用してみてください。
ありがとうございます
タイムラグを吸収するコードを実装するのは夏休みの宿題にします
まずはお手軽に桜時計かtimesynchroのタスクスケジュール化でお茶を濁しておきます
私のhpのノートはタスクスケジューラの挙動が若干怪しいのですが笑