原文:『実用的なPythonプログラミング』02_01_Datatypes

9490 ワード

目次 | 前のセクション(1.7関数) | 次節(2.2容器)
2.1データ型とデータ構造
このセクションでは、メタグループと辞書に代表されるデータ構造について説明します.
元のデータ型
Pythonには元のデータ型があります.
  • 整数
  • 浮動小数点数
  • 文字列(テキスト)
  • 空のタイプ
    email_address = None
    Noneは、オプション値または欠落値のプレースホルダとしてよく使用されます.条件文ではFalseとして計算されます.
    if email_address:
        send_email(email_address, msg)

    データ構造
    実際のプログラムはより複雑なデータを持っている.たとえば、株式の保有情報:
    100 shares of GOOG at $490.10

    これは、3つのセクションを含むオブジェクトです.
  • 株の名称または記号(「GOOG」、文字列)
  • 株式数(100,整数)
  • 価格(490.10、浮動小数点数)
  • メタグループ
    メタグループは、グループ化された値の集合です.
    例:
    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を参照