【エンジニアの道は果てしない】今さら聞けない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環境の構築
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}')
結果:
文字列
文字列(テキスト)は、’文字列’(シングルクォーテーション)又は”文字列”(ダブルクォーテーション)で囲みます。’+’演算子で文字の連結もできます。
text0 = 'Hello'
text1 = 'Python!!'
text0_1 = text0 + text1
print(f'{text0}, {text1}, {text0_1}')
結果:
型変換
補足:
型変換の関数は、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}')
結果:
数値から文字列
# num1, 2:数値
num1 = 3
num2 = 4.0
# 文字列に変換
str0 = str(num1)
# 文字列に変換
str1 = str(num2)
print(f'{type(str0)}:{str0}, {type(str1)}:{str1}')
結果:
文字列から数値
# 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}')
結果:
ちなみに、存在しない数値(文字列)を変換した場合はエラーになります。
文字列から数値(エラーの例)
# num1:文字列
num1 = 'A'
# float型に変換
num_float = float(num1)
print(f'{type(num_float)}:{num_float}')
結果:
条件分岐
例: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}')
辞書
補足:
* 辞書の生成は、辞書名={} 又は 辞書名=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}')
結果:
繰返し
補足:
* 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}')
結果:
補足:
* 辞書名.items()は、辞書のキーと値を順番に取り出せます
for キー, 値 in 辞書
例:辞書のデータ取り出し
dict_operator = {'add':'+', 'sub':'-', 'mul':'*', 'div':'/'}
for key, val in dict_operator.items():
print(f'key:{key}, val:{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!!')
関数
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コードは私が全て書いた訳ではなく、ベースはBingのChatAIに作ってもらった後に加筆修正しました(サンプルなので異常処理は未対応)。
何もないゼロから作るよりは、少しでもベースがあった方が時短できて、自分で書くハードルも下がります。。。
最後に
単にコードを書くだけであれば、今はChatAIで作ってもらうこともできますが、それを理解できる知識と最低限文法は分かってないと、出力されたものが正しいのか判断できないと思います。
その意味では、AIでプログラムを作れるようになっても、ある程度の経験の積み上げや自己学習は継続して必要と個人的には考えています。
これからプログラムやPythonを学びたい方に、今回の記事が何かしら参考になれば幸いです。
最後まで読んで頂き、ありがとうございました。
--
Kindle Unlimited 会員の方は無料で読めます。
この記事が気に入ったらサポートをしてみませんか?