Pythonの真髄はなんと角カッコ、花カッコ、丸カッコであることが十数年もかかってやっと分かった.


文書ディレクトリ
  • 1. かっこ
  • 1.1作成リスト
  • 1.2リストのインデックス
  • 1.3リストのメソッド
  • 2. かっこ
  • 2.1は、1つのキーが辞書に存在するか否かを判断する
  • .
  • 2.2辞書に新しいキーを追加するか、またはキー値を更新する
  • .
  • 2.3辞書からキー値
  • を取得する
  • 2.4辞書の全キー、全値、全キー値対
  • を取得する.
  • 2.5辞書
  • を巡る
  • 3. かっこ
  • 3.1必ず入る浅い穴
  • 3.2必ず入る深い穴
  • 3.3単星号解包元群
  • 3.4なぜメタグループを使用するのですか?

  • 他のプログラミング言語と比べて、Pythonの唯一無二の特色は何ですか?多くのプログラマーは、インデントと言います.確かに、インデントはPython言語のシンボル的な特徴ですが、これは外在的で形式的なものにすぎません.言語特性の面から言えば、Pythonの特徴は何ですか?最も代表的な答えは文法が簡潔で、簡単で学びやすく、コードが効率的で、機能が強いなどの4つです.この4つをよく味わうと、Python言語が表現した使用効果やユーザーの感覚であり、依然として言語特性の面での特色ではないと思います.
    言い換えれば、Pythonのどの言語特性がPythonに文法が簡潔で、簡単で学びやすく、コードが効率的で、機能が強いと一般的に考えられているのだろうか.個人的には、リスト(list)、辞書(dict)、メタグループ(tuple)、集合(set)という「四大金剛」のおかげだと思います.整数型(int)、浮動小数点型(float)、文字列(str)も重要であるが、この3つのオブジェクトは他のプログラミング言語に比べて「4大金剛」ほど明らかではない.リスト、辞書、メタグループ、集合はPython言語の核心と基礎を代表し、Pythonの精髄でもあると言っても過言ではない.リスト、辞書、メタグループ、集合をマスターすることは、Pythonというプログラミング言語を身につけることを意味します.
    この観点を認めれば、Pythonの真髄はリスト、辞書、元組、集合などの「四大金剛」から、角カッコ、花カッコ、丸カッコからなる「かっこ族」に変化する.
    1.かっこ
    角カッコはほとんどのプログラミング言語の最初の記号です.ここでの第一に、使用頻度ではなく、この記号が示すプログラミング言語の内包と創造力を指す.実際、記号の使用頻度については、カッコが1位になる可能性があります.ただ、私の直感では、統計データのサポートはありません.
    1.1リストの作成
    初心者にとって、リストを作成する最も一般的な方法は、相手のカッコを使うことです.
    >>> a = []
    >>> a
    []
    >>> b = [3.14, False, 'x', None]
    >>> b
    [3.14, False, 'x', None]
    

    古い鳥でも、特に導出式を使用してリストを作成する場合、四角カッコを使用してリストを大量に作成します.
    >>> c = [i**2 for i in range(5)]
    >>> c
    [0, 1, 4, 9, 16]
    

    しかし、私はずっと、角カッコは口語やスラングのように、勝手すぎると思っています.厳密なlist()を使用してリストを作成するのが好きです.リスト()を使用してリストを作成することは、リストクラスのインスタンス化の標準的な方法であり、リストクラスの構造関数が異なるタイプのパラメータにどのように適応するかを体得することができます.
    >>> a = list()
    >>> a
    []
    >>> b = list((3.14, False, 'x', None))
    >>> b
    [3.14, False, 'x', None]
    >>> c = list({1,2,3})
    >>> c
    [1, 2, 3]
    >>> d = list({'x':1,'y':2,'z':3})
    >>> d
    ['x', 'y', 'z']
    >>> e = list(range(5))
    >>> e
    [0, 1, 2, 3, 4]
    >>> f = list('*'*i for i in range(5))
    >>> f
    ['', '*', '**', '***', '****']
    

    1.2リストの索引
    角カッコはリストを作成できますが、角カッコはリストに等しくありません.角カッコはインデックスにも使用されるためです.
    >>> [3.14, False, 'x', None][2]
    'x'
    >>> [3.14, False, 'x', None][-2]
    'x'
    >>> [3.14, False, 'x', None][1:]
    [False, 'x', None]
    >>> [3.14, False, 'x', None][:-1]
    [3.14, False, 'x']
    >>> [3.14, False, 'x', None][::2]
    [3.14, 'x']
    >>> [3.14, False, 'x', None][::-1]
    [None, 'x', False, 3.14]
    
    

    リストのインデックスは非常に柔軟で、特に負数インデックスが導入され、最後の要素や逆シーケンスを-1で表すのは喜大普奔です.上の操作は、一般的なインデックス方式に属し、下のコードを読み取ることができれば、十分な機能を備えていることを示しています.
    >>> a = [3.14, False, 'x', None]
    >>> a[2:2] = [1,2,3]
    >>> a
    [3.14, False, 1, 2, 3, 'x', None]
    

    1.3リストの方法
    リスト対象の方法を手当たり次第に手に入れることができれば、Pythonの達人です.
    >>> a = [3.14, False, 'x', None]
    >>> a.index('x')
    2
    >>> a.append([1,2,3])
    >>> a
    [3.14, False, 'x', None, [1, 2, 3]]
    >>> a[-1].insert(1, 'ok')
    >>> a
    [3.14, False, 'x', None, [1, 'ok', 2, 3]]
    >>> a.remove(False)
    >>> a
    [3.14, 'x', None, [1, 'ok', 2, 3]]
    >>> a.pop(1)
    'x'
    >>> a
    [3.14, None, [1, 'ok', 2, 3]]
    >>> a.pop()
    [1, 'ok', 2, 3]
    >>> a
    [3.14, None]
    

    2.かっこ
    カッコは辞書のオブジェクトを表し、多くの初心者がそう思っています.しかし、これは間違いであり、少なくとも一面的である.次のコードでは、aとbはカッコで作られたオブジェクトですが、1つは辞書で、1つは集合です.
    >>> a = {}
    >>> a
    {}
    >>> b = {'x','y','z'}
    >>> b
    {'y', 'z', 'x'}
    >>> type(a)
    <class 'dict'>
    >>> type(b)
    <class 'set'>
    

    もともと、Pythonは辞書と集合の2つのオブジェクトをカッコで表していました.カッコ内が空いているか、キー値が合っているか、辞書を表しています.カッコ内には重複要素がなく、集合を表します.誤解を起こさないためにdict()で辞書を生成しset()で集合を生成することに慣れています.
    >>> dict()
    {}
    >>> dict({'x':1, 'y':2, 'z':3})
    {'x': 1, 'y': 2, 'z': 3}
    >>> dict((('x',1), ('y',2), ('z',3)))
    {'x': 1, 'y': 2, 'z': 3}
    >>> dict.fromkeys('xyz')
    {'x': None, 'y': None, 'z': None}
    >>> dict.fromkeys('abc', 0)
    {'a': 0, 'b': 0, 'c': 0}
    >>> set((3,4,5))
    {3, 4, 5}
    >>> set({'x':1, 'y':2, 'z':3})
    {'y', 'z', 'x'}
    >>> set([3,3,4,4,5,5])
    {3, 4, 5}
    

    符号化の実践では,場合によっては集合はかけがえのないものであるが,集合の使用頻度は「四大金剛」の中で最も低く,ここでは議論を展開せず,辞書の使用技術だけを述べる.
    2.1キーが辞書に存在するかどうかを判断する
    Py 2時代、dictの対象にhasがあった.キー()のメソッドは、キーが含まれているかどうかを判断するために使用されます.py 3はこの方法を捨てて,1つのキーが辞書に存在するか否かを判断するには,inという方法しか用いられない.
    >>> a = dict({'x':1, 'y':2, 'z':3})
    >>> 'x' in a
    True
    >>> 'v' in a
    False
    

    2.2辞書に新しいキーを追加するか、キー値を更新する
    多くの人は辞書のキーに値を割り当てる方法で、辞書に新しいキーを追加したり、キー値を更新したりするのが好きです.
    >>> a = dict()
    >>> a['name'] = 'xufive'
    >>> a
    {'name': 'xufive'}
    

    このような方法はお勧めしませんが、update()を使うともっと儀式的で、一度に複数のキーを追加したり修正したりすることができます.
    >>> a = dict()
    >>> a.update({'name':'xufive', 'gender':' '})
    >>> a
    {'name': 'xufive', 'gender': ' '}
    

    2.3辞書からキー値を取得する
    a[‘age’]は最も一般的な方法であるが,キーが存在しない異常にも遭遇する.以下の方法はお勧めです.
    >>> a.get('age', 18)
    18
    

    2.4辞書のすべてのキー、すべての値、すべてのキーの値のペアを取得する
    dictクラスはkeys()、values()、items()の3つの方法で、辞書のすべてのキー、すべての値、およびすべてのキー値のペアを返します.返される結果はリストではなく反復器であることに注意してください.リスト形式の戻り結果が必要な場合はlist()変換を使用します.
    >>> a = dict()
    >>> a.update({'name':'xufive', 'gender':' '})
    >>> list(a.keys())
    ['name', 'gender']
    >>> list(a.values())
    ['xufive', ' ']
    >>> list(a.items())
    [('name', 'xufive'), ('gender', ' ')]
    

    2.5辞書の遍歴
    辞書を巡るとき、多くの学生や辞書を巡るkeys()と書く.実は、そんなに面倒な必要はありません.次のように直接遍歴することができます.
    >>> a = dict([('name', 'xufive'), ('gender', ' ')])
    >>> for key in a:
    		print(key, a[key])
    	
    name xufive
    gender  
    

    3.かっこ
    カッコはタプルオブジェクトを表しますが、これは問題ないのではないでしょうか.確かに、問題はありませんが、メタグループの使用では、初心者一人一人が同じ深い穴に少なくとも1回落ちると信じています.
    3.1必ず入る浅い穴
    メタグループがリストに使用されない最も顕著な特徴は、要素の値を更新できないことです.それを忘れたり無視したりすると、穴に入ります.
    >>> a = (3, 4)
    >>> a[0] = 5
    Traceback (most recent call last):
      File "", line 1, in <module>
        a[0] = 5
    TypeError: 'tuple' object does not support item assignment
    

    3.2必ず入る深い穴
    何年もPythonを使ってから、私が書いた最悪のバグは、次のコードです.
    >>> import threading
    >>> def do_something(name):
    		print('My name is %s.'%name)
    	
    >>> th = threading.Thread(target=do_something, args=('xufive'))
    >>> th.start()
    Exception in thread Thread-1:
    Traceback (most recent call last):
      File "C:\Users\xufive\AppData\Local\Programs\Python\Python37\lib\threading.py", line 926, in _bootstrap_inner
        self.run()
      File "C:\Users\xufive\AppData\Local\Programs\Python\Python37\lib\threading.py", line 870, in run
        self._target(*self._args, **self._kwargs)
    TypeError: do_something() takes 1 positional argument but 6 were given
    

    私は明らかに1つのパラメータしか提供していませんが、6つのパラメータが与えられたとヒントを与えました.なぜですか.元々、メタグループの初期化では、単一のパラメータしかない場合は、単一のパラメータの後にカンマ(,)を追加する必要があります.そうしないと、初期化結果は元のパラメータのみが返されます.
    >>> a = (5)
    >>> a
    5
    >>> type(a)
    <class 'int'>
    >>> b = ('xyz')
    >>> b
    'xyz'
    >>> type(b)
    <class 'str'>
    >>> a, b = (5,), ('xyz',)
    >>> a, b
    ((5,), ('xyz',))
    >>> type(a), type(b)
    (<class 'tuple'>, <class 'tuple'>)
    

    3.3単一アスタリスクのグループ解除
    出力文字列をフォーマットするとき、C言語スタイルが一番好きです.複数の%が一致する必要がある場合、以下は最も自然な書き方かもしれません.
    >>> args = (95,99,100)
    >>> '%s:  %d ,  %d ,  %d '%('    ', args[0], args[1], args[2])
    '    :  95 ,  99 ,  100 '
    

    正しいのは正しいが,すばらしくない.満点の書き方はこんなはずです.
    >>> args = (95,99,100)
    >>> '%s:  %d ,  %d ,  %d '%('    ', *args)
    '    :  95 ,  99 ,  100 '
    

    3.4なぜタプルを使用するのですか.
    メタグループの要素が変更できない以上、なぜメタグループを使用するのでしょうか.タプルの代わりにリストを使うほうが便利ではないでしょうか.確かに、多くの場合、メタグループの代わりにリストを使用することができますが、次の例では、メタグループの代わりにリストを使用することはできません.
    >>> s = {1,'x',(3,4,5)}
    >>> s
    {1, (3, 4, 5), 'x'}
    >>> s = {1,'x',[3,4,5]}
    Traceback (most recent call last):
      File "", line 1, in <module>
        s = {1,'x',[3,4,5]}
    TypeError: unhashable type: 'list'
    

    メタグループをセットに追加できますが、リストはハッシュできないため、リストはできません.この点を理解するのは難しくありません.リスト要素は動的に変更できるので、一定のハッシュ値はありません.これは集合が要求する要素の一意性と衝突します.メタグループの要素は更新を禁止され、ハッシュ値はライフサイクル全体で変化しないため、集合の要素になることができます.
    明らかに、メタグループとリストの所有者はまったく異なるストレージ方式を持っている.更新の問題を考慮する必要がないため、メタグループの速度性能はリストよりはるかに優れている.メタグループを優先的に使用することは、Pythonプログラマーが従う基本原則になるはずです.