乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

                 13.文字列

pythonのデータ型の中でも文字列型は一番よく使うデータ型です。

なので、文字列型の取り扱い方を詳しく見ていきましょう。

文字列型について

文字列型にする場合は
シングルクォートやダブルクォートで囲みます。
変数に格納する際も同様です。

In [1]:
st = 'abcde'
print(st)
print(type(st))
abcde
<class 'str'>

シングルクォートやダブルクォートの使い分け

"..." の中では ' を、'...' の中では " を使うことができます。
"..." の中で " を、'...' の中で ' を使用するには、
\ バックスラッシュを用いて引用符をエスケープ(無効化)します。

In [2]:
# \ バックスラッシュを用いるとその後に続く引用符が無効になり、表示させることができる。
st = "We can use \" in the string."
print(st)

st = 'We can use \' in the string.'
print(st)
We can use " in the string.
We can use ' in the string.

特殊な文字列を打ち込む場合には、このエスケープ文字を使用する。

macは \ バックスラッシュ 
windowsは ¥ マーク

\n とすると改行コード、\tと打ち込むとタブを表現できる。

In [3]:
# 改行コード
print('aaaa \n bbbb')

# タブ
print('cccc \t dddd')
aaaa 
 bbbb
cccc 	 dddd

改行はエンターキーだが、打ち込むことはできないので
改行を含ませたい場合はエスケープ文字を使って表現できる。

このようにエスケープ文字を使って表現する特定の文字のことを
エスケープシーケンスと言います。

他にもいくつかエスケープシーケンスがありますが、
余り使わないかもしれません。

三重クォート """...""" や '''...''' は、
複数行にまたがった文字列を記述することができます。

三重クォートはしばしば、複数行のコメントとして利用されることがあります。

In [4]:
mail_text = '''
林様

お世話になっております。木森です

本日はウェルカムトゥーザジャングルをお届けいたします。
'''
print(mail_text)
林様

お世話になっております。木森です

本日はウェルカムトゥーザジャングルをお届けいたします。

メールの差し込み文章を作るときなどによく使われる手法です。
文章をあらかじめ変数に用意しておいて
その一部を取り替えると、いろいろな人向けの本文が作成できます。

文字列関数について

Pythonでは文字列を操作するいろいろな関数が備わっています。

その中からよく使うものをご紹介します。

replace:文字列を置換する

置換対象文字列.replace('置換前文字列','置換後文字列')

In [5]:
aaa = 'abcdefg'
print(aaa)
# replaceでdef を zzzz に変換
print(aaa.replace('def','zzzz'))
abcdefg
abczzzzg

in , startswith , endswith:対象の文字列に対して検索文字列を含むかどうかの判定をする

検索文字列 in 対象の文字列 :文字列を含むかどうかの判定する

対象の文字列.startswith(検索文字列): 始まりの文字列かどうかを判定する

対象の文字列.endswith(検索文字列) : 終端の文字列かどうかを判定する

In [6]:
apple = 'apple'
# apple に pp が含まれるかどうかを判定する
print('pp' in apple)

# apple がapp で始まるかどうかを判定する
print(apple.startswith('app'))

# apple が le で終わるかどうかを判定する
print(apple.endswith('le'))
True
True
True

split , rsplit , splitlines : 文字列をリストに変換

文字列.split(区切り文字) : 指定したセパレーターをもとに文字列を区切り, リストを返す

文字列.rsplit(区切り文字 , 区切り個数) : 区切りはじめる方向がsplit()と逆から引数指定分までを返す

文字列.splitlines() : 改行ごとに文字列を区切り, リストを返す

リスト型については詳細は次項で説明する。

In [7]:
# , 区切りでリスト型にする
print('aaaa,bbb,ccc'.split(','))

# 区切りはじめる方向がsplit()と逆から引数指定分までを返す
print('aaaa,bbb,ccc'.rsplit(',',1)) 

# 改行ごとに文字列を区切り, リストを返す
print('aaaa\nbb\ncc'.splitlines())
['aaaa', 'bbb', 'ccc']
['aaaa,bbb', 'ccc']
['aaaa', 'bb', 'cc']

join() : かっこの中のリスト型の文字列を連結する

'区切り文字'.join([文字,文字])

In [8]:
aaa = ','.join(['a','b','c'])
print(aaa)
a,b,c

count() : 文字の個数をカウントする

検索対象文字列.count(カウントしたい文字列)

見つからない場合は0を返します。

In [9]:
aaa = '平平平平'.count('平')
print(aaa)

aaa = '平平平平'.count('米')
print(aaa)
4
0

ここから下は使う頻度は少ないものですが文字列関数として備わっているものです。

find , rfind , index , rindex : 文字列の位置の判定

対象の文字列.find(検索文字列) :検索文字列を探し, あった場合は, 最小のインデックスを返す. なければ-1を返す

対象の文字列.rfind(検索文字列)) :検索文字列を探し, あった場合は, 最大のインデックスを返す. なければ-1を返す

対象の文字列.index(検索文字列) :検索文字列を探し, あった場合は, 最小のインデックスを返す. なければエラーを返す

対象の文字列.rindex(検索文字列) :検索文字列を探し, あった場合は, 最大のインデックスを返す. なければエラーを返す

In [10]:
# appleから p を探し, あった場合は, 最小のインデックスを返す. なければ-1を返す
print('apple'.find('p'))  

# appleから p を探し, あった場合は, 最大のインデックスを返す. なければ-1を返す
print('apple'.rfind('p')) 

# pen pine apple pen から e を探し, あった場合は, 最小のインデックスを返す. なければエラーを返す
print('pen pine apple pen'.index('e'))  

# pen pine apple pen からe を探し, あった場合は, 最大のインデックスを返す. なければエラーを返す
print('pen pine apple pen'.rindex('e')) 
1
2
1
16

isalnum , isalpha , isdigit , islower , isspace , istitle : 文字列の構成要素の判定

文字列.isalnum() : 文字がすべて英数文字かどうかの判定

文字列.isalpha() : 文字がすべて英字かどうかの判定

文字列.isdigit() : 文字がすべて数字かどうかの判定

文字列.islower() : 大小文字の区別がある文字がすべて小文字かどうかの判定

文字列.isspace() : 文字がすべて空白かどうかの判定

文字列.istitle() : 文字列がタイトルケース(先頭が大文字)かどうかの判定

In [11]:
# 文字列が英数字だけかどうかを判定する
print('az189898ssss'.encode('utf-8').isalnum()) 

# 文字列が全て英字だけかを判定する
print('aaaaAAAZZZzz'.encode('utf-8').isalpha()) 

# 文字列が数字だけかを判定する
print('123112399876'.encode('utf-8').isdigit()) 

# 小文字だけかどうかを判定する
print('abcdefghijkl'.encode('utf-8').islower()) 

# 文字が空白かどうかを判定する
print('            '.encode('utf-8').isspace()) 

# 文字列がタイトルケース(先頭が大文字)かどうかの判定
print('Apple Zedd  '.encode('utf-8').istitle()) 
True
True
True
True
True
True

capitalize , swapcase , title , lower , upper : 大文字, 小文字の変換

文字列.capitalize() : 最初の文字のみを大文字にする

文字列.swapcase() : 大文字を小文字に, 小文字を大文字に変換する

文字列.title() : 文字列をタイトルケース(先頭が大文字)にする

文字列.lower() : 文字をすべて小文字に変換する

文字列.upper() : 文字をすべて大文字に変換する

In [12]:
# 最初の文字のみを大文字にする
print('az189898ssss'.capitalize()) 

# 大文字を小文字に, 小文字を大文字に変換する
print('az189898SSSS'.swapcase())   

# 文字列をタイトルケース(先頭が大文字)にする
print('az189898ssss'.title())      

# 文字をすべて小文字に変換する
print('Za189898SsSs'.lower())      

# 文字をすべて大文字に変換する
print('az189898ssss'.upper()) 
Az189898ssss
AZ189898ssss
Az189898Ssss
za189898ssss
AZ189898SSSS

                 12.データ型

プログラム言語で取り扱うデータにはデータの型があり
書き方などが決まっている。

Pythonのデータ型

Pythonでデータ型を調べる際には type関数を用いる

整数型

int型とも言う(integer の略)

In [1]:
num = 1234
print(type(num))
<class 'int'>

プログラムでは通常の数値を書くと10進法で解釈されるが
その他に2,8,16進法を用いることができる。

2進法は 0b  をはじめにつけます。
8 進法は 0o をはじめにつけます。
16進法は 0x をはじめにつけます。

In [2]:
# 2進法
num = 0b11000100
print(num)

# 8 進法
num = 0o777
print(num)

# 16進法
num = 0xffff
print(num)
196
511
65535

10進法は0から9まで数えて10までいくと1つ桁が繰り上がります。
2進法は0 , 1 で2つ数えて繰り上がり、
8進法は0から7まで行ったら繰り上がり
16進法は0から9までいったら次は英語のabcdefまでいくと
繰り上がるというものです。

小数型

浮動小数点型、float型ともいいます。

In [3]:
num = 1.234
print(type(num))
<class 'float'>

指数表記も使えます。指数表記は英文字のeをつけます。
e3は10の3乗を表します。
-を付けると逆に-乗になります。

In [4]:
# 1.2の10の3乗
num = 1.2e3
print(type(num))
print(num)

# 1.2の10の -3乗
num = 1.2e-3
print(num)
<class 'float'>
1200.0
0.0012

同じ数値でも、整数型と小数型では違う形なので注意!!

小数型と整数型の計算結果は小数型

In [5]:
# 整数割る整数
print(10/4)
# 整数割る整数(余りなし)
print(10//4)
# 整数割る小数
print(10//4.0)
# 小数割る小数
print(12.3/4.0)
2.5
2
2.0
3.075

論理型

booleanを略してbool型とも言う
True か False どちらかの値が入る型です。

In [6]:
answer = True
print(answer)
print(type(answer))
True
<class 'bool'>

計算の判定結果もbool型

==で==の左側と右側が等しいかどうかを判定

In [7]:
1==2
Out[7]:
False

bool型は等しければTrue , 違えばFalse の値となる。

文字列型

string型ともいう
文字列(str)は、ダブルクォート " 、またはシングルクォート ' で囲む。

In [8]:
# 文字列型
print(type('12345'))

# こちらは数値
print(type(12345))
<class 'str'>
<class 'int'>

文字と数値の変換

文字列を整数型に直す場合は
int('数字')

整数型や小数型を文字列に直す場合は
str(数値)

In [9]:
# 文字列を整数型に
a = '12345'
# 文字を数値に変換したので計算できるようになる
print(int(a) + 12345)
24690
In [10]:
# 小数点を文字列に変換
b = 2.5
# 数値を文字列に変換したので文字列として加えられる
print('江頭' + str(b) + '分')
江頭2.5分

byte型

バイト列として扱いたい文字列の "..." や '...' 
の前に b または B を記述して、バイト列(bytes)であることを示す。

In [11]:
byte_st = b'0123456789abcdef'
print(byte_st)
print(type(byte_st))
b'0123456789abcdef'
<class 'bytes'>

b がついていたら byte型で文字列型とは別物

                 11.予約語

予約語というのはプログラム内であらかじめ使われてしまっている
言葉のことで、プログラムの中では特別な意味を持つ言葉になります。

予約語

In [1]:
# 予約語の一覧を出す
__import__('keyword').kwlist
Out[1]:
['False',
 'None',
 'True',
 'and',
 'as',
 'assert',
 'break',
 'class',
 'continue',
 'def',
 'del',
 'elif',
 'else',
 'except',
 'finally',
 'for',
 'from',
 'global',
 'if',
 'import',
 'in',
 'is',
 'lambda',
 'nonlocal',
 'not',
 'or',
 'pass',
 'raise',
 'return',
 'try',
 'while',
 'with',
 'yield']

この予約語は変数名や関数名などに用いることはできません。

jupyter notebook 上で予約語を使うと
緑色に表示が変わるので、気付けるかと思います。

In [ ]:
for in with

組み込み関数

In [2]:
# 組み込み関数を表示する
dir(__builtins__)
Out[2]:
['ArithmeticError',
 'AssertionError',
 'AttributeError',
 'BaseException',
 'BlockingIOError',
 'BrokenPipeError',
 'BufferError',
 'BytesWarning',
 'ChildProcessError',
 'ConnectionAbortedError',
 'ConnectionError',
 'ConnectionRefusedError',
 'ConnectionResetError',
 'DeprecationWarning',
 'EOFError',
 'Ellipsis',
 'EnvironmentError',
 'Exception',
 'False',
 'FileExistsError',
 'FileNotFoundError',
 'FloatingPointError',
 'FutureWarning',
 'GeneratorExit',
 'IOError',
 'ImportError',
 'ImportWarning',
 'IndentationError',
 'IndexError',
 'InterruptedError',
 'IsADirectoryError',
 'KeyError',
 'KeyboardInterrupt',
 'LookupError',
 'MemoryError',
 'NameError',
 'None',
 'NotADirectoryError',
 'NotImplemented',
 'NotImplementedError',
 'OSError',
 'OverflowError',
 'PendingDeprecationWarning',
 'PermissionError',
 'ProcessLookupError',
 'RecursionError',
 'ReferenceError',
 'ResourceWarning',
 'RuntimeError',
 'RuntimeWarning',
 'StopAsyncIteration',
 'StopIteration',
 'SyntaxError',
 'SyntaxWarning',
 'SystemError',
 'SystemExit',
 'TabError',
 'TimeoutError',
 'True',
 'TypeError',
 'UnboundLocalError',
 'UnicodeDecodeError',
 'UnicodeEncodeError',
 'UnicodeError',
 'UnicodeTranslateError',
 'UnicodeWarning',
 'UserWarning',
 'ValueError',
 'Warning',
 'ZeroDivisionError',
 '__IPYTHON__',
 '__build_class__',
 '__debug__',
 '__doc__',
 '__import__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 'abs',
 'all',
 'any',
 'ascii',
 'bin',
 'bool',
 'bytearray',
 'bytes',
 'callable',
 'chr',
 'classmethod',
 'compile',
 'complex',
 'copyright',
 'credits',
 'delattr',
 'dict',
 'dir',
 'divmod',
 'dreload',
 'enumerate',
 'eval',
 'exec',
 'filter',
 'float',
 'format',
 'frozenset',
 'get_ipython',
 'getattr',
 'globals',
 'hasattr',
 'hash',
 'help',
 'hex',
 'id',
 'input',
 'int',
 'isinstance',
 'issubclass',
 'iter',
 'len',
 'license',
 'list',
 'locals',
 'map',
 'max',
 'memoryview',
 'min',
 'next',
 'object',
 'oct',
 'open',
 'ord',
 'pow',
 'print',
 'property',
 'range',
 'repr',
 'reversed',
 'round',
 'set',
 'setattr',
 'slice',
 'sorted',
 'staticmethod',
 'str',
 'sum',
 'super',
 'tuple',
 'type',
 'vars',
 'zip']

これを変数名に用いてしまうと
その関数の機能を、変数で上書きしてしまい
その関数が使えなくなってしまう。

※間違えて使用してしまったらノートッブックを再起動しましょう。

変数名の宣言は英単語2個以上にすることで
こういった問題を回避することができたりするので推奨。

例:
magic_spell_name
attack_point

                  10.変数

プログラムでは入力されたデータを使い回す機能があります。
それが変数という概念です。

変数を用いることで入力したデータを再利用できるようになります。

変数を宣言と値の代入

変数名 = 値

= は代入を表す演算子(代入演算子)
= の左側に右側を代入する。

In [1]:
a = 12345
b = 23456

個数が合えば複数同時に宣言と代入が行える。

In [2]:
a,b,c = 4,5,6
d,e,f = '10','20','30'

変数名に使用できる文字

a - z のアルファベット(大文字と小文字)
0 - 9 までの数字
_ (アンダースコア)

変数名は自分で考えて付けるものなのでなんでも良いですが
中に格納するデータがどんなものかを考えて名称をつけるのが良いでしょう

この講義ではアンダーバーで2つ以上の英単語を用いることを推奨します。
例:
magic_spell_name
attack_point

なお変数名は予約語や組み込み関数名に該当するものでなければ
なんでも付けることができます。

予約語などについては次項で

変数の使い方

In [3]:
# 変数 a に 数値の12345 を代入する
a = 12345
# 変数 b に 数値の23456 を代入する
b = 23456
# 変数 a と b を足した結果を出力する
print(a + b)
35801
In [4]:
# 変数c にa + b の結果を代入する
c = a+b
# 結果
print(c)
35801

同じ変数名に値を代入すると上書きされる。

In [5]:
# 変数 a に数値の123を代入
a = 123
print(a)

# 変数 a に数値の234を代入
a = 234
print(a)
123
234
In [6]:
a,b = 12345,23456
print(a)
print(b)

# a + b の結果を再度 a に代入する(上書き)
a = a+b
print(a)
12345
23456
35801

プログラムではデータの形も重要!!

文字と数値は一緒に計算できない

In [7]:
a = '文字'
b = 1
print(a + b)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-2c4cb487c08a> in <module>()
      1 a = '文字'
      2 b = 1
----> 3 print(a + b)

TypeError: Can't convert 'int' object to str implicitly

TypeError : 変数 a と b のデータの形が違うので計算できない(変換できない)という意味合いのエラー

数値の型と文字の型ではデータの形が違うため一緒にすることができない

データの形の確認

type 関数を使って変数のデータ型を確認する

type(変数名)

In [8]:
# 変数aとcは数値、bは文字列を代入
a,b,c = 1 , '3' , 4
print(type(a))
print(type(b))
print(type(c))
<class 'int'>
<class 'str'>
<class 'int'>

int は整数
str は文字列を表す

変数に格納したもののことを「オブジェクト」と呼んだりもします。

9.インデックス

インデックスとはプログラム上で何番目?
というのを表す数字です。

インデックスを用いることでプログラムでは
様々なことが行えます。


                     インデックスの表記

四角カッコ で囲みその中に数値を入力する
例:
  [5]

文字のインデックスの場合

In [1]:
print('はじめの一歩'[5])

インデックス番号目の文字を取り出すことができる。

インデックスの数え方

インデックスは 0 から始まるので

文字列の最初の文字を取りたい場合インデックスは 0 
2番目を取りたい場合インデックスは  1になる

※n番目のインデックス値はn-1と、1つズレるので注意

最後の文字を指定する場合は -1 で指定でき
マイナス を付けると末尾から数えることができる。

In [2]:
# 最初
print('あいうえお'[0])

# 2番目
print('あいうえお'[1])

# 最後
print('あいうえお'[-1])

#  最後から数えて3番目
print('あいうえお'[-3])
あ
い
お
う

存在しないインデックス値を指定するとエラーになる。

In [3]:
print('あいうえお'[7])
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-3-35481bea2f07> in <module>()
----> 1 print('あいうえお'[7])

IndexError: string index out of range

IndexError : インデックス値が範囲外の場合に起こるエラー

スライス

Pythonではインデックスを使って
範囲指定でデータを取り出すことができる機能があり
「スライス」と呼んでいる。

スライスの書き方:

[n:m] n番目からm番目まで
[n:]  n番目以降
[:n] n番目まで
[n:m:o] n番目からm番目までo個とばして

In [4]:
# 3番目から5番目
print('あいうえおかき'[2:5])

# 2番目以降
print('あいうえおかき'[1:])

# 3番目まで
print('あいうえおかき'[:3])

# 最初から最後の1つ手前まで
print('あいうえおかき'[0:-1])

# 最初から最後の1つ手前までで1つ飛ばして
print('あいうえおかき'[0:-1:2])
うえお
いうえおかき
あいう
あいうえおか
あうお

このページのトップヘ