Pythonプログラミング練習

最新記事は以下に作成しました。
[BeautifulSoupライブラリの使い方](https://hana-shin.hatenablog.com/entry/2023/09/20/211912)
[osモジュール,os.pathモジュールの使い方](https://hana-shin.hatenablog.com/entry/2023/08/26/200155)
[Anacondaのインストール方法](https://hana-shin.hatenablog.com/entry/2022/02/12/203642)


#1 はじめに
Pythonプログラミング練習用に記事を作成しました。


#2 環境
VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンの版数は以下のとりです。

```console:CentOSの版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
```

```console:カーネル版数
[root@server ~]# uname -r
4.18.0-240.el8.x86_64
```

```console:pythonの版数
[root@server ~]# python3 -V
Python 3.6.8
```

#3 Hello world!
文字列を表示してみます。
なお、`#`はコメント行を表します。

```console:ソースコード
[root@server ~]# cat tp.py
#This line is a comment line.
print("Hello world!")
```

```console:実行結果
[root@server ~]# python3 tp.py
Hello world!
```


#4 変数
変数はアンダーバーを含む英数字からなる名前で表します。
最初の1文字はアンダーバーまたは英字でなくてはなりません。

```console:ソースコード
[root@server ~]# cat tp.py
x1=111
print(x1)
_x=222
print(_x)
1x=333
print(1x)
```

数字で始まる`1x`は変数として使用できないことがわかります。

```console:実行結果
[root@server ~]# python3 tp.py
  File "tp.py", line 5
    1x=333
     ^
SyntaxError: invalid syntax
```


#5 コマンドライン引数の取得方法
##5.1 各引数を求める方法

```console:ソースコード
[root@server ~]# cat tp.py
import sys
print (sys.argv[0])
print (sys.argv[1])
print (sys.argv[2])
```

```console:実行結果
[root@server ~]# python3 tp.py 11 22
tp.py
11
22
```


##5.2 個数を求める方法

```console:ソースコード
[root@server ~]# cat tp.py
import sys
argv = sys.argv
argc = len(argv)
print(argc)
```

```console:実行結果
[root@server ~]# python3 tp.py
1
[root@server ~]# python3 tp.py aa
2
[root@server ~]# python3 tp.py aa bb
3
```

#6 リスト、タプル、セット、辞書の使い方
##6.1 リスト
リストは、`[...]`で表します。
他のプログラミング言語における「配列」に相当します。
任意の型（整数、浮動小数点数、文字列など）のデータを格納できます。


```console:ソースコード
[root@server ~]# cat tp.py
fruits=['apple','lemon','peach']
print(fruits[0])
fruits[0]='grape'
print(fruits[0])
print(fruits[1:3])
print(fruits[2:])
```

```console:実行結果
[root@server ~]# python3 tp.py
apple
grape
['lemon', 'peach']
['peach']
```


##6.2 タプル
タプルは、`(...)`で表します。
リストは要素の追加、削除が可能ですが、タプルは参照しかできません。

```console:ソースコード
[root@server ~]# cat tp.py
fruits=('apple','lemon','peach')
print(fruits[0])
fruits[0]='peach'
```

タプルの場合、要素を書き換えようとすると、エラーが発生します。

```console:実行結果
[root@server ~]# python3 tp.py
apple
Traceback (most recent call last):
  File "tp.py", line 3, in <module>
    fruits[0]='peach'
TypeError: 'tuple' object does not support item assignment
```

##6.3 セット
セットは、順序と重複のないデータ構造です。
セットには要素の追加、削除はできますが、重複する要素は扱うことができません。

まず、`set()`を使って要素を何も持たな空のオブジェクトを作成します。
その後、`apple`,`lemon`,`apple`と要素を追加してみます。

```console:ソースコード
[root@server ~]# cat tp.py
s=set()
s.add('apple')
print(s)
s.add('lemon')
print(s)
s.add('apple')
print(s)
```

`apple`を2回追加しましたが、オブジェクトには`apple`が1つしか存在しません。

```console:実行結果
[root@server ~]# python3 tp.py
{'apple'}
{'apple', 'lemon'}
{'apple', 'lemon'}
```



##6.4 辞書
辞書は、`{...}`で表します。
辞書はキーとバリューの組で構成されます。
ここでは、果物と値段を辞書として登録してみます。

```console:ソースコード
[root@server ~]# cat tp.py
d = { 'apple':100, 'lemon':200 }
print(d['apple'])
print(d['lemon'])
print('--- 要素からキーとバリューを取り出す ---')
for k,v in d.items():
  print(k, v)
print('--- 要素からキーを取り出す ---')
for k in d.keys():
  print(k)
print('--- 要素からバリューを取り出す ---')
for v in d.values():
  print(v)
```

```console:実行結果
[root@server ~]# python3 tp.py
100
200
--- 要素からキーとバリューを取り出す ---
apple 100
lemon 200
--- 要素からキーを取り出す ---
apple
lemon
--- 要素からバリューを取り出す ---
100
200
```

#7 制御文
##7.1 if, else, elif文

```console:ソースコード
[root@server ~]# cat tp.py
import sys
a=int(sys.argv[1])

if a > 10:
  print('big')
elif a >= 5 and a <= 10:
  print('medium')
else:
  print('small')
```

```console:実行結果
[root@server ~]# python3 tp.py 100
big
```

```console:実行結果
[root@server ~]# python3 tp.py 5
medium
```

```console:実行結果
[root@server ~]# python3 tp.py 0
small
```


##7.2 for文

###7.2.1 基本のループ処理

```console:ソースコード(その1)
[root@server ~]# cat tp.py
for i in 1,10,100:
  print(i)
```

```console:実行結果
[root@server ~]# python3 tp.py
1
10
100
```


```console:ソースコード(その2)
[root@server ~]# cat tp.py
for c in 'abc':
  print(c)
```

```console:実行結果
[root@server ~]# python3 tp.py
a
b
c
```

###7.2.2 rangeを使ったループ処理

```console:ソースコード
[root@server ~]# cat tp.py
for i in range(3):
  print(i)
```

```console:実行結果
[root@server ~]# python3 tp.py
0
1
2
```

###7.2.3 リストを処理するループ処理

```console:ソースコード
[root@server ~]# cat tp.py
fruits=['apple','lemon','peach']
for name in fruits:
  print(name)
```

```console:実行結果
[root@server ~]# python3 tp.py
apple
lemon
peach
```


###7.2.4 break文を使ったループ処理
break は最も内側のwhile,forのループ処理を抜けるときに使います。

```console:ソースコード
[root@server ~]# cat tp.py
for i in range(10):
  if i >= 2:
    break
  print(i)
```

```console:実行結果
[root@server ~]# python3 tp.py
0
1
```


###7.2.5 continue文を使ったループ処理
continueは最も内側のwhile,forのループ処理を繰り返すときに使います。

```console:ソースコード
[root@server ~]# cat tp.py
for i in range(3):
  if i == 1:
    continue
  print(i)
```

```console:実行結果
[root@server ~]# python3 tp.py
0
2
```



##7.3 while文
事前にループが何回繰り返されるの分からない時にwhileを使います。

```console:ソースコード
[root@server ~]# cat tp.py
fruits = ['apple','lemon','peach']
len = len(fruits)
i=0
while i < len:
  print(str(i) + ':' + fruits[i])
  i += 1
```

```console:実行結果
[root@server ~]# python3 tp.py
0:apple
1:lemon
2:peach
```


#8 Python標準ライブラリの使い方


##8.1 組み込み関数の使い方
Pythonが提供する組み込み関数の使い方を説明します。関数一覧は以下を参照ください。
https://docs.python.org/ja/3.6/library/functions.html

###8.1.1 データの並べ替え(sorted)

```console:ソースコード
[root@server ~]# cat tp.py
x = [4, 9, 1, 3, 0]
print(x)
y = sorted(x)
print(y)
y = sorted(x,reverse=True)
print(y)
```

```console:実行結果
[root@server ~]# python3 tp.py
[4, 9, 1, 3, 0]
[0, 1, 3, 4, 9]
[9, 4, 3, 1, 0]
```

###8.1.2 最大、最小値の求め方(min,max)

```console:ソースコード
[root@server ~]# cat tp.py
x = [4, 9, 1, 3, 0]
min=min(x)
print(min)
max=max(x)
print(max)
```

```console:実行結果
[root@server ~]# python3 tp.py
0
9
```

###8.1.3 オブジェクトの長さを求める方法(len)

```console:ソースコード
[root@server ~]# cat tp.py
x=len('abcde')
print(x)
x=len(['apple','lemon','peach'])
print(x)
```

```console:実行結果
[root@server ~]# python3 tp.py
5
3
```

##8.2 モジュールの使い方
Python標準ライブラリには、組み込み関数以外に多くのモジュールが登録されています。
詳細は、以下のページを参照ください。
https://docs.python.org/ja/3.6/library/


###8.2.1 datetimeモジュールの使い方

```console:ソースコード
[root@server ~]# cat tp.py
import datetime

now = datetime.datetime.now()
print(now)
```

```console:実行結果
[root@server ~]# python3 tp.py
2021-04-03 20:43:34.993347
```


###8.2.2 timeモジュールの使い方
指定した時間、プロセスをスリープしてみます。

```console:ソースコード
[root@server ~]# cat tp.py
import time

time.sleep(3)
```

スクリプトを実行します。3秒間スリープしていることがわかります。

```console:実行結果
[root@server ~]# date; python3 tp.py; date
2021年  4月  3日 土曜日 20:57:18 JST
2021年  4月  3日 土曜日 20:57:21 JST
```


###8.2.3 subprocessモジュールの使い方
Pythonの中から外部のコマンドを実行する場合、subprocessというモジュールを使います。

```console:ソースコード
[root@server ~]# cat tp.py
import subprocess
dir = input("Please input dir name:")
p = subprocess.run(args=["ls","-l", dir], stdout=subprocess.PIPE)
print(p.stdout.decode('utf-8'))
print("retcode:", p.returncode)
```

```console:実行結果
[root@server ~]# python3 tp.py
Please input dir name:/usr/local/bin
合計 39712
-rwxr-xr-x. 1 root root 10763104  3月 18 22:10 cmake
-snip-
```



#9 自作関数の使い方
##9.1 基本的な使い方
`my_print`という名前の関数を作成します。`my_print`は文字列を出力するだけの関数です。
そのあと、`my_print`を呼び出します。

```console:ソースコード
[root@server ~]# cat tp.py
def my_print():
  print('Hello World')
my_print()
```

```console:実行結果
[root@server ~]# python3 tp.py
Hello World
```

##9.2 引数、戻り値の使い方

```console:ソースコード
[root@server ~]# cat tp.py
def my_add(x, y):
  sum = x + y
  return sum

x = my_add(1,5)
print(x)
```

```console:実行結果
[root@server ~]# python3 tp.py
6
```

##9.3 戻り値として文字列を返す方法

```console:ソースコード
[root@server ~]# cat tp.py
def my_print():
  return 'abcde'

str=my_print()
print(str)
```

```console:実行結果
[root@server ~]# python3 tp.py
abcde
```

#10 ファイルを読み込む方法(import)


##10.1 同じディレクトリのファイルを読み込む方法
tp.pyからcommon.pyを読み込んでみます。

```console:ソースコード(読み込む側)
[root@server ~]# cat tp.py
import common

common.my_print()
```

```console:ソースコード(読み込まれる側)
[root@server ~]# cat common.py
def my_print():
  print('Hello World')
```

```console:実行結果
[root@server ~]# python3 tp.py
Hello World
```


##10.2 別ディレクトリのファイルを読み込む方法
testディレクトリの下に同じ階層のsrc,incディレクトリがあります。

```console:ディレクトリ構成
test ---+--- src
        |     tp.py
        |
        |
        +--- inc
              common.py
```


```console:ソースコード(読み込む側)
[root@server src]# cat tp.py
import sys
sys.path.append('../inc')
import common

common.my_print()
```

```console:ソースコード(読み込まれる側)
[root@server inc]# cat common.py
def my_print():
  print('Hello World')
```


```console:実行結果
[root@server src]# python3 tp.py
Hello World
```

#11 テキストファイルの読み書き方法
ファイルには、テキストファイルとバイナリファイルがあります。
ここでは、テキストファイルに対する読み書きを説明します。


##11.1 読み出す方法(r)

```console:ソースコード
[root@server ~]# cat tp.py
f=open('test.txt','r')
text=f.read()
print(text)
f.close()
```

```console:pythonが読み込むファイル
[root@server ~]# cat test.txt
12345
abcde
```

```console:実行結果
[root@server ~]# python3 tp.py
12345
abcde
```


##11.2 書き込む方法(w)


```console:ソースコード
[root@server ~]# cat tp.py
f=open('test.txt','a')
f.write('aaa\n')
f.close()
```

```console:実行結果
[root@server ~]# python3 tp.py
[root@server ~]# cat test.txt
aaa
[root@server ~]# python3 tp.py
[root@server ~]# cat test.txt
aaa
```

##11.3 追記する方法(a)


```console:ソースコード
[root@server ~]# cat tp.py
f=open('test.txt','a')
f.write('aaa\n')
f.close()
```

```console:実行結果
[root@server ~]# python3 tp.py
[root@server ~]# cat test.txt
aaa
[root@server ~]# python3 tp.py
[root@server ~]# cat test.txt
aaa
aaa
```


#12 外部ライブラリの使い方
外部ライブラリは、[ここ](https://pypi.org/)よりインストールする。


#14 デバッグ方法
次のソースコードをデバッグしてみます。

```console:デバッグ対象のソースコード
[root@server ~]# cat tp.py
for i in range(10):
  if i >= 2:
    break
  print(i)
```

デバッガは、次のようにして起動します。

```console:デバッガの起動方法
[root@server ~]# python3 -m pdb tp.py
> /root/tp.py(1)<module>()
-> for i in range(10):
(Pdb)
```

`l`コマンドを使って、現在実行中の行を表示してみます。
現在は1行目を実行していることがわかります。

```console:実行中の行番号表示
[root@server ~]# python3 -m pdb tp.py
> /root/tp.py(1)<module>()
-> for i in range(10):
(Pdb) l
  1  -> for i in range(10):
  2       if i >= 2:
  3         break
  4       print(i)
[EOF]
```

次に`n`コマンドで1行実行してみます。
そのあと、`l`コマンドで現在実行中の行を表示してみます。
1行進んで、2行目を実行していることがわかります。

```console:ステップ実行
(Pdb) n
> /root/tp.py(2)<module>()
-> if i >= 2:
(Pdb) l
  1     for i in range(10):
  2  ->   if i >= 2:
  3         break
  4       print(i)
[EOF]
```

次に、`pp`コマンドを使って変数`i`の値を確認してみます。
変数`i`の値が`0`であることがわかります。

```console:変数の値の確認
(Pdb) pp i
0
```

`b`コマンドで3行目にブレークポイントを設定してみます。

```console:ブレークポイント設定
(Pdb) b 3
Breakpoint 1 at /root/tp.py:3
```

ブレークポイント一覧を確認してみます。
`b`コマンドを実行すると、さきほど設定したブレークポイントが
表示されることがわかります。

```console:ブレークポイント一覧
(Pdb) b
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /root/tp.py:3
```

`c`コマンドを実行して、ブレークポイントまで一気に処理を進めてみます。
`0`,`1`と表示され、breakで停止していることがわかります。

```console:ブレークポイントまで処理を進める
(Pdb) c
0
1
> /root/tp.py(3)<module>()
-> break
```

`l`コマンドを実行して状況を確認してみます。
ブレークポイントで停止していることがわかります。

```console:ブレークポイントで停止
(Pdb) l
  1     for i in range(10):
  2       if i >= 2:
  3 B->     break
  4       print(i)
[EOF]
```

設定したブレークポイントを削除します。
`cl`コマンドにはブレークポイント番号(`num`)を指定します。

```console:ブレークポイントの削除
(Pdb) cl 1
Deleted breakpoint 1 at /root/tp.py:3
```

ブレークポイントを確認します。
ブレークポイントが削除されたことがわかります。

```console:ブレークポイントの確認
(Pdb) b
(Pdb)
```

プログラムを再度デバッグするには`restart`コマンドを実行します。

```console:プログラムの再実行
(Pdb) restart
Restarting tp.py with arguments:
        tp.py
> /root/tp.py(1)<module>()
-> for i in range(10):
```

`q`コマンドを実行して、デバッガを終了します。６

```console:デバッガの終了
(Pdb) q
[root@server ~]#
```


なお、`h`コマンドを実行すると、コマンド一覧が表示されます。

```console:コマンド一覧の表示方法
(Pdb) h

Documented commands (type help <topic>):
========================================
EOF    c          d        h         list      q        rv       undisplay
a      cl         debug    help      ll        quit     s        unt
alias  clear      disable  ignore    longlist  r        source   until
args   commands   display  interact  n         restart  step     up
b      condition  down     j         next      return   tbreak   w
break  cont       enable   jump      p         retval   u        whatis
bt     continue   exit     l         pp        run      unalias  where

Miscellaneous help topics:
==========================
exec  pdb
```


#Z 参考情報
[Python チュートリアル](https://docs.python.org/ja/3/tutorial/index.html)
[とほほのPython入門](http://www.tohoho-web.com/python/)
[たった1日で基本が身に付く! Python超入門 ](https://www.amazon.co.jp/%E3%81%9F%E3%81%A3%E3%81%9F1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E4%BB%98%E3%81%8F-Python%E8%B6%85%E5%85%A5%E9%96%80-%E4%BC%8A%E8%97%A4-%E8%A3%95%E4%B8%80/dp/4774191124/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2WJTPRCKA6THB&dchild=1&keywords=1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F+python&qid=1617192369&sprefix=1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%2Caps%2C262&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFBTFlKTERZUzhIQkEmZW5jcnlwdGVkSWQ9QTAwMjg3NTlQM1NLUjRIOEw2WFcmZW5jcnlwdGVkQWRJZD1BM0ZMR1AwUk9TMlRBViZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=)
[Python別ファイルを読み込む方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/23279)
[［Python入門］リストの基本](https://www.atmarkit.co.jp/ait/articles/1905/31/news015.html)
[処理を一時停止！Pythonでsleepを使う方法【初心者向け】](https://techacademy.jp/magazine/15822)
[［Pythonチートシート］文字列／リスト／タプル／辞書／集合の操作編](https://www.atmarkit.co.jp/ait/articles/2001/21/news012.html#defiter)
[Pythonでモジュールを作成する方法](https://maku77.github.io/python/env/create-module.html)