他言語経験者用 Python 入門①
Python の基礎学習のためのメモ。(基本的には自分用の備忘録)
Java、Javascriptなど他言語の経験者を対象とした内容のため、環境構築的な部分は一切飛ばし Python 自体について書いていく。
使用する開発環境は以下のとおり。
・ Python 3.8
・ VS Code
参考文献は以下の連載サイト。
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]
次は 入門② コレクション
この記事が気に入ったらサポートをしてみませんか?