他言語経験者用 Python 入門①

Python の基礎学習のためのメモ。(基本的には自分用の備忘録)
Java、Javascriptなど他言語の経験者を対象とした内容のため、環境構築的な部分は一切飛ばし Python 自体について書いていく。

使用する開発環境は以下のとおり。
 ・ Python 3.8
 ・ VS Code

参考文献は以下の連載サイト。

Python入門

Pythonの特徴

①他のプログラミング言語と比べ、シンプルで覚えることが少ない
②Python向け外部ライブラリが豊富
③活躍の範囲が広い(アプリ、Web、AIなど)
インデントによりブロックを判断するため自然とコードが綺麗になる

個人的には④が最大の魅力だと思う。

Hello World

いくつかのパターンで Hello World してみる。

パターン1: ただの Hello World。

print('Hello World')
実行結果: Hello World

以上。

パターン2: 入力した名前に対して Hello する。

name = input('Input your name : ')
print('Hello ' + name)
実行結果:
 Input your name : Taro
 Hello Taro

パターン3: 関数を使った Hello World

# 関数定義
def hello(name):
 print('Hello ' + name)

# 関数呼び出し
hello('Taro')
実行結果: Hello Taro

数値と算術演算

一般的なプログラミング言語とそれほど違いはない。
Python以外であまり見たことがないものや、他言語と構文が異なるものを中心に掲載する。

インクリメント・デクリメント

他言語でよく使われるインクリメント ( ++ ) 、デクリメント ( -- )は Python では使えないので注意が必要。

「+」演算子

print( 2 + 2 )
実行結果: 4

上記のとおり普通に使えるが、文字列連結の際には注意が必要。

print('2' + 2)    # 文字列と数値
実行結果: TypeError: can only concatenate str (not "int") to str

指数に使用できる。

print(9.8203e+3)
実行結果: 9820.3

各進数の表現

他言語でもそうだが、一応メモしておく。

2進数: 先頭に「0b」を付与。
8進数: 先頭に「0o」を付与。
16進数: 先頭に「0x」を付与。

「//」演算子

「//」演算子を使うことで、整数除算の商を求められる。

print( 9 // 5 )
実行結果: 1

Python の三項演算

from random import randint    # randomモジュールのrandint関数をimport

num = randint(1, 10)
ans = 'Even' if num % 2 == 0 else 'Odd'    # 三項演算
print(f'{num} is {ans}')
実行結果: 6 is Even

Python の文字列について

文字列は、シングルクォーテーション「'」またはダブルクォーテーション「"」で囲む。

str1 = 'Hello '
str2 = "Taro"

print(str1 + str2)
実行結果: Hello Taro

トリプルクォーテーション(三重引用符)で囲んだ文字列は、エスケープシーケンスも含めて文字列そのものを出力できる。

str = '''
トリプルクォーテーションで囲むと、\n や \t などの
エスケープシーケンスも含め、そのまま出力できます。
'''

print(str)
実行結果:
トリプルクォーテーションで囲むと、\n や \t などの
エスケープシーケンスも含め、そのまま出力できます。

raw 文字列

raw 文字列を使うことでも、文字列内にエスケープシーケンスそのものを含めることができる。
raw 文字列の作成は以下の例のとおり、文字列の先頭に「r」または「R」を記述する。

str = r'C:\Program Files\java'
print(str)
実行結果:C:\Program Files\java

フォーマット済文字列

フォーマット済文字列を使うと、文字列中に変数や計算式を埋め込むことができる。
フォーマット済文字列の作成は以下の例のとおり、文字列の先頭に「f」または「F」を記述する。
文字列中に変数を埋め込むには、中カッコで囲む。

first_name = 'Obi-Wan'
family_name = 'Kenobi'
full_name = f'{first_name} {family_name}'

print full_name
実行結果:Obi-Wan Kenobi

文字列操作について

文字列 ⇔ 数値 変換

文字列を数値に変換する関数に、int 関数、float 関数がある。

n = '10'
print(int(n) + 1)

f = '3.14'
print(float(f) + 1)
実行結果:
 11
 4.14

また逆に、数値を文字列に変換する関数として str 関数がある。

n = 100
print(str(n) + '歳')
実行結果: 100歳

文字数取得

length = len('Hello Python')
print(length)
実行結果: 12

文字列検索

文字列検索用の関数は複数ある。
・find
・rfind
・index
・rindex

・find
 使い方:検索元文字列.find(検索したい文字列)
 引数:検索したい文字列
 戻り値:検索元文字列内に、検索したい文字列が存在する場合、その最小インデックス。存在しない場合は -1。

・rfind
 使い方:検索元文字列.rfind(検索したい文字列)
 引数:検索したい文字列
 戻り値:検索元文字列内に、検索したい文字列が存在する場合、その最大インデックス。存在しない場合は -1。

・index
 使い方:検索元文字列.index(検索したい文字列)
 引数:検索したい文字列
 戻り値:検索元文字列内に、検索したい文字列が存在する場合、その最小インデックス。存在しない場合は例外を発生させる。

・rindex
 使い方:検索元文字列.rindex(検索したい文字列)
 引数:検索したい文字列
 戻り値:検索元文字列内に、検索したい文字列が存在する場合、その最大インデックス。存在しない場合は例外を発生させる。

文字種の判定

・isdigit
 使い方:対象文字列.isdigit()
 引数:なし
 戻り値:真偽値。対象文字列が数字だけで構成されていればTrue、そうでなければFalse。

・isalpha
 使い方:対象文字列.isalpha()
 引数:なし
 戻り値:真偽値。対象文字列が英字だけで構成されていればTrue、そうでなければFalse。

・isalnum
 使い方:対象文字列.isalnum()
 引数:なし
 戻り値:真偽値。対象文字列が英数字だけで構成されていればTrue、そうでなければFalse。

・isupper
 使い方:対象文字列.isupper()
 引数:なし
 戻り値:真偽値。対象文字列が大文字だけで構成されていればTrue、そうでなければFalse。

・islower
 使い方:対象文字列.islower()
 引数:なし
 戻り値:真偽値。対象文字列が小文字だけで構成されていればTrue、そうでなければFalse。

文字列置換

・replace
 使い方:元文字列.replace(old, new, count)
 引数1:置換前の文字列
 引数2:置換後の文字列
 引数3:置換回数(省略時は該当した全回数)
 戻り値:「元文字列」内の「置換前の文字列」を「置換後の文字列」に指定回数分置き換えた結果の文字列。

その他(startswith / endswith)

文字列の先頭が指定の文字列で始まっているかを調べるのが startswith。
 使い方:文字列.startswith(prefix)

文字列の終端が指定の文字列かどうかを調べるのが endswith。
 使い方:文字列.endswith(suffix)

条件分岐(if / else)

# fizzbuzz関数
def fizzbuzz(num):
 if num % 3 == 0 and num % 5 == 0:
   print('fizzbuzz')
 elif num % 3 == 0:
   print('fizz')
 elif num % 5 == 0:
   print('buzz')
 else:
   print(num)

# 関数呼び出し
fizzbuzz(15)
実行結果: fizzbuzz

for ループ

str = 'Hello World'
for ch in str:
 # 1文字ずつカンマで区切って表示する
 print(ch, end=', ')
実行結果: H, e, l, l, o, , W, o, r, l, d,
for num in range(10):
 # 1文字ずつスペースで区切って表示する
 print(num, end=' ')
実行結果: 0 1 2 3 4 5 6 7 8 9

リストを使用した for ループ

names = ['taro', 'jiro', 'ichiko']
for name in names:
 print(name, end=' ')
実行結果:taro jiro ichiko

while ループ

i = 0
while i < 10:
 print(i, end=' ')
 i += 1
実行結果: 0 1 2 3 4 5 6 7 8 9

先にも述べたが、他言語で良く使われるインクリメント( ++ )、デクリメント( -- ) 演算子は使えないので注意が必要。

関数定義と呼び出し

# 関数定義の書式:
def func_name( param1, param2, ....):
    処理1
    処理2
    ....

# 関数呼び出し:
func_name( arg1, arg2, ....)

以下の仕様で関数を定義する

機能: 引数で受け取った名前に対してあいさつする
関数名: hello
引数:someone(相手の名前を表す文字列)
def hello(someone):
 print(f'Hello {someone}')

関数の特殊な引数

引数のアンパック

関数の引数には、反復可能オブジェクトをアンパックして渡すことができる。
リストや文字列はオブジェクトの前にアスタリスク「*」を1つ付け、辞書の場合は2つ付ける。
辞書の場合、各キーには、関数パラメータと同じ名前を付ける必要があるので注意。

def unpack_sample(param1, param2, param3):
 return f'{param1} {param2} {param3}'

# リストをアンパックして渡す
s = unpack_sample(*['aa', 'bb', 'cc'])
print(s)

# 文字列をアンパックして渡す
s = unpack_sample(*'ABC')
print(s)

# 辞書をアンパックして渡す
dict = {'param1':'v1','param2':'v2','param3':'v3'}
s = unpack_sample(**dict)
実行結果:
 aa bb cc
 A B C
 v1 v2 v3

引数のデフォルト値

def sample(p1='a', p2='b', p3=0):
 print(f'{p1} {p2} {p3}')

sample()
sample(p2='B')
実行結果:
 a b 0
 a B 0

注意点:
いずれかのパラメーターにデフォルト引数値を指定したら、指定した引数以降すべてのパラメーターデフォルト引数値を指定しなければならない。

参考:print 関数のデフォルト値

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

変数・関数のスコープと名前空間

プログラム実行時に変数名や関数名を発見すると、Pythonはそれを解決するために、3つ(またはそれ以上)のスコープを以下の順で探す。
 ローカルスコープ ⇒ グローバルスコープ ⇒ ビルトインスコープ

関数の実行時に名前が見つかると、まずは関数のローカルスコープからその名前を検索する。
・ローカルスコープにその名前があれば、その値を利用する。
・見つからなければ、グローバルスコープ → ビルトインスコープという順番で、その名前を検索していき、見つかったところでその値を利用する。
・最終的に名前が見つからなければ「NameError」を発生させる。

それぞれの名前空間について

・ビルトイン名前空間:Pythonインタープリタの起動時に作成され、インタープリタの終了時に削除される
・グローバル名前空間:モジュール読み込み時に作成され、多くの場合はインタープリタの終了時に削除される
・ローカル名前空間:関数が呼び出されるタイミングで作成され、関数の終了時に削除される

ラムダ式

ラムダ式の構文

lambda パラメータ: 式

パラメータがない場合はコロンのみを記述する。
パラメータが複数ある場合はカンマ区切りで記述する。

ラムダ式の実例と使いどころ

func = lambda name: print(f'Hello {name}')

func('taro')
実行結果: Hello taro

上記のように無名関数をラムダ式で作成し、変数に代入することができる。
しかし、このような使用方法はPython公式サイトで推奨されていない。

使いどころとしては、関数の引数に関数を入れるような場合を想定している。
以下に filter 関数を使った例を示す。

result = filter(lambda x: x % 2 == 0, [0, 1, 2, 3, 4, 5, 6])

for num in result:
 print(num, end=' ')
実行結果: 0 2 4 6

さらに上記を、リスト内包表記で書き直す。
※ 内包表記についての詳細は後述

result = [x for x in [0, 1, 2, 3, 4, 5, 6] if x % 2 == 0]
print(result)
実行結果: [0, 2, 4, 6]


次は 入門② コレクション



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