見出し画像

【エンジニアの道は果てしない】今さら聞けないPythonの基礎のキソ(これからプログラムを学びたい方向け)

こんにちは。すうちです。

初めてPythonでプログラムを書き始めて数年経ちますが、現在の業務においても初期検証はPythonで簡単に作って評価することが多いです。

Pythonは豊富に情報がありますが、今回はこれからプログラムを学びたい方向けに、私が最初Pythonで知りたかったことに厳選して書きたいと思います。

ーーー
※タイトル画像:ごるちきさん



はじめに

Pythonとは

PythonはWeb開発やデータ分析など、さまざまな分野に適用可能な汎用性の高い言語です。

実際に使われているアプリ(ソフトウェア)の例として、有名な所ではInstagram, YouTube, Pinterest などがあります。

近年人工知能 (AI)をはじめとした先端技術の開発でも使われていて、人気の高いプログラミング言語の1つです。


Pythonの特徴

Pythonのメリットは、シンプルな文法で初心者にも理解しやすく、かつ短いコードでやりたいことが書けることだと思います。また、様々な機能を簡単に実現できる豊富なライブラリも魅力的です。

よく言われるPythonのデメリットは、インタプリタ型であるため処理が遅いことが挙げられますが、速度が重要なアプリケーションではC言語など他の言語と組み合わせたり、Pyhonの上位互換であるCythonなどの選択肢もあります。

目的次第ですが、C/C++の様な高速処理は期待できないにしても要所で高速化の手法はいくつかあります。

本格的な開発や製品適用では問題になる可能性もありますが、プログラムの学習や評価で使う分には個人的に十分ではないかと思います。

余談ですが、最近の話題で(実際の性能は未知数!?ながら)Pythonの特徴とC言語の性能をあわせ持った新しいプログラミング言語Mojoも開発中のようです。


豊富なライブラリ

私は組込み開発が中心なので、比較対象が過去経験したC/C++、C#やJavaになりますが、同じことをやる場合にPythonの方が気軽に短い時間で書けて作業に取り組む心理的なハードルが低いです(最近使う頻度が多いので慣れている説もあり…)。

また冒頭で書いたように、皆が使いたい基本的な機能はライブラリに大体あるので、それらを使ってコードを書くことができます。

また、それらの使い方もサンプルが多く、直感的に分かりやすいものが多い気がします。

Pythonで使われるライブラリの例


Python環境の構築

Anaconda環境

初めてPython環境を構築する際は、Anacondaをインストールする方が大半かもしれません(私も最初そうでした)。

ただ、Anacondaは商用利用が有償だったり、最初にPythonを動かすには便利な反面、最低限の環境を作りたい場合はpipのインストールで事足りる場合も多いです。

pip環境

以下は、Pythonの実行環境をpipで作りたい方向けです。


最初に学びたいPythonの基礎

ここからは、Pythonでプログラムを書く際に、最初に知っておきたい文法と用語について記載します。

変数(数値と文字列)

数値や文字列を保存する’箱’(名前)
左辺(英数字)に右辺(数値や文字列)を=で指定

以下のように英数字で、数値や文字列を指定します。

補足:
* '文字列'の前にfを付けると{変数}の値をprint文で表示できます

数値

num1 = 4.0 
num2 = 2.0

result0 = num1 + num2
result1 = num1 - num2
result2 = num1 * num2
result3 = num1 / num2

print(f'{result0}, {result1}, {result2}, {result3}')

結果:

6.0, 2.0, 8.0, 2.0


文字列
文字列(テキスト)は、文字列’(シングルクォーテーション)又は文字列”(ダブルクォーテーション)で囲みます。’+’演算子で文字の連結もできます。

text0 = 'Hello'
text1 = 'Python!!'

text0_1 = text0 + text1

print(f'{text0}, {text1}, {text0_1}')

結果:

Hello, Python!!, HelloPython!!


型変換

数値や文字列を別の型に変換

補足:
型変換の関数は、int(), float(), str()などがあります。

数値から数値
例:float型、int型

num = 3.14

# float型に変換
num_float = float(num)
# int型に変換
num_int = int(num)

print(f'{type(num_float)}:{num_float}, {type(num_int)}:{num_int}')

結果:

<class 'float'>:3.14, <class 'int'>:3


数値から文字列

# num1, 2:数値
num1 = 3
num2 = 4.0

# 文字列に変換
str0 = str(num1)
# 文字列に変換
str1 = str(num2)

print(f'{type(str0)}:{str0}, {type(str1)}:{str1}')

結果:

<class 'str'>:3, <class 'str'>:4.0


文字列から数値

# num1, 2:文字列
num1 = '10' 
num2 = '20'

# float型に変換
num_float = float(num1)
# int型に変換
num_int = int(num2)

print(f'{type(num_float)}:{num_float}, {type(num_int)}:{num_int}')

結果:

<class 'float'>:10.0, <class 'int'>:20


ちなみに、存在しない数値(文字列)を変換した場合はエラーになります。

文字列から数値(エラーの例)

# num1:文字列
num1 = 'A' 
# float型に変換
num_float = float(num1)

print(f'{type(num_float)}:{num_float}')

結果:

num_float = float(num1)
ValueError: could not convert string to float: 'A'


条件分岐

条件により処理を分ける方法
if(最初の条件)、elif(別の条件)、else(それ以外)で記述

例:operator変数(条件)により処理分岐

    if operator == "+":
        result = num1 + num2
    elif operator == "-":
        result = num1 - num2
    elif operator == "*":
        result = num1 * num2
    elif operator == "/":
        result = num1 / num2
    else:
        print("無効な演算子です")


リスト

関連する変数(数値や文字列)を纏めて管理
リストの参照は、インデックス番号(数字)

補足:
* リストの生成は、リスト名=[] 又は リスト名=list() で可能
* リスト名=[初期値, …] で生成と初期化も可能 

list_num  = ['0','1','2','3','4','5','6','7','8','9']

v0 = list_num[0]   # index:0 -> '0'
v1 = list_num[1]   # index:1 -> '1'
v2 = list_num[-2]  # index:8 -> '8'
v3 = list_num[-1]  # index:9 -> '9'

print(f'{type(v0)}:{v0}, {type(v1)}:{v1}, {type(v2)}:{v2}, {type(v3)}:{v3}')

<class 'str'>:0, <class 'str'>:1, <class 'str'>:8, <class 'str'>:9


辞書

関連する変数を纏めて管理
辞書の参照は、キー(文字列)

補足:
* 辞書の生成は、辞書名={} 又は 辞書名=dict() で可能
* 辞書名={初期値, …}で生成と初期化も可能 

dict_operator = {'add':'+', 'sub':'-', 'mul':'*', 'div':'/'}

v0 = dict_operator['add'] # key:'add' -> '+'
v1 = dict_operator['div'] # key:'div' -> '/'

print(f'{type(v0)}:{v0}, {type(v1)}:{v1}')

結果:

<class 'str'>:+, <class 'str'>:/


繰返し

for:規定回数の繰り返し処理
例:データ取り出し

while:条件成立中の繰り返し処理
例:四則演算のループ

補足:
enumerate()は、リストのindexと値を同時に取り出せます

for index, 値 in enumerate(リスト)
例:リストのデータ取り出し

list_num = ['0','1','2','3','4','5','6','7','8','9']
for idx, val in enumerate(list_num):
    print(f'idx:{idx}, val:{val}')

結果:

idx:0, val:0
idx:1, val:1
idx:2, val:2
idx:3, val:3
idx:4, val:4
idx:5, val:5
idx:6, val:6
idx:7, val:7
idx:8, val:8
idx:9, val:9


補足:
辞書名.items()は、辞書のキーと値を順番に取り出せます

for キー, 値  in 辞書
例:辞書のデータ取り出し

dict_operator = {'add':'+', 'sub':'-', 'mul':'*', 'div':'/'}
for key, val in dict_operator.items():
    print(f'key:{key}, val:{val}')

結果:

key:add, val:+
key:sub, val:-
key:mul, val:*
key:div, val:/

while
例:計算結果が100になるまで繰り返し

# 四則演算
print('Start!!')

print('計算結果が100になるようにしてください')
answer = 0
while(answer != 100):
    num1 = float(input("Input 1st number: "))
    operator = input("Input operator (+, -, *, /): ")
    num2 = float(input("Input 2nd number: "))

    if operator == "+":
        result = num1 + num2
    elif operator == "-":
        result = num1 - num2
    elif operator == "*":
        result = num1 * num2
    elif operator == "/":
        result = num1 / num2
    else:
        print("無効な演算子です")
        result = 0

    print(f"{num1} {operator} {num2} = {result:.10f}")
    
    answer = int(result)

print('正解です!!')
print('End!!')


関数

一連の処理を他から呼べる様に纏めたもの
(関数の単位は、1つの目的に絞るのが良いとされる)

def 関数名 (引数1, 引数2, …):
で定義します。

例:前述の四則演算を関数定義

def calculator():
    num1 = float(input("Input 1st number: "))
    operator = input("Input operator (+, -, *, /): ")
    num2 = float(input("Input 2nd number: "))

    if operator == "+":
        result = num1 + num2
    elif operator == "-":
        result = num1 - num2
    elif operator == "*":
        result = num1 * num2
    elif operator == "/":
        result = num1 / num2
    else:
        print("無効な演算子です")
        result = 0

    print(f"{num1} {operator} {num2} = {result:.10f}")
    
    return int(result)

関数の呼び出し(実行)

def main():
    print('Start!!')
    print('計算結果が100になるようにしてください')
    answer = 0
    while(answer != 100):
        # 関数呼び出し
        answer = calculator()
        
    print('正解です!!')
    print('End!!')

if __name__ == '__main__':
    main()


クラス

一連の処理を役割や機能単位で纏めたもの
(オブジェクト指向の概念を実現する定義)

class クラス名 ():
 def __init__ (self, 引数1, 引数2…):

 def メソッド名 (self, 引数1, 引数2…):
で定義します。

補足:
* クラスメソッドの引数selfは必須です。クラスの全ての情報が保存されます。
* __init__はコンストラクタと呼ばれ、クラス生成時に必ず実行されます。
* 変数は self.変数名、クラスメソッド(関数)は、self.メソッド名で指定します。
* passは、何も処理がない時に書きます。

クラス定義
例:Viewerクラス

class Viewer():
    
    def __init__(self, root):       
        # 変数の初期化
        self.result = 0.0
    
    def __calculate(self):
        # __calculateの処理
        pass

    def __click(self, text):
        # __clickの処理
        pass

    def __clear(self):
        # __clearの処理
        pass


少しだけ応用編(簡易電卓)

ここまでで「結局Pythonで何が作れるのか?」イメージがわかない方もいると思います。

以下、前述の基礎を組み合わせたサンプルです。

例:簡易電卓プログラム
補足:GUIはTkinter(ライブラリ)を使用

import tkinter as tk
   

class Viewer():
    
    def __init__(self, root):
        
        list_num        = ['0','1','2','3','4','5','6','7','8','9']
        dict_operator   = {'add':'+', 'sub':'-', 'mul':'*', 'div':'/'}
        dict_button     = {}
        btn_size = 7
        
        # タイトル設定
        root.title("簡易電卓")
        
        # Widget生成
        # entry
        self.entry = tk.Entry(root, width=30)
        
        # button: 0~9
        for key_num in list_num:
            dict_button[key_num]        = tk.Button(root, text=key_num,  width=btn_size, command=self.__click(key_num))
        
        # button: +,-,*./
        for key_operator, val_text in dict_operator.items():
            dict_button[key_operator]   = tk.Button(root, text=val_text, width=btn_size, command=self.__click(val_text))
        
        # button: =,C
        dict_button['eql'] = tk.Button(root, text="=", width=btn_size, command=self.__calculate)
        dict_button['clr'] = tk.Button(root, text="C", width=btn_size, command=self.__clear)
                    
        # Layout設定
        # entry
        self.entry.grid(row=0, column=0, columnspan=4)
        
        # button
        dict_button['1'].grid(row=1,column=0)
        dict_button['2'].grid(row=1,column=1)
        dict_button['3'].grid(row=1,column=2)
        dict_button['4'].grid(row=2,column=0)
        dict_button['5'].grid(row=2,column=1)
        dict_button['6'].grid(row=2,column=2)
        dict_button['7'].grid(row=3,column=0)
        dict_button['8'].grid(row=3,column=1)
        dict_button['9'].grid(row=3,column=2)
        dict_button['0'].grid(row=4,column=0)       
        dict_button['add'].grid(row=1,column=3)
        dict_button['sub'].grid(row=2,column=3)
        dict_button['mul'].grid(row=3,column=3)
        dict_button['div'].grid(row=4,column=3)
        dict_button['eql'].grid(row=5,column=3)
        dict_button['clr'].grid(row=5,column=0)
        
        # 初期化
        self.result = 0.0

    
    def __calculate(self):
        try:
            self.result = eval(self.entry.get())
            self.entry.delete(0, tk.END)
            self.entry.insert(tk.END, str(self.result))
        except:
            self.entry.delete(0, tk.END)
            self.entry.insert(tk.END, '')
   

    def __click(self, text):
        def __click_sub():
            current = self.entry.get()
            self.entry.delete(0, tk.END)
            self.entry.insert(tk.END, current + text)
            
        return __click_sub

    def __clear(self):
        self.entry.delete(0, tk.END)
        self.result = 0.0
        

def main():
    # Tkinter root 生成
    root = tk.Tk()
    # Viewerクラス生成
    Viewr(root)
    # Tkinterループ処理
    root.mainloop()

if __name__ == '__main__':
    main()

実行結果

Python 簡易電卓

ちなみに、今回のPythonコードは私が全て書いた訳ではなく、ベースはBingのChatAIに作ってもらった後に加筆修正しました(サンプルなので異常処理は未対応)。

何もないゼロから作るよりは、少しでもベースがあった方が時短できて、自分で書くハードルも下がります。。。


最後に

単にコードを書くだけであれば、今はChatAIで作ってもらうこともできますが、それを理解できる知識と最低限文法は分かってないと、出力されたものが正しいのか判断できないと思います。

その意味では、AIでプログラムを作れるようになっても、ある程度の経験の積み上げや自己学習は継続して必要と個人的には考えています。

これからプログラムやPythonを学びたい方に、今回の記事が何かしら参考になれば幸いです。

最後まで読んで頂き、ありがとうございました。


--

Kindle Unlimited 会員の方は無料で読めます。



この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?