序文
最近のPythonは非常に人気があり、多くの企業がPythonプログラマーを募集しており、インターネット上のインタビューの質問は常に同じ方法でコピーして貼り付けられます。ここでは、ブロガーがPythonのインタビューの質問を自分で作成する予定です。私はそれを手に入れました、私はそれがかなり良いと思います、pythonが知っていなければならない知識ポイントのいくつか。それに対応して、私もpythonの道を進んでおり、より良いことをしようとしています。自分自身をテストしながら、他の言語から転送したXiaobaiや同僚をもっと助けたいと思っています。よろしければ、今後も続けていきます。インタビューの質問の長さを広げてください。基本では、pythonの基本についてのみ説明します。pythonの基礎では、オブジェクト指向の思考、文字列の操作、派生、インスタンス化、マルチスレッドとマルチプロセッシング、初期化など、pythonの特性を理解する必要があることは明らかです。
1. pythonで2つの変数の値を交換する方法は?
この質問では、pythonの特別な構文、つまりa、b = b、aをテストしました。この式は他の言語でも使用できず、pythonにのみ付属しています。
2.文字列の連結-2つの文字列を効率的に連結する方法は?
pythonでは、スプライシング文字列を「+」でスプライシングできることは誰もが知っていますが、スプライシングする文字列が多数(n)ある場合は「+」を使用するため、この方法は効率的ではありません、pythonは説明します文字列はpythonで不変であるため、プロセッサはメモリスペースをn-1回申請してからコピーします。したがって、スプライシングするときは、新しいメモリスペースを申請する必要があります。したがって、正解は.join(list)を使用することです。これは、メモリスペースを1回しか使用しないためです。
3.リスト= [a、a、a、1,2,3,4,5、A、B、C]抽出「12345」
このテストサイトでは、Pythonの解凍割り当ての知識ポイント、つまりa、b、c、* middle、e、f、g = list、* middle = [1,2,3,4,5]を調べます。解凍割り当てによってリストが抽出されることに注意してください。
4. Pythonオブジェクト指向?
クラスはオブジェクトの青写真とテンプレートであり、オブジェクトはクラスのインスタンスです。クラスは抽象的な概念であり、オブジェクトは具体的なものです。オブジェクト指向プログラミングの世界では、すべてがオブジェクトです。オブジェクトには属性と動作があります。各オブジェクトは一意であり、オブジェクトは特定のクラス(タイプ)に属している必要があります。共通の特性を持つ多数のオブジェクトの静的特性(属性)と動的特性(動作)を抽出すると、「クラス」と呼ばれるものを定義できます。
オブジェクト指向には、カプセル化、継承、および多態性という3つの柱があります。
5.メタクラスとは何ですか?
上記のように、Pythonのオブジェクトについて説明しました。メタクラスは、クラスを作成するために使用される「もの」です。クラスはメタクラスのインスタンスでもあります。Pythonでは、タイプを除いて、クラスまたはメタクラスのインスタンスです。タイプは実際には独自のメタクラスです。メタクラスの主な目的は、djangoのORMなどのAPIを作成することです。
6. python検索と一致の知識ポイントは何ですか?
検索と一致の両方がreモジュールにあります。一致は文字列の先頭にのみ一致します。文字列が先頭の通常の式と一致しない場合、一致は失敗し、関数はNoneを返します。検索は、一致するものが見つかるまで文字列全体に一致します。
7. pythonのディープコピーとシャローコピーの違いは何ですか?
浅いコピーはサブオブジェクトをコピーしないため、元のオブジェクトが変更され、そのサブオブジェクトも変更されます。一方、深いコピーはサブオブジェクトをコピーし、元のオブジェクトはそれ自体を変更せずに変更されます。詳細については、私の以前のブログ、pythonの深さのコピー、1分でマスターを参照してください
8.クラスの初期化:new()およびinit()?
- new()メソッドは、クラスが作成される前に呼び出される最終的なクラスオブジェクトをインスタンス化するために使用され、クラスの本体が実行された後に実行を開始します。
- init()メソッドは、クラスが作成された後に呼び出され、他の出力作業を実行します。
メタクラスを作成するときは、通常、init()またはnew()メソッドを定義するだけでよく、両方を定義する必要はありません。ただし、他のキーワードパラメータを受け入れる必要がある場合は、これら2つのメソッドを同時に提供し、対応するパラメータ署名を提供する必要があります。
9.クラスの初期化?
クラスBはクラスAを継承し、クラスB自体に基づいてクラスAのすべてのメソッドを呼び出すことができます。AとBが同時にinitを持っている場合、BはAのinitメソッドを上書きし、クラスAのメソッドは失敗します。
スーパー関数はクラスAの属性を呼び出すことができ、クラスBに同じ名前の属性がある場合、それらは同じ名前のクラスAの属性をオーバーライドします。ただし、関数を呼び出すときは、常に最初に独自の定義を探します。定義がない場合は、特定の親クラスで見つかるまで、ソケットへの継承チェーンをたどります。
superは初期化され、パラメーター値は親クラスのパラメーター値であるため、クラスBのinitパラメーターは親クラスAのinitメソッド以上である必要があります。
10.マルチスレッド?
マルチスレッドはプロセスのメモリスペースを共有できるため、グローバル変数の設定や、このグローバル変数を共有する複数のスレッドなど、複数のスレッド間の通信を実装するのは比較的簡単です。ただし、複数のスレッドがリソースを共有している場合、プログラムが失敗したり、クラッシュしたりする可能性があります。リソースが競合する複数のスレッドによって使用されている場合は、重要なリソースへのアクセスを保護する必要があります。そうしないと、銀行預金などの「混沌とした」状態になります。 100元の場合、最終的に100元未満が入金される可能性が高いです。複数のスレッドで得られるバランス状態は0であり、すべての操作で1を0に加算するため、誤った結果になります。この場合、ロックを使用できます。マルチスレッドは、Pythonインタープリターにgilロックがあるため、cpuのマルチコア特性を利用しません。スレッドを実行する前に、GILロックを取得する必要があります。その後、100バイトコードが実行されるたびに、インタープリターは自動的にGILロックを解放して、他のスレッドにチャンスを与えます。実施した。
11.Pythonメモリ管理?
Pythonは、内部で参照カウントを使用して、メモリ内のオブジェクトを追跡します。Pythonは、オブジェクトが持つ参照の数、つまり参照カウントを内部で記録します。オブジェクトが作成されると、参照カウントが作成されます。オブジェクトが不要になると、オブジェクトの値が作成されます。参照カウントが0の場合、ゴミ収集です。これらはすべて、Cのような手動の介入なしに自動的に実行されるため、プログラマーの効率とプログラムの堅牢性が向上します。
12. Pythonフィルターメソッド?
フィルタは、map、reduce、apply、zipなどの組み込み関数です。フィルタはC言語で実装されており、高速で強力な機能という利点があります。
SQLの
selectvalueと同様に、関数func()と一致しない値をフィルタリングするために使用されます!= 'a'はイテレーターと同等であり、ブール関数funcを呼び出してseqの各要素を反復します。戻り値はbool_seqであり、戻り値は真のシーケンス
- 最初のパラメーター:functionまたはNone、functionまたはNone
- 2番目のパラメーター:シーケンス、シーケンス
13.文字列のクエリ置換とは何ですか?
テストポイント:pythonの関数を見つけて置き換えます。
文字列の文字列が与えられた:
string = 'life is short, I use python'
# 返回的为0或正数时,为其索引号
>>> string.find('life')
string.replace('short','long')
# replace 将short替换为long
>life is long, I use python
14.ソートされたリストが与えられた場合、この機能を中断しますか?
この質問では、pythonでのシャッフル関数の使用法を調べます。
# random模块中的shuffle(洗牌函数)
import random
list = [1, 2, 3, 4]
random.shuffle(list)
print(list)
15.デコレーター?
デコレータは、ある関数を受け取り、別の関数を返す関数です。使用法は次のとおりです。
import time
from functools import wraps
def timethis(func):
'''
Decorator that reports the execution time.
'''
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end-start)
return result
return wrapper
@timethis
def countdown(n):
'''
Counts down
'''
while n > 0:
n -= 1
>>> countdown(100000)
countdown 0.008917808532714844
>>> countdown(10000000)
countdown 0.87188299392912”
16.辞書(またはリスト)の文字列が与えられた場合、指定された(上位N個の)最大値を見つけますか?最小?
この質問のテストポイントは、min()とmax()ではなく、pythonのheapqモジュールのnlargest()とnsmallest()です。これらの関数は両方とも、複雑な構造化データで使用されるキーワードパラメーターを受け取ることができます。
portfolio = [
{
'name': 'IBM', 'shares': 100, 'price': 91.1},
{
'name': 'AAPL', 'shares': 50, 'price': 543.22},
{
'name': 'FB', 'shares': 200, 'price': 21.09},
{
'name': 'HPQ', 'shares': 35, 'price': 31.75},
{
'name': 'YHOO', 'shares': 45, 'price': 16.35},
{
'name': 'ACME', 'shares': 75, 'price': 115.65}
]
# 参数3为最大的3个值(最小的3个值)
cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
# 上面代码在对每个元素进行对比的时候,会以price的值进行比较。
17. pythonはシングルトンモードを実装していますか?
この質問では、Pythonでのシングルトンモードの理解と適用をテストします。シングルトンモードを実現するには、次の4つの方法があります。
#方法1,实现__new__方法
#并在将一个类的实例绑定到类变量_instance上,
#如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
#如果cls._instance不为None,直接返回cls._instance
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
one = MyClass()
two = MyClass()
two.a = 3
print(one.a)
#3
#one和two完全相同,可以用id(), ==, is检测
print(id(one))
#29097904
print(id(two))
#29097904
print(one == two)
#True
print(one is two)
#True
print('----------------------方法2--------------------------')
#方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
#同一个类的所有实例天然拥有相同的行为(方法),
#只需要保证同一个类的所有实例具有相同的状态(属性)即可
#所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)
#可参看:http://code.activestate.com/recipes/66531/
class Borg(object):
_state = {
}
def __new__(cls, *args, **kw):
ob = super(Borg, cls).__new__(cls, *args, **kw)
ob.__dict__ = cls._state
return ob
class MyClass2(Borg):
a = 1
one = MyClass2()
two = MyClass2()
#one和two是两个不同的对象,id, ==, is对比结果可看出
two.a = 3
print(one.a)
#3
print(id(one))
#28873680
print(id(two))
#28873712
print(one == two)
#False
print(one is two)
#False
#但是one和two具有相同的(同一个__dict__属性),见:
print(id(one.__dict__))
#30104000
print(id(two.__dict__))
#30104000
print '----------------------方法3--------------------------'
#方法3:本质上是方法1的升级(或者说高级)版
#使用__metaclass__(元类)的高级python用法
class Singleton2(type):
def __init__(cls, name, bases, dict):
super(Singleton2, cls).__init__(name, bases, dict)
if not hasattr(cls, '_instance'):
cls._instance = None
def __call__(cls, *args, **kw):
if cls._instance is None:
cls._instance = super(Singleton2, cls).__call__(*args, **kw)
return cls._instance
class MyClass3(object):
__metaclass__ = Singleton2
one = MyClass3()
two = MyClass3()
two.a = 3
print(one.a)
#3
print(id(one))
#31495472
print(id(two))
#31495472
print(one == two)
#True
print(one is two)
#True
print '----------------------方法4--------------------------'
#方法4:也是方法1的升级(高级)版本,
#使用装饰器(decorator),
#这是一种更pythonic,更elegant的方法,
#单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
def singleton(cls, *args, **kw):
instances = {
}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return _singleton
@singleton
class MyClass4(object):
a = 1
def __init__(self, x=0):
self.x = x
one = MyClass4()
two = MyClass4()
two.a = 3
print(one.a)
#3
print(id(one))
#29660784
print(id(two))
#29660784
print(one == two)
#True
print(one is two)
#True
one.x = 1
print(one.x)
#1
print(two.x)
#1
18.フィボナッチシーケンスのジェネレーターを実現しますか?
この質問の鍵は、ジェネレーターのyieldキーワードが通常の関数をジェネレーター関数に変換することです。
def fib(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
yield a
def main():
for val in fib(20):
print(val)
if __name__ == '__main__':
main()
19.ストリングスプライシングを使用して、サブタイトルのスクロール効果を実現しますか?
import os
import time
def main():
content = '曹查理的python面试集-基础篇'
while True:
# 清理屏幕上的输出
os.system('cls') # os.system('clear')
print(content)
# 休眠200毫秒
time.sleep(0.2)
content = content[1:] + content[0]
if __name__ == '__main__':
main()
20.指定されたファイル名のサフィックスを返す関数を設計しますか?
この質問では、正規表現の簡単な知識のポイントを調べます。コードは次のように表示されます。
def get_suffix(filename, has_dot=False):
"""
获取文件名的后缀名
:param filename: 文件名
:param has_dot: 返回的后缀名是否需要带点
:return: 文件的后缀名
"""
pos = filename.rfind('.')
if 0 < pos < len(filename) - 1:
index = pos if has_dot else pos + 1
return filename[index:]
else:
return ''
総括する:
インターネットの巨人が好む才能の特徴:テクノロジーへの熱意、強力な技術的基盤の強さ、イニシアチブ、チームワークが得意、要約と思考が得意。どちらの会社であっても、高い同時実行性と高い可用性のテクノロジーと基盤を非常に重要視しているため、知識を過小評価しないでください。面接は双方向の選考プロセスですので、自分のパフォーマンスに合わない恐れのある態度で面接に行かないでください。同時に、給料だけでなく、この会社が本当に好きかどうか、本当に運動できるかどうかにも注意を払う必要があります。実際、私は自分自身の要約だけをたくさん書いてきましたが、必ずしもすべての人に当てはまるわけではありません。いくつかのインタビューの後、誰もがこれらの感情を抱くと信じています。
さらに、MySQL関連のインタビューやその他の関連知識ポイントがもっと必要な場合は、グループ1149778920をクリックして、自分で収集することができます。コード:QF、20年以上の企業インタビュー知識ポイントやさまざまな技術的なポイントを整理しました。以下は、皆様のお役に立てれば幸いです。