ホームページ  >  記事  >  バックエンド開発  >  Python について話しましょう 8 部構成のエッセイ

Python について話しましょう 8 部構成のエッセイ

WBOY
WBOY転載
2023-04-13 15:10:034390ブラウズ

同志の皆さん、今日は Python の基本的な問題を復習します。Python はインタープリタ型言語であり、その効率が他の言語よりも低いことは誰もが知っています。この低い速度は、動作中にわずかに低いだけです。 、しかし、多くのシナリオでは、これらを購入するのは簡単です

構文を理解して習得するのが簡単なため、より多くの作業を短時間で完了でき、開発効率も向上します。より高い

同時に、Pythonにはプログラムの開発に使用できるさまざまな既製のライブラリが付属しており、Pythonはメンテナンスも簡単です

Pythonは私たちに提供します非常に完全な基本コード ベースは、ネットワーク、ファイル、GUI、データベース、テキストなどの多数のコンテンツをカバーしています。これは、鮮やかに「バッテリー付き」と呼ばれています。 Python で開発されているため、多くの関数を最初から作成する必要はなく、既成の関数を使用するだけです。

Python には、組み込みライブラリに加えて、直接使用できるように他の人が開発したサードパーティ ライブラリも多数あります。もちろん、開発したコードが適切にカプセル化されていれば、他の人が使用できるサードパーティ ライブラリとして使用することもできます。

#Python ジェネレーターとは何ですか?

generator では、ジェネレーター オブジェクトを生成するには 2 つの方法があります。1 つはかっこを使用したリスト生成です。

g1 = (x for x in range(10) )

1 つは、関数定義に yield キーワードを含めることです。

#

def fib(max):
n, a, b = 0, 0, 1
while n < max:yield b
a, b = b, a + b
n = n + 1
return 'done'g2 = fib(8)

ジェネレーター オブジェクト g1 および g2 の場合、 next(g1) を通じて次の要素の値を継続的に取得できます。これ以上要素がない場合、エラー StopIteration

が報告されます。要素の値は、for ループを通じて取得することもできます。

ジェネレーターの利点は、大量のメモリを消費しないことです。使用するときに要素の値を計算するだけで済みます。

Python イテレータとは何ですか?

Python の for ループで使用できるものは iterable Iterable と呼ばれ、list/set/tuple/str/dict やその他のデータ構造とジェネレーターが含まれます。次のステートメントを使用して、オブジェクトが反復可能かどうかを判断します:

from collections import Iterableisinstance(x, Iterable)

イテレータ イテレータは、next() 関数によって呼び出すことができるジェネレータを指し、次の値が返されるまで継続的に次の値を返します。 StopIteration; これらはすべてイテレータですが、リストなどのデータ構造はイテレータではありません;

次のステートメントを通じてリストをイテレータに変えることができます:

iter([1,2,3,4,5])

ジェネレータはすべてイテレータですが、イテレータは必ずしもジェネレータであるとは限りません。

リストとタプルの違いは何ですか?

    リストは可変長ですが、タプルは不変です;
  • リスト内の要素の値は変更できますが、タプルは変更できません;
  • list のサポート Append、insert、remove、pop などのメソッドはタプルではサポートされていません

list と dict は Python でどのように実装されますか?

リスト: 基本的には順次リストですが、テーブルの拡張は毎回指数関数的であるため、データが動的に追加および削除されると、テーブルの物理構造は変化しません。頻繁に変更されると同時に、シーケンスの恩恵を受けることになります。テーブル トラバーサル (隅の添字とテーブル ヘッダーの物理アドレスを通じてターゲット要素の位置を計算する) の効率が高いため、Python のリストの全体的なパフォーマンスが向上します。比較的優れた

dict: 本質的にはシーケンシャルリストですが、各要素の格納場所のインデックスは挿入順序によって決定されるのではなく、キーによって動的に生成されますハッシュ アルゴリズムとその他のメカニズムを使用します。つまり、キーはハッシュによってハッシュ化され、値を格納する場所が生成され、その後格納されます。この値; したがって、dict のクエリ時間の計算量は O (1);

# したがって、dict のキーはハッシュ可能なオブジェクト、つまり不変型のみにすることができます;

マルチコア CPU は一緒に使用できますかPythonでマルチスレッドを使用していますか?

Python にはグローバル インタープリター ロック (GIL) と呼ばれるものがあり、これにより、複数のスレッドのうち 1 つだけが常に実行されるようになります。

スレッドの実行速度は非常に速いため、スレッドが並列に実行されていると誤解されますが、実際にはすべてのスレッドが順番に実行されます。 GIL レベルの処理後は、実行オーバーヘッドが増加します。

マルチコア タスクは、複数のプロセスを通じて実現できます。

py3 と py2 の違い

print は py3 の関数ですが、py2

py3 ファイルのデフォルトのエンコードは utf8 で、py2 ファイルのデフォルトのエンコードは ascii です。

py3 の str は Unicode 文字列で、py2 の str は次のとおりです。 bytes

py3 の range() は反復可能なオブジェクトを返し、py2 の range() はリストを返し、xrange() は反復可能なオブジェクトを返し、py3 の除算は float を返し、py2 の除算は int を返します

#変数オブジェクトと不変オブジェクト

変数オブジェクト: list、dict、set

不変オブジェクト: bool 、int、float、tuple、str...

反復子と反復可能オブジェクトの違い

反復可能オブジェクト クラスをカスタマイズする必要があります。 __iter__() マジック メソッド。範囲クラスとリスト クラスのインスタンス化されたオブジェクトはすべて反復可能オブジェクトです。

イテレータ クラスの場合、__iter__() および _ _next__() マジック メソッドをカスタマイズする必要があります。 iter() 関数を使用して、反復可能なオブジェクトのイテレータを作成します。

クロージャ

クロージャは、関数のセットを埋め込み、その内部にあります。関数は外部関数の変数またはパラメーターを使用し、その外部関数は内部関数を返します

可以保存外部函数内的变量,不会随着外部函数调用完而销毁

什么是装饰器?

装饰器是一个接收函数作为参数的闭包函数

它可以在不修改函数内部源代码的情况下,给函数添加额外的功能

import time
def calc_time(func):
def inner():
t1 = time.time()
func()
t2 = time.time()
print('cost time: {}s'.format(t2-t1))
return inner

什么是元类? 使用场景

元类是创建类的类,type还有继承自type的类都是元类

作用: 在类定义时(new, init)和 类实例化时(call) 可以添加自定义的功能

使用场景: ORM框架中创建一个类就代表数据库中的一个表,但是定义这个类时为了统一需要把里面的类属性全部改为小写,这个时候就要用元类重写new方法,把attrs字典里的key转为小写

GIL(Global Interpreter Lock)

全局解释器锁

全局解释器锁(Global Interpreter Lock)是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。

即便在多核处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程,常见的使用 GIL 的解释器有CPython与Ruby MRI。可以看到GIL并不是Python独有的特性,是解释型语言处理多线程问题的一种机制而非语言特性。

GIL的设计初衷?

单核时代高效利用CPU, 针对解释器级别的数据安全(不是thread-safe 线程安全)。首先需要明确的是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。

当Python虚拟机的线程想要调用C的原生线程需要知道线程的上下文,因为没有办法控制C的原生线程的执行,所以只能把上下文关系传给原生线程,同理获取结果也是线 程在python虚拟机这边等待。那么要执行一次计算操作,就必须让执行程序的线程组串行执行。

为什么要加在解释器,而不是在其他层?

展开 GIL锁加在解释器一层,也就是说Python调用的Cython解释器上加了GIL锁,因为你python调用的所有线程都是原生线程。原生线程是通过C语言提供原生接口,相当于C语言的一个函数。

你一调它,你就控制不了了它了,就必须等它给你返回结果。只要已通过python虚拟机 ,再往下就不受python控制了,就是C语言自己控制了。

加在Python虚拟机以下加不上去,只能加在Python解释器这一层。

GIL的实现是线程不安全?为什么?

python2.x和3.x都是在执行IO操作的时候,强制释放GIL,使其他线程有机会执行程序。

Python2.x Python使用计数器ticks计算字节码,当执行100个字节码的时候强制释放GIL,其他线程获取GIL继续执行。ticks可以看作是Python自己的计数器,专门作用于GIL,释放后归零,技术可以调整。

Python3.x Python使用计时器,执行时间达到阈值后,当前线程释放GIL。总体来说比Python3.x对CPU密集型任务更好,但是依然没有解决问题。

什么是 lambda 表达式?

简单来说,lambda表达式通常是当你需要使用一个函数,但是又不想费脑袋去命名一个函数的时候使用,也就是通常所说的匿名函数。

lambda表达式一般的形式是:关键词lambda后面紧接一个或多个参数,紧接一个冒号“:”,紧接一个表达式

什么是深拷贝和浅拷贝?

赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。

浅拷贝 copy.copy:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变)

深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}​

以上がPython について話しましょう 8 部構成のエッセイの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。