2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

クリスマスまでにPythonを使ってDiscordのBOTを作るAdvent Calendar 2022

Day 5

【5日目】試しにPythonで遊んでみよう【PythonでDiscordBOTを作ろう!】

Last updated at Posted at 2022-12-04

試しにPythonで遊んでみよう

初めてのものを手に入れたら、やっぱり遊びたくなりますよね。
というわけで、色々なものをすっ飛ばしながら遊んでいきます。

...しかし凄い適当な説明!
出来る限り分かりやすくしたいと思ったのですが、私にはこれが限界のようです!

Pythonの実行方法

Pythonの実行方法は2種類あります。
インタラクティブモードスクリプトモードです。

インタラクティブモードは対話モードと呼ばれ、1行ずつコードを実行するモードです。
ちょっとPythonでわからないことがあって、試したいときとかによく使います。
対話モードはpythonと実行するだけで始まります。

$ python
Python 3.10.0 (default, Dec 11 2021, 16:18:22) [GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import sys
>>> if __name__ == "__main__":
...     print("This is interactive mode")
...
This is interactive mode
>>>

こんな感じで、1行ずつコードを実行していきます。

スクリプトモードは、実際にコードを書いてそれを実行するモードです。
基本的にこっちを使います。
python [ファイル名]という風に実行することが出来ます。

僕が優しく理解らせてあげるからね...?

今後のプログラミングでは非同期処理というものを多用します。
非同期処理というのは、プログラミングにおいてかなり難しい分野ですが、意外と何とか理解できるかもしれないので頑張ってみましょう。

import os
import sys

print("Hello world!")

これを実行してみてください。

Hello world!

こんな感じに表示されると思います。

printという関数は、画面に文字を表示する関数です。
特に何も問題がないですよね。

では、次です。

import time

print("Hello")
time.sleep(3)
print("World!")

time.sleepというのは、指定した時間待機する関数です。
Pythonデフォルトのtimeというモジュールの中にあります。

モジュールとimportについては省略させていただきます。
こちらをご参照ください。

これを実行すると...

Hello
World!

と、Helloを表示した後に3秒経ってからWorld!と表示されたと思います。

つづいては関数です。

import time

def hogehoge():
    print("hoge?")
    time.sleep(3)
    print("hoge!")

hogehoge()

hogehogeという関数を作って、そのあとで呼び出しています。

hoge?
hoge!

ほげほげしてたら成功です。
こんな風にdef 関数名():という感じにやれば関数を作ることが出来ます。

では早速非同期処理です。

import asyncio

async def main():
    print("Ohayou")
    await asyncio.sleep(3)
    print("Gozaimasu!")

asyncio.run(main())

defの左にasyncとつけることで、その関数をコルーチン関数にすることが出来ます。
はて...コルーチン関数?となったでしょうが、コルーチン関数とは、おおざっぱに言うと非同期関数のことです。
中に非同期処理を入れることが出来たり、外で非同期処理として実行することが出来ます。

そして、このコルーチン関数は普通にmain()とやっても実行できません。
(C#とかとは違うんです!)
await main()と、先にawaitとつけることで実行できます。
じゃあ、await main()と書けばいいじゃんと思いますが、awaitは関数内でしか使えません。
なので、代わりにasyncio.run(main())とすることで、実行できます。
...難しいことは私も分かりません。

Ohayou
Gozaimasu!

OhayouとGozaimasu!の間に3秒時間が空いてれば成功です。

import asyncio

async def main1():
    print("main1 start")
    await asyncio.sleep(3)
    print("main1 end")

async def main2():
    print("main2 start")
    await asyncio.sleep(3)
    print("main2 end")

async def main():
    asyncio.ensure_future(main1())
    asyncio.ensure_future(main2())
    await asyncio.sleep(5)

asyncio.run(main())

さて、こういう風にしてみましょう。
asyncio.run(main())によってmain関数が実行されます。
mainの中ではasyncio.ensure_future(main1())asyncio.ensure_future(main2())がありますね。
このensure_futureという関数は、コルーチン関数を実行するという点ではasyncio.runに近いですが、投げっぱなしとなります。
普通は、関数を実行したらその関数が終わるまで待ち、その次の関数を実行して...となりますが、投げっぱなしとは、実行したら終了を待たずに次の関数を実行するというような感じです。
なので、この関数を実行すると、main1が実行された後にそれの終了を待たずにmain2が実行されます。

main1 start
main2 start
main1 end
main2 end

こんな感じに実行されると思います。

「じゃあ、同時に関数を実行してるんだ! すげぇ!」となった方。
実をいうとそれは間違いなんです。

Pythonの非同期処理というのは、おおざっぱに言うと「待ち時間を利用した同時処理(風)」だと思ってます。

待ち時間とはIO時間やネットワークの待ち時間。
上のやつで言うと、
まずprint("main1 start")を実行します。
そして次にasyncio.sleep(3)と、3秒待機の待ち時間が発生します。
すると、別の関数に実行の権限が渡されて、print("main2 start")が実行されます。
そして、asyncio.sleep(3)が実行され、また待ち時間が発生します。
すると別の関数に実行が渡されます。そしてprint("main1 end")が実行されます。そしてprint("main2 end")が実行されます。

...

は?

いやまぁ、私も書いてて何言ってるかわかんないです。
とりあえずこのシリーズでわかっておいて欲しいことは、「コルーチン関数内では出来る限り非同期処理を実行する」ということです。
そうすることで、他の関数にちゃんと実行権限が渡されて、関数ちゃんがみんな喜びます。

分からないことがあったら「Python 分からない」とかでググってください。
多分分かります。

...

いや、プログラミングって難しいんですよ...
ほんと...自分で理解してても、人に解説するのって本当に難しくて...

とりあえず、習うより慣れよです。
実際にコードを書きながら説明していきます。

なので、あきらめないでください...ほんと...クリスマスまで僕と一緒にいてください...

というわけで、今日の記事はここまでです。
もしよろしければ記事へのいいねをして、次回記事をお楽しみに!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?