以下のエディターは、Python の基本を始めるために必読の操作を提供します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう
ここでは Python での開発で一般的に使用される方法とテクニックを紹介します。間違いがあれば、批判して修正してください。
重要なポイント: 開発中のクラスと変数の特性のクエリ、型はクラス、アサーションの使用、深いコピーと浅いコピーの判断など
Python スクリプト ファイルは UTF-8 を使用してエンコードされているため、中国語の文字を見つけた場合文字化けしている場合は、UTF-8 でエンコードされたテキスト ファイルかどうかを検討する必要があります。
別のエンコーディングを指定したい場合は、ソース コード ファイルの先頭に次のコメントを追加する必要があります:
# -*- coding: utf-8 -*-
Python が Linux および UNIX システムで実行されている場合は、次を追加する必要があります:
Pythonで各モジュール、変数、クラスなどの内容を取得するにはどうすればよいですか?
Python のヘルプ グループに関するクエリは、変数 __all__、__dict__、関数 help()、dir() を通じて取得できます。
__all__ がクラスまたはモジュールで定義されている場合、通常、割り当てなしで定義されている場合は、アンダースコアで始まらない機能が自動的に埋め込まれます。パラメーターがない場合、__all__python は AttributeError 属性エラーを表示します。
__dict__ は通常、クラスまたはモジュールで定義された特性 (属性やメソッドを含む) を与え、パラメーターとパラメーター値 (パラメーター、パラメーター値、または説明) を表すタプルを使用した辞書の形式で出力されます
list __dict__ View
#!/usr/bin/python3
dir() は、値や属性の説明なしで、利用可能なすべての機能属性をリストの形式で提供します:
list を表示するには dir() を使用します
>>> list.__dict__ 2 mappingproxy({'__repr__': <slot wrapper '__repr__' of 'list' objects>, '__hash__': None, '__getattribute__': <slot wrapper '__getattribute__' of 'list' objects>, '__lt__': <slot wrapper '__lt__' of 'list' objects>, '__le__': <slot wrapper '__le__' of 'list' objects>, '__eq__': <slot wrapper '__eq__' of 'list' objects>, '__ne__': <slot wrapper '__ne__' of 'list' objects>, '__gt__': <slot wrapper '__gt__' of 'list' objects>, '__ge__': <slot wrapper '__ge__' of 'list' objects>, '__iter__': <slot wrapper '__iter__' of 'list' objects>, '__init__': <slot wrapper '__init__' of 'list' objects>, '__len__': <slot wrapper '__len__' of 'list' objects>, '__getitem__': <method '__getitem__' of 'list' objects>, '__setitem__': <slot wrapper '__setitem__' of 'list' objects>, '__delitem__': <slot wrapper '__delitem__' of 'list' objects>, '__add__': <slot wrapper '__add__' of 'list' objects>, '__mul__': <slot wrapper '__mul__' of 'list' objects>, '__rmul__': <slot wrapper '__rmul__' of 'list' objects>, '__contains__': <slot wrapper '__contains__' of 'list' objects>, '__iadd__': <slot wrapper '__iadd__' of 'list' objects>, '__imul__': <slot wrapper '__imul__' of 'list' objects>, '__new__': <built-in method __new__ of type object at 0x000000005BBAF530>, '__reversed__': <method '__reversed__' of 'list' objects>, '__sizeof__': <method '__sizeof__' of 'list' objects>, 'clear': <method 'clear' of 'list' objects>, 'copy': <method 'copy' of 'list' objects>, 'append': <method 'append' of 'list' objects>, 'insert': <method 'insert' of 'list' objects>, 'extend': <method 'extend' of 'list' objects>, 'pop': <method 'pop' of 'list' objects>, 'remove': <method 'remove' of 'list' objects>, 'index': <method 'index' of 'list' objects>, 'count': <method 'count' of 'list' objects>, 'reverse': <method 'reverse' of 'list' objects>, 'sort': <method 'sort' of 'list' objects>, '__doc__': "list() -> new empty list\nlist(iterable) -> new list initialized from iterable's items"})
全般一般的に言えば、__dict__ と dir() を使用するだけです。 もちろん、詳細なドキュメント (実際には __doc__ の内容) を表示するには help() も必要になることがよくあります。ここでオブジェクト a = list() を作成し、オブジェクト a の特徴的なメソッドを取得したいので、 dir() と help() も使用します。
ここで強調する必要があるのは、dir() と help() の機能により、クラスだけでなく、定義した変数もチェックできるということです。こうすることで、エンコード処理中により多くのコンテンツを取得できます。
a=1 Python で dir()、help()、__all__、__dict__ を使用することに加えて、オリジナルを確認してください。 デザインのコンテンツを定義することに加えて、多くの定義された機能を使用して詳細情報を取得できます:
1 >>> dir(list) 2 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
上記により、クラスが型の場合、それが実際にはクラスの定義であることがコードでわかりました。それ以外の場合、それはオブジェクトです。
Pythonの基本的な変数もオブジェクトであると考えたことがありますか?
一般的な言語では、型は整数、浮動小数点型、文字列などに分類されます。しかし、Python では、これらの型は実際にはクラスの形式で定義され、クラスは最上位のスーパークラスも継承します。 型を表示するには __class__ を使用し、スーパー クラスを表示するには __bases__ を使用しますhelp(list) Help on class list in module builtins: class list(object) | list() -> new empty list | list(iterable) -> new list initialized from iterable's items | | Methods defined here: | | __add__(self, value, /) | Return self+value. | | __contains__(self, key, /) | Return key in self. | | __delitem__(self, key, /) | Delete self[key]. | | __eq__(self, value, /) | Return self==value. | | __ge__(self, value, /) | Return self>=value. | | __getattribute__(self, name, /) | Return getattr(self, name). | | __getitem__(...) | x.__getitem__(y) <==> x[y] | -- More --
いいえ、使用する型は実際にはクラスであり、クラス int を継承する bool を除き、他の型はスーパー クラス オブジェクトを継承します。オブジェクト クラスにはスーパークラスがありません。 type は type クラスであると言うべきです。もちろん、None 型は NoneType ですが、NoneType はクラスではありません。これは、None が null 値であることを意味します。
>>> a=1
>>> dir(a)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__pmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floorp__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rpmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloorp__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruep__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truep__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> help(a)
Help on int object:
class int(object)
| int(x=0) -> integer
| int(x, base=10) -> integer
|
| Convert a number or string to an integer, or return 0 if no arguments
| are given. If x is a number, return x.__int__(). For floating point
| numbers, this truncates towards zero.
|
| If x is not a number or if base is given, then x must be a string,
| bytes, or bytearray instance representing an integer literal in the
| given base. The literal can be preceded by '+' or '-' and be surrounded
| by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.
| Base 0 means to interpret the base from the string as an integer literal.
| >>> int('0b100', base=0)
| 4
|
| Methods defined here:
|
| __abs__(self, /)
| abs(self)
|
| __add__(self, value, /)
| Return self+value.
|
| __and__(self, value, /)
| Return self&value.
|
-- More --
is と id() を使用すると、変数間の隠れた関係を確認できます。
Python には弱い型の便利な機能があることは誰もが知っています。もちろん、Python では、同じ値を持つ変数は 1 つだけです。どうしてこれなの?これは、これらの変数がすべて同じメモリ アドレスを指しているためです。これらの変数への割り当ては、それらが指すメモリ アドレスを 1 つずつ変更しているだけであると考えることができます。 !
ポインターの観点から Python を理解すると役立ちます。これを理解できれば、変数自体がポインタを格納するため、Python の変数とメモリの再利用メカニズムを簡単に理解して使用することができます。
Python で関連する現象を詳しく説明しましょう:
1. Python では A と B は同じオブジェクトですが、A に値が代入されると、A と B は再び同じオブジェクトになります。 Python では、A が指すアドレスを、B のアドレスとは異なる別のオブジェクトのアドレスに変更します。B のアドレスによって生じるオブジェクトの値は、A の代入には影響されません。
2.python中同一个对象所具有的id可能是不同的,因为在没有指向该地址的变量时,python内存自动清理会清理掉这个对象。再次使用到具有相同数值的对象可能是在前一个对象自动清理之后创建的新对象。
针对第一个情况我们首先通过对True和False和数字来确定哪些值对象的id是系统自带的,即便这些值对象不被变量使用python内存清理也不会清理这些对象!
通过id来判断数值和布尔值中的值对象是否是系统自带的对象
>>> id(True) 1538937056 >>> id(False) 1538937088 >>> id(False) - id(True) 32 >>> id(-5) 1539416992 >>> id(-6) 1667933956912 >>> id(-4) 1539417024 >>> id(-4)-id(-5) 32 >>> id(-3)-id(-4) 32 >>> id(-3) 1539417056 >>> id(-2) 1539417088 >>> id(-2) - id(-3) 32 >>> id(255) 1539425312 >>> id(256) 1539425344 >>> id(256) - id(255) 32 >>> id(257) 1667904611440 >>> id(1.0) 1667904643192
你会发现数字-5到256是连续的,他们相邻的id值相差是32,意思是他们是32表示的数值。id返回的值就是他们在python中逻辑内存地址的值,在不同python进程中这些相同值对象返回的id值是一致的。而小于-5或者大于256的数值,小数,超过单个字符的字符串都是python在用户使用时创建的值对象,在不同的python进程中相同的值的id是不同的!其他值在不使用时有的就会被python内存清理程序清理掉释放内存!
当然,python中还有很多对象、类、函数等是python自创建的不会因为不使用而被内存清理程序清理掉。比如 int,None,dict,list。
不够值得一提的是 None is None是返回True 。并且id(None)的返回值是1538983120。这说明与其他脚本(比如javascript)不一样,None是空值,是一个唯一的空值对象,程序中所有的None都是相等的。都是同一个内存地址中存放的值。
很多情况下,我们想判断两个变量是否指向同一个内存地址块存放的值,可以使用is来判断。
python中对于全局变量,局部变量,外部变量有着额外的处理方式
如果一个函数中定义了与外部名称相同的变量,在函数内部如何能够获得外部定义的变量呢?在其他语言中,我们都知道局部变量会覆盖掉同名的外部变量。而在python中虽然也是这个逻辑,但是他提供了 3个函数来使得我们能够获得不同作用域中定义的同名的变量值。
globals()获取所有全局变量值
locals()获取所有局部变量值
nonlocals()获取所有外部变量值(因为python是支持函数嵌套的,内部函数如果想要获得外部函数局部变量的值可以使用这个)
在局部变量中获取全局变量中同名变量
>>> a = 234 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 234} >>> def s(): ... a = 'hello' ... print(locals()) ... >>> s() {'a': 'hello'} >>> def u(): ... a = 'world' ... c = globals()['a'] ... print(c) ... >>> u() 234
如上面代码显示的,在函数u()中a的值是‘world'而在全局变量中a的值是234,函数s()中局部变量a的值是'hello'通过globals()[变量名]就可以获得全局变量中同名的变量的值。
局部改变上段代码中同名的全局变量值
>>> def e(): ... a = 'sdf' ... globals()['a'] = a ... >>> e() >>> a 'sdf' >>>
以上がPythonを始めるための基本操作(必読)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。