原文:『実用的なPythonプログラミング』02_01_Datatypes
9490 ワード
目次 | 前のセクション(1.7関数) | 次節(2.2容器)
2.1データ型とデータ構造
このセクションでは、メタグループと辞書に代表されるデータ構造について説明します.
元のデータ型
Pythonには元のデータ型があります.整数 浮動小数点数 文字列(テキスト) 空のタイプ
データ構造
実際のプログラムはより複雑なデータを持っている.たとえば、株式の保有情報:
これは、3つのセクションを含むオブジェクトです.株の名称または記号(「GOOG」、文字列) 株式数(100,整数) 価格(490.10、浮動小数点数) メタグループ
メタグループは、グループ化された値の集合です.
例:
文法的には
特殊な場合(0メタグループ、1メタグループ).
メタグループは、一般に、単純なレコードまたは構造を表すために使用されます.
通常、これは複数の部分からなる単一のオブジェクトです.これには、メタグループがデータベース・テーブルのローのような良いクラス比があります.
メタグループの内容は秩序化されています(配列に似ています).
ただし、メタグループの内容は変更できません.
現在のメタグループに基づいて新しいメタグループを作成できます.
タプルパッケージ
メタグループの多くは、関連するアイテムをエンティティ(entity)にパッケージ化します.
その後、このメタグループは、プログラムの他の部分に単一のオブジェクトとして容易に渡されます.
タプル分解
他の場所でメタグループを使用するには、メタグループの各部分を変数に分解します.
左側の変数の数は、メタグループの構造と一致する必要があります.
タプルとリスト
メタグループは読み取り専用リストのように見えます.しかし、メタグループは、複数の部分からなる単項に最もよく用いられる.リストは通常、同じタイプのアイテムの集合です.
辞書
ディクショナリは、キーから値へのマッピングです.辞書はハッシュテーブル(hash table)または関連配列(associative array)とも呼ばれる場合がある.キーは、アクセス値のインデックスとして使用されます.
一般的な操作
辞書から値を取得するには、キー名を使用します.
値を追加または変更するには、キー名を使用して割り当てます.
値を削除するには、
どうして辞書を使いますか.
辞書は、多くの異なる値が存在し、これらの値を変更または操作する可能性がある場合に便利です.辞書はコードをより読みやすくします.
練習する
前回のいくつかの練習では、データファイル
ファイルの読み取りは簡単ですが、データの読み取りに比べて、通常はデータを使用してより多くのことをします.たとえば、保存して計算を実行したい場合があります.残念なことに、元のデータ「行」はそうはいきません.例えば、簡単な数学計算でもだめです.
より多くの操作を実行するには、通常、元のデータを何らかの方法で解釈し、後で処理するためにより有用なオブジェクトタイプに変換する必要があります.メタグループまたは辞書の2つの簡単な方法があります.
練習2.1:タプル
インタラクティブプロンプトで、前の行を表す次のメタグループを作成しますが、数値列を適切な数値に変換します.
この方法では、株式数に価格を乗じて総額を計算することができます.
Pythonでは、数学は役に立たないのですか?結果はなぜ3220億2千万円だったのか.
これはコンピュータ上の浮動小数点ハードウェアの生成物であり、10進数ではなくバイナリで小数点を正確に表すしかない.10進数小数に関する単純な計算でも、小さな誤差が導入されます.これは普通です.前に会ったことがなければ、少し驚くかもしれません.
浮動小数点を使用するすべてのプログラミング言語で発生しますが、印刷時に隠すことができます.たとえば、次のようにします.
メタグループは読み取り専用です.株式数を75に変更して検証することができます.
メタグループの内容は変更できませんが、古いメタグループを置き換えるために常に新しいメタグループを作成できます.
このように既存の変数名を再割り当てするたびに、古い値は破棄されます.上の割り当ては、メタグループを変更しているように見えますが、実際には新しいメタグループを作成し、古いメタグループを破棄します.
メタグループは、通常、値を変数にパッケージまたはパッケージ解除するために使用されます.次の操作を試してください.
上の変数を取り、メタグループにパッケージします.
練習2.2:辞書をデータ構造とする
メタグループの代わりに辞書を作成できます.
保有総額を計算するには、次の手順に従います.
この例を、前述したメタグループと同じ計算と比較して、株式数を75に変更します.
タプルとは異なり、辞書は自由に変更できます.いくつかの属性を追加します.
練習2.3:辞書のその他の操作
辞書をリストに変換すると、すべてのキーが取得されます.
同様に、
検索を同時に実行するバリエーションを使用してみます.
ここで、
これは元の辞書の上書きです.辞書が変更されても、現在の辞書のキーを常に提供します.たとえば、次の操作を試してみます.
より優雅にキーと値を一緒に使用する方法は、
目次 | 前のセクション(1.7関数) | 次節(2.2容器)
注:完全な翻訳はhttps://github.com/codists/practical-python-zhを参照
2.1データ型とデータ構造
このセクションでは、メタグループと辞書に代表されるデータ構造について説明します.
元のデータ型
Pythonには元のデータ型があります.
email_address = None
None
は、オプション値または欠落値のプレースホルダとしてよく使用されます.条件文ではFalse
として計算されます.if email_address:
send_email(email_address, msg)
データ構造
実際のプログラムはより複雑なデータを持っている.たとえば、株式の保有情報:
100 shares of GOOG at $490.10
これは、3つのセクションを含むオブジェクトです.
メタグループは、グループ化された値の集合です.
例:
s = ('GOOG', 100, 490.1)
文法的には
()
を省略する場合があります.s = 'GOOG', 100, 490.1
特殊な場合(0メタグループ、1メタグループ).
t = () # An empty tuple
w = ('GOOG', ) # A 1-item tuple
メタグループは、一般に、単純なレコードまたは構造を表すために使用されます.
通常、これは複数の部分からなる単一のオブジェクトです.これには、メタグループがデータベース・テーブルのローのような良いクラス比があります.
メタグループの内容は秩序化されています(配列に似ています).
s = ('GOOG', 100, 490.1)
name = s[0] # 'GOOG'
shares = s[1] # 100
price = s[2] # 490.1
ただし、メタグループの内容は変更できません.
>>> s[1] = 75
TypeError: object does not support item assignment
現在のメタグループに基づいて新しいメタグループを作成できます.
s = (s[0], 75, s[2])
タプルパッケージ
メタグループの多くは、関連するアイテムをエンティティ(entity)にパッケージ化します.
s = ('GOOG', 100, 490.1)
その後、このメタグループは、プログラムの他の部分に単一のオブジェクトとして容易に渡されます.
タプル分解
他の場所でメタグループを使用するには、メタグループの各部分を変数に分解します.
name, shares, price = s
print('Cost', shares * price)
左側の変数の数は、メタグループの構造と一致する必要があります.
name, shares = s # ERROR
Traceback (most recent call last):
...
ValueError: too many values to unpack
タプルとリスト
メタグループは読み取り専用リストのように見えます.しかし、メタグループは、複数の部分からなる単項に最もよく用いられる.リストは通常、同じタイプのアイテムの集合です.
record = ('GOOG', 100, 490.1) # A tuple representing a record in a portfolio
symbols = [ 'GOOG', 'AAPL', 'IBM' ] # A List representing three stock symbols
辞書
ディクショナリは、キーから値へのマッピングです.辞書はハッシュテーブル(hash table)または関連配列(associative array)とも呼ばれる場合がある.キーは、アクセス値のインデックスとして使用されます.
s = {
'name': 'GOOG',
'shares': 100,
'price': 490.1
}
一般的な操作
辞書から値を取得するには、キー名を使用します.
>>> print(s['name'], s['shares'])
GOOG 100
>>> s['price']
490.10
>>>
値を追加または変更するには、キー名を使用して割り当てます.
>>> s['shares'] = 75
>>> s['date'] = '6/6/2007'
>>>
値を削除するには、
del
文を使用します.>>> del s['date']
>>>
どうして辞書を使いますか.
辞書は、多くの異なる値が存在し、これらの値を変更または操作する可能性がある場合に便利です.辞書はコードをより読みやすくします.
s['price']
# vs
s[2]
練習する
前回のいくつかの練習では、データファイル
Data/portfolio.csv
を取得するプログラムが作成されました.csv
モジュールを使用すると、ファイルを行単位で簡単に読み取ることができます.>>> import csv
>>> f = open('Data/portfolio.csv')
>>> rows = csv.reader(f)
>>> next(rows)
['name', 'shares', 'price']
>>> row = next(rows)
>>> row
['AA', '100', '32.20']
>>>
ファイルの読み取りは簡単ですが、データの読み取りに比べて、通常はデータを使用してより多くのことをします.たとえば、保存して計算を実行したい場合があります.残念なことに、元のデータ「行」はそうはいきません.例えば、簡単な数学計算でもだめです.
>>> row = ['AA', '100', '32.20']
>>> cost = row[1] * row[2]
Traceback (most recent call last):
File "", line 1, in
TypeError: can't multiply sequence by non-int of type 'str'
>>>
より多くの操作を実行するには、通常、元のデータを何らかの方法で解釈し、後で処理するためにより有用なオブジェクトタイプに変換する必要があります.メタグループまたは辞書の2つの簡単な方法があります.
練習2.1:タプル
インタラクティブプロンプトで、前の行を表す次のメタグループを作成しますが、数値列を適切な数値に変換します.
>>> t = (row[0], int(row[1]), float(row[2]))
>>> t
('AA', 100, 32.2)
>>>
この方法では、株式数に価格を乗じて総額を計算することができます.
>>> cost = t[1] * t[2]
>>> cost
3220.0000000000005
>>>
Pythonでは、数学は役に立たないのですか?結果はなぜ3220億2千万円だったのか.
これはコンピュータ上の浮動小数点ハードウェアの生成物であり、10進数ではなくバイナリで小数点を正確に表すしかない.10進数小数に関する単純な計算でも、小さな誤差が導入されます.これは普通です.前に会ったことがなければ、少し驚くかもしれません.
浮動小数点を使用するすべてのプログラミング言語で発生しますが、印刷時に隠すことができます.たとえば、次のようにします.
>>> print(f'{cost:0.2f}')
3220.00
>>>
メタグループは読み取り専用です.株式数を75に変更して検証することができます.
>>> t[1] = 75
Traceback (most recent call last):
File "", line 1, in
TypeError: 'tuple' object does not support item assignment
>>>
メタグループの内容は変更できませんが、古いメタグループを置き換えるために常に新しいメタグループを作成できます.
>>> t = (t[0], 75, t[2])
>>> t
('AA', 75, 32.2)
>>>
このように既存の変数名を再割り当てするたびに、古い値は破棄されます.上の割り当ては、メタグループを変更しているように見えますが、実際には新しいメタグループを作成し、古いメタグループを破棄します.
メタグループは、通常、値を変数にパッケージまたはパッケージ解除するために使用されます.次の操作を試してください.
>>> name, shares, price = t
>>> name
'AA'
>>> shares
75
>>> price
32.2
>>>
上の変数を取り、メタグループにパッケージします.
>>> t = (name, 2*shares, price)
>>> t
('AA', 150, 32.2)
>>>
練習2.2:辞書をデータ構造とする
メタグループの代わりに辞書を作成できます.
>>> d = {
'name' : row[0],
'shares' : int(row[1]),
'price' : float(row[2])
}
>>> d
{'name': 'AA', 'shares': 100, 'price': 32.2 }
>>>
保有総額を計算するには、次の手順に従います.
>>> cost = d['shares'] * d['price']
>>> cost
3220.0000000000005
>>>
この例を、前述したメタグループと同じ計算と比較して、株式数を75に変更します.
>>> d['shares'] = 75
>>> d
{'name': 'AA', 'shares': 75, 'price': 32.2 }
>>>
タプルとは異なり、辞書は自由に変更できます.いくつかの属性を追加します.
>>> d['date'] = (6, 11, 2007)
>>> d['account'] = 12345
>>> d
{'name': 'AA', 'shares': 75, 'price':32.2, 'date': (6, 11, 2007), 'account': 12345}
>>>
練習2.3:辞書のその他の操作
辞書をリストに変換すると、すべてのキーが取得されます.
>>> list(d)
['name', 'shares', 'price', 'date', 'account']
>>>
同様に、
for
文を使用して辞書を反復すると、そのすべてのキーが得られる.>>> for k in d:
print('k =', k)
k = name
k = shares
k = price
k = date
k = account
>>>
検索を同時に実行するバリエーションを使用してみます.
>>> for k in d:
print(k, '=', d[k])
name = AA
shares = 75
price = 32.2
date = (6, 11, 2007)
account = 12345
>>>
keys()
の方法を使用して、すべてのキーを取得することもできます.>>> keys = d.keys()
>>> keys
dict_keys(['name', 'shares', 'price', 'date', 'account'])
>>>
ここで、
keys()
は少し異なり、dict_keys
オブジェクトを返します.これは元の辞書の上書きです.辞書が変更されても、現在の辞書のキーを常に提供します.たとえば、次の操作を試してみます.
>>> del d['account']
>>> keys
dict_keys(['name', 'shares', 'price', 'date'])
>>>
d.keys()
は再度呼び出されていませんが、キー'account'
は消えています.より優雅にキーと値を一緒に使用する方法は、
items()
の方法を使用することである.これにより、キー値からなる要素群(key, value)
を得ることができる.>>> items = d.items()
>>> items
dict_items([('name', 'AA'), ('shares', 75), ('price', 32.2), ('date', (6, 11, 2007))])
>>> for k, v in d.items():
print(k, '=', v)
name = AA
shares = 75
price = 32.2
date = (6, 11, 2007)
>>>
items
のようなメタグループがある場合は、dict()
関数を使用して辞書を作成できます.次の操作を試してください.>>> items
dict_items([('name', 'AA'), ('shares', 75), ('price', 32.2), ('date', (6, 11, 2007))])
>>> d = dict(items)
>>> d
{'name': 'AA', 'shares': 75, 'price':32.2, 'date': (6, 11, 2007)}
>>>
目次 | 前のセクション(1.7関数) | 次節(2.2容器)
注:完全な翻訳はhttps://github.com/codists/practical-python-zhを参照