Python

Python3の簡単チュートリアル

この記事は、簡潔にPythonを学習してもらうためのチュートリアルとなっています。

言語固有ではない箇所は解説しないので、プログラミング初心者の方には分かり辛い内容となっているかもしれませんが、関連記事を貼っておくので参照してください。

この記事では「Python3」に焦点を当てて解説します。

参考Tutorial – Learn Python in 10 minutes – Stavros’ Stuff

Pythonについて

Pythonは以下のような特徴を持つ言語です。

  • 代入した値によって動的かつ暗黙的に型付けされる(動的型付け)
  • 変数の宣言は必要ない
  • 大文字と小文字が区別される
  • オブジェクト指向言語なので全てがオブジェクト

Pythonでは、変数(名前)にオブジェクトを束縛(バインド)して使用します。例えば以下の例を見てください:

# varに1、VARに2の整数をバインド
var = 1
VAR = 2

# 出力(print関数を使う)
print(var)
1
print(VAR)
2

# 型の確認(type関数を使う)
print(type(var))
<class 'int'>
print(type(VAR))
<class 'int'>

ヘルプを参照する

Pythonのヘルプはいつでも参照できます。

help(オブジェクト)オブジェクトの使い方を取得できる
dir(オブジェクト)オブジェクトのメソッドを全て表示できる
オブジェクト.__doc__ドキュメンテーション文字列を参照できます
help(1)
Help on int object:...


dir(1)
['__abs__', '__add__', '__and__', ...] 


len.__doc__
Return the number of items in a container.

使い方に困った場合はヘルプを参照してください。ヘルプは基本的に英語で書かれているのでわからない場合はGoogle先生に翻訳してもらいましょう!

構文

Pythonには「;」などの必須な終了文字はなく、ブロックはインデントで指定します。ブロックを開始するにはインデント、ブロックを終了するには逆インデントします。インデント(ブロック)を期待するステートメント(ifやforなど)は「:(コロン)」で終わります。

コメント

コメントは「#」を使って行コメント、「複数行文字列」を使って複数行コメントを表現します。

# 行コメント

'''複数行
コメント
です'''

"""ダブルクォート
でも表現できます"""

演算子

バインドには「=」が使用され、2つの値が等しいか比べるには「==」が使用されます。
「+=」や「-=」の代入演算子を使うことで右辺の値だけ「インクリメント/デクリメント」できます。これは文字列を含む多くのデータ型で使えます。

# インクリメント
num = 1 
num += 2 
print(num)
3

# デクリメント
num -= 1 
print(num) 
2

# 文字列のインクリメント
s = "Hello" 
s += "world" 
print(s)
Helloworld

また、1行で複数の変数を使用することもできます。

num = 1
val = 2

num, val = val, num
print(num)
2
print(val)
1

データ型

Pythonで利用できるデータ構造は、リスト、タプル、辞書、セットです。リストは配列であり、辞書は連想配列であり、タプルは不変の配列であり、セットは集合です。
Pythonの「配列」は異なる型を混在させることができます。

# リスト
mylist = [1, ["別の", "リスト"], (10, "タプル")]

# 辞書
mydict = {"Key 1": "Value 1", 2: 3, "pi": 3.14}

# タプル
mytuple = (1, 2, 3)

# セット
myset = {1, 2, 3, 1}  # 同等の要素は削除される
print(myset)
{1, 2, 3}

全ての「配列」タイプの最初の項目のインデックスは0です。負の数は最後から最初に向かってカウントされ-1が末尾の項目です。

mylist = [1, 2, 3.14]
# 最初の要素
print(mylist[0])
1

# 最後の要素を3に変更
mylist[-1] = 3
[1, 2, 3] 


mydict = {'名前': '太郎', '年齢': 24}
# 名前の取得
print(mydict['名前'])
太郎

# 年齢の変更
mydict['年齢'] = 30
{'名前': '太郎', '年齢': 30}

変数に関数の参照を渡すことができます。

# len関数をバインド
func = len

# len関数は配列の要素数を取得
print(func([1, 2, 3]))
3

「:(コロン)」を使って範囲で要素にアクセスできます。これを「スライス」と言います。

mylist = ["要素1", 2, 3.14]
print(mylist[:])
['要素1', 2, 3.14] 
print(mylist[0:2])
['要素1', 2]  
print(mylist[-3:-1])
['要素1', 2] 
print(mylist[1:])
[2, 3.14] 

# 3つ目のパラメーターを追加するとステップが指定できます
# stepはインデックスの増分を変更できます
print(mylist[::2])
['List item 1', 3.14] 

文字列

文字列はシングルクォートまたはダブルクォートのいずれかで使用でき、一方のクォートを使った文字列内にもう一方のクォートを含めることができます(つまり、「’これは”文字列”です’」は有効)。複数行の文字列は、トリプルクォート(”’または”””)で囲んで表現します。

'文字列リテラル'

'文字列リテラル中にもう一方のクォート(")を含めることができる'

'''複数行
文字列
リテラル'''

Pythonの文字列は常にUnicodeですが、バイトである別の文字列型もあります。これはバイト文字列と呼ばれ、文字列前にbを付けて表現します(例えば「b’Hello’」)。

bytestring = b'Hello' 

print(bytestring, type(bytestring))
b'Hello' <class 'bytes'>

文字列に値を挿入するには「%記法」や「fomatメソッド」を使います。Python3.6以降のバージョンの場合は「フォーマット済み文字列リテラル」を使うとより簡単です。

name = '太郎'

# %記法
print("Name: %s, Number: %s, String: %s" % (name, 3, 3 * "-"))
Name: 太郎,Number: 3,String: ---

# %(key名)s を使って辞書の値を挿入できます
print('私の名前は%(name)sです。年は%(age)sです' % {'age': 25, 'name': '太郎'})
私の名前は太郎です。年は25です

# 文字列型(str型)のformatメソッドを使う
"Hello, {}!".format(name)
Hello, 太郎

# フォーマット済み文字列リテラル
print(f"Hello, {name}!")
Hello, 太郎
【Python】文字列の使い方 【str型】この記事では、Pythonの文字列の使い方について解説します。 Pythonには、文字列を扱うためのstr型というデータ型が用意さ...

制御構文

制御構文にはifforwhileが用意されています。switchはないのでifで代用します。繰り返し可能な連番を生成するにはrange(整数)を使います。

range

# rangeオブジェクトの生成・出力
print(range(10))
range(0, 10)


# rangeオブジェクトからリストを生成
rangelist = list(range(10))
print(rangelist)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

if

num = 1

if num in (1, 2, 3, 4):
    print('numは(1, 2, 3, 4)のいずれかです')
elif num == 5:
    print('numは5です')
else:
    print('numは(1, 2, 3, 4, 5)以外の値です')
numは(1, 2, 3, 4)のいずれかです

for

# range(3)で生成したオブジェクトの要素を
# numberに1つずつ渡して繰り返し処理します
for val in range(3):
    if val == 1:
        # 真であれば処理される
        # break が実行され、ループが終了
        break
    else:
        # 偽であれば処理される
        # continue が処理されると以降の処理はスキップされ次のループを開始します
        continue
else:
    # elseはfor文のオプション
    # ループが中断されなかった場合のみ実行される
    pass  # passは何も処理しません

while

# 無限ループ
while True:
    print("無限ループです")

関数

関数はdefキーワードで宣言されます。オプション引数は、必須の引数の後にデフォルト値を指定して定義します。関数はタプルを返すことができます(アンパックを使用することで効率よく複数の値を返すことができます)。

def func(num, string='hoge'):
    return num, string


print(func(1))
(1, 'hoge')

ラムダ関数は単一のステートメントで構成される関数です。

'''
def func(x):
    return x + 1
と同等なラムダ式
'''
func = lambda x: x + 1
print(func(1))
2

引数は参照渡しですが、不変の型(tuple、int、 文字列など)は、呼び出し先の値を呼び出し元で変更することはできません。

不変の型は参照先の値を変更することができないので、別のオブジェクトを代入すると古いオブジェクトは破棄され、参照自体が変更されます。

そのため、引数で渡された不変の型のオブジェクトを変更しても参照先の値を変更しているわけではないので元のオブジェクトの値は書き換えられません。

n = 1
l = [1, 2, 3]
print(func(n, l))
(100, [1, 2, 3, '追加要素'])

# 不変(イミュータブル)の型は書き換えられない
print(n)
1

# 可変(ミュータブル)の型は書き換えることができる
print(l)
[1, 2, 3, '追加要素'] 
【Python】関数の使い方この記事では、Pythonの関数の使い方を解説します。 関数とは「処理をまとめて何度でも呼び出せるようにしたもの」です。 なんど...

クラス

Pythonのクラスは継承や多重継承をサポートします。プライベート変数とメソッドは先頭にアンダースコアを付けることで宣言できます(慣例なので言語による強制力はありません)。任意の名前をクラスインスタンスにバインドすることができます。コンストラクタなどの特殊メソッドは__メソッド名__()で使用できます。

# objectクラスを継承したMyClassクラス
class MyClass(object):
    # クラス変数
    common = 10
    # コンストラクタ
    def __init__(self):
        # インスタンス変数
        self.myvariable = 3
    # メソッド
    def myfunction(self, arg1, arg2):
        return self.myvariable


# MyClassのインスタンス化
classinstance = MyClass()
classinstance.myfunction(1, 2)
3
# クラス変数は全てのインスタンスで共有される
classinstance2 = MyClass()
classinstance.common
10
classinstance2.common
10
# クラス変数は「クラス名.変数名」から更新します
MyClass.common = 30
classinstance.common
30
classinstance2.common
30
# 以下の方法ではクラス変数を更新しません
# 動的にcommonというインスタンス変数を生成します
classinstance.common = 10
classinstance.common
10
classinstance2.common
30
MyClass.common = 50
# クラス変数として更新されなくなります
classinstance.common
10
classinstance2.common
50

# このクラスはMyClassを継承しています
# 多重継承は以下のように宣言します:
# class OtherClass(MyClass1, MyClass2, MyClassN)
class OtherClass(MyClass):
    # 「self」引数は自動的に渡され、クラスインスタンスを参照できます
    def __init__(self, arg1):
        self.myvariable = 3
        print(arg1)

classinstance = OtherClass("hello")
# hello
classinstance.myfunction(1, 2)
3
# 動的にインスタンス変数を追加することもできます
classinstance.test = 10
classinstance.test
10
【Python】型を定義する方法【class(クラス)の使い方】この記事では、Pythonのclass(クラス)を定義する方法を解説します。 クラスとは、つまりは「型」のことです。クラスを定義す...

例外処理

Pythonの例外処理は「try-except[例外名] 」ブロックで処理します。

def some_function():
    try:
        # 0で割るとエラーが発生します
        10 / 0
    except ZeroDivisionError:
        print("無効です")
    else:
        # 例外が発生しなかった場合
        pass
    finally:
        # ここは例外処理の最後に実行されます
        print("終わりです")

some_function()
無効です
終わりです
【Python】例外処理の使い方この記事では、Pythonの例外処理の使い方について解説します。 例外処理を定義することでエラーが起きた際の処理を指定することがで...

インポート

外部ライブラリは、import [ライブラリ名] キーワードと共に使用されます。個別の機能はfrom [ライブラリ名] import [関数名] でインポートできます。

import random
from time import sleep

randomint = random.randint(1, 100)
print(randomint)
64

File I/O

Pythonにはさまざまなライブラリが組み込まれています。

例としてファイルI/Oを使用したシリアル化(pickleライブラリを使用してデータ構造を文字列に変換する)の使用方法を見てみましょう!

import pickle
mylist = ["This", "is", 4, 13327]
# C:\\binary.datファイルを書き込み用で開きます
# ファイル名文字列前の「r」はバックスラッシュのエスケープを防ぐために使われます
myfile = open(r"C:\\binary.dat", "wb")
pickle.dump(mylist, myfile)
myfile.close()

myfile = open(r"C:\\text.txt", "w")
myfile.write("This is a sample string")
myfile.close()

myfile = open(r"C:\\text.txt")
print(myfile.read())
'This is a sample string'
myfile.close()

# ファイルを開いて読み取る
myfile = open(r"C:\\binary.dat", "rb")
loadedlist = pickle.load(myfile)
myfile.close()
print(loadedlist)
['This', 'is', 4, 13327] 

その他

  • 条件を連鎖させることができます:1 < a < 3 aが1より大きく3より小さい
  • delは配列内の要素または変数を削除できます
  • リスト内包表記は、リストを作成および操作するための強力な方法を提供します。
lst1 = [1, 2, 3]
lst2 = [3, 4, 5]
print([x * y for x in lst1 for y in lst2])
[3, 4, 5, 6, 8, 10, 9, 12, 15] 
print([x for x in lst1 if 4 > x > 1])
[2, 3] 
# いずれかの要素の条件がが真であるかどうかを確認します
# 「any」はリスト内のいずれかの項目がTrueの場合にTrueを返します
any([i % 3 for i in [3, 3, 4, 4, 3]])
True
# 4 % 3 = 1 であり、1は真です

# 条件が真である要素の数を確認します
sum(1 for i in [3, 3, 4, 4, 3] if i == 4)
2
del lst1[0]
print(lst1)
[2, 3] 
del lst1

グローバル変数は関数の外部で宣言され、特別な宣言なしで読み取ることができますが、グローバル変数に書き込む場合は、関数の先頭でglobalキーワードを使用して宣言する必要があります。宣言しなければ新たなローカル変数を生成してしまいます。

number = 5

def myfunc():
    # 5を出力
    print(number)

def anotherfunc():
    # 出力前に変数がバインドされていないため、これにより例外が発生ます
    # Pythonはオブジェクトが後でバインドされることを認識しており、
    # グローバル変数にアクセスする代わりに新たにローカル変数を作成してしまう
    print(number)
    number = 3

def yetanotherfunc():
    global number
    # これによりグローバル変数が変更できる
    number = 3

まとめ

この記事ではPythonを簡単に学んでもらいました!

このチュートリアルは完璧なものではありません。さらに詳しく学びたい方は公式ドキュメントを参照したり、参考書を使って学習しましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職「DMM WEBCAMP COMMIT」
なんと転職成功率98%!
今なら3日以内のカウンセリング枠を予約&参加で「1,000円分のAmazonギフト券」をプレゼント!