関数に渡すパラメーターの数がわからない場合、たとえばリストやタプルを渡す場合、*args を使用します。
def func(*args): for i in args: print(i) func(3,2,1,4,7) 3 2 1 4 7
渡すべきキーワード引数の数がわからない場合は、**kwargs を使用してキーワード引数を収集します:
def func(**kwargs): for i in kwargs: print(i,kwargs[i]) func(a=1,b=2,c=7) a.1 b.2 c.7
コマンド os.remove(filename) または os.unlink(filename) を使用します。
Python で書かれたモジュールには、C からアクセスできます:
Module = = PyImport_ImportModule(“<modulename>”)
これは 2 つのオペランドを除算するために使用される床除算演算子です。結果は商となり、小数点前の数値のみが表示されます。
たとえば、10 // 5 = 2 および 10.0 // 5.0 = 2.0。
文字列の先頭のスペースは、文字列内の最初の非スペース文字の前に表示されるスペースです。
メソッド Istrip() を使用して文字列から削除します。
’ Data123 '.lstrip()
結果:
'Data123 ’
最初の文字列には先頭文字と接尾辞文字の両方が含まれており、 Istrip() は先頭のスペースを削除しますが、接尾辞のスペースを削除したい場合は、rstrip() メソッドを使用できます。
'Data123 '.rstrip() 'Data123'
a,b = 0, 1 while b<100: print (b) a, b = b, a+b
文字列に数字のみが含まれている場合は、関数 int() を使用して整数に変換できます。
int(‘22’)
変数の型を確認してみましょう:
type('22') <class'str'> type(int('22')) <class'int'>
乱数を生成するには、random モジュールから関数random()をインポートします。
from random import random random() 0.013501571090371978
関数 randint() を使用することもできます。この関数は、2 つのパラメーターを使用して間隔を表し、間隔内のランダムな整数を返します。
from random import randint randint(2,7) 4
最も簡単な方法は、capitalize() メソッドを使用することです。
'daxie'.capitalize() 'Daxie'
この問題には、isalnum() メソッドを使用できます。
'DATA123'.isalnum() True 'DATA123!'.isalnum() False
他の方法も使用できます:
'123'.isdigit()#检测字符串是否只由数字组成 True '123'.isnumeric()#只针对unicode对象 True 'data'.islower()#是否都为小写 True 'Data'.isupper()#是否都为大写 False
Python の接続は 2 つのシーケンスを接続することです。演算子を使用して完了します:
'22'+'33' ‘2233' [1,2,3]+[4,5,6] [1, 2,3, 4, 5, 6] (2,3)+(4) TypeError Traceback (most recent call last) <ipython-input-7-69a1660f2fc5> in <module> ----> 1 (2,3)+(4) TypeError: can only concatenate tuple (not "int") to tuple
(4) は整数とみなされているため、ここで実行中にエラーが発生します。変更して再実行してください。 :
(2,3)+(4,) (2, 3,4)
関数が呼び出し中に直接または間接的にそれ自体を呼び出す場合、それは再帰的です。ただし、無限ループを回避するには、終了条件が必要です。例:
def facto(n): if n==1: return 1 return n*facto(n-1) facto(5) 120
ジェネレーターは反復のために一連の値を生成するため、反復可能なオブジェクトです。
for ループ中に次の要素を継続的に計算し、適切な条件下で for ループを終了します。
値を 1 つずつ「生成」できる関数を定義し、for ループを使用してそれを反復処理します。
def squares(n): i=1 while(i<=n): yield i**2 i+=1 for i in squares(5): print(i) 1 4 9 16 25
イテレータは、コレクションの要素にアクセスする方法です。
イテレータ オブジェクトは、コレクションの最初の要素からアクセスを開始し、すべての要素がアクセスされるまで続きます。
反復子は前方にのみ進むことができ、後方には進むことができません。 inter() 関数を使用してイテレータを作成します。
odds=iter([1,2,3,4,5]) #每次想获取一个对象时,我们就调用next()函数 next (odds) 1 next (odds) 2 next (odds) 3 next (odds) 4 next (odds) 5
1) ジェネレーターを使用する場合は関数を作成し、イテレーターを使用する場合は組み込み関数 iter( ) と next();
2) ジェネレーターでは、キーワード ‘yield’ を使用して、毎回オブジェクトを生成/返します;
3) 「yield」はいくつありますかカスタマイズ可能なステートメント;
ジェネレーターは、ループが一時停止されるたびにローカル変数の状態を保存します。イテレータには反復するための反復可能なオブジェクトのみが必要であり、ローカル変数を使用する必要はありません。
5) クラスを使用して独自のイテレータを実装できますが、ジェネレータを実装することはできません;
6)ジェネレーターは高速に実行され、構文が簡潔で、よりシンプルです。
7) イテレーターはメモリを節約できます。
Python の初心者は、この関数にあまり詳しくないかもしれませんが、zip() はタプルのイテレータを返すことができます。
list(zip([‘a’,‘b’,‘c’],[1,2,3]))
[(‘a’,1 ), (‘b’, 2), (‘c’, 3)]
ここで、zip() 関数は 2 つのリスト内のデータ項目をペアにし、それらからタプルを作成します。
関数/メソッド getcwd() を使用して、モジュール os からインポートできます。
import os
os.getcwd()
‘C:\Users\37410\Desktop\code’
これも比較的単純で、長さを計算したい文字列に対して関数 len() を呼び出すだけです。
len(‘Data 123’)
8
リストから最後のオブジェクトまたは obj を削除して返します。
list.pop(obj = list [-1])
有时,当我们想要遍历列表时,一些方法会派上用场。
1)filter()
过滤器允许我们根据条件逻辑过滤一些值。
list(filter(lambda x:x> 5,range(8))) [6,7] 2)map()
Map将函数应用于iterable中的每个元素。
list(map(lambda x:x ** 2,range(8))) [0,1,4,9,16,25,36,49] 3)reduce()
在我们达到单个值之前,Reduce会反复减少序列顺序。
from functools import reduce reduce(lambda x,y:xy,[1,2,3,4,5]) -13
def list_sum(num_List):如果len(num_List)== 1: return num_List [0] else: return num_List [0] + list_sum(num_List [1:]) print(list_sum([3,4,5,6,11])) 29
import random def random_line(fname): lines = open(fname).read().splitlines() return random.choice(lines) print(random_line('test.txt'))
def file_lengthy(fname): open(fname)as f: for i,l in enumerate(f): pass return i + 1 print(“file of lines:”,file_lengthy(“test.txt”))
import os os.chdir('C:\Users\lifei\Desktop') with open('Today.txt') as today: count=0 for i in today.read(): if i.isupper(): count+=1 print(count)
以下代码可用于在Python中对列表进行排序:
list = ["1", "4", "0", "6", "9"] list = [int(i) for i in list] list.sort() print (list) Django有关
对于Django框架遵循MVC设计,并且有一个专有名词:MVT,
M全拼为Model,与MVC中的M功能相同,负责数据处理,内嵌了ORM框架;
V全拼为View,与MVC中的C功能相同,接收HttpRequest,业务处理,返回HttpResponse;
T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html,内嵌了模板引擎
Flask是一个“微框架”,主要用于具有更简单要求的小型应用程序。
Pyramid适用于大型应用程序,具有灵活性,允许开发人员为他们的项目使用数据库,URL结构,模板样式等正确的工具。
Django也可以像Pyramid一样用于更大的应用程序。它包括一个ORM。
Django架构
开发人员提供模型,视图和模板,然后将其映射到URL,Django可以为用户提供服务。
Django使用SQLite作为默认数据库,它将数据作为单个文件存储在文件系统中。
如过你有数据库服务器-PostgreSQL,MySQL,Oracle,MSSQL-并且想要使用它而不是SQLite,那么使用数据库的管理工具为你的Django项目创建一个新的数据库。
无论哪种方式,在您的(空)数据库到位的情况下,剩下的就是告诉Django如何使用它。
这是项目的settings.py文件的来源。
我们将以下代码行添加到setting.py文件中:
DATABASES ={‘default’: {‘ENGINE’: ‘django.db.backends.sqlite3’, ‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’),
这是我们在Django中使用write一个视图的方法:
from django.http import HttpResponse import datetime def Current_datetime(request): now =datetime.datetime.now() html ="<html><body>It is now %s</body></html>"%now return HttpResponse(html)
返回当前日期和时间,作为HTML文档。
模板是一个简单的文本文件。
它可以创建任何基于文本的格式,如XML,CSV,HTML等。
模板包含在评估模板时替换为值的变量和控制模板逻辑的标记(%tag%)。
Django提供的会话允许您基于每个站点访问者存储和检索数据。
Django通过在客户端放置会话ID cookie并在服务器端存储所有相关数据来抽象发送和接收cookie的过程。
所以数据本身并不存储在客户端。
从安全角度来看,这很好。
在Django中,有三种可能的继承样式:
抽象基类:当你只希望父类包含而你不想为每个子模型键入的信息时使用;
多表继承:对现有模型进行子类化,并且需要每个模型都有自己的数据库表。
代理模型:只想修改模型的Python级别行为,而无需更改模型的字段。
数据分析
map函数执行作为第一个参数给出的函数,该函数作为第二个参数给出的iterable的所有元素。
如果给定的函数接受多于1个参数,则给出了许多迭代。
我们可以使用下面的代码在NumPy数组中获得N个最大值的索引:
importnumpy as np arr =np.array([1, 3, 2, 4, 5]) print(arr.argsort()[-3:][::-1]) 4 3 1
Q86.如何用Python/ NumPy计算百分位数?
importnumpy as np a =np.array([1,2,3,4,5] p =np.percentile(a, 50) #Returns 50th percentile, e.g. median print(p) 3
1)Python的列表是高效的通用容器。
它们支持(相当)有效的插入,删除,追加和连接,Python的列表推导使它们易于构造和操作。
2)有一定的局限性
它们不支持元素化加法和乘法等“向量化”操作,可以包含不同类型的对象这一事实意味着Python必须存储每个元素的类型信息,并且必须在操作时执行类型调度代码在每个元素上。
3)NumPy不仅效率更高,也更方便
ベクトル演算や行列演算が大量に行われるため、不要な作業を回避できる場合があります。
4) NumPy 配列の方が高速です
NumPy、FFT、畳み込み、高速検索、基本統計、線形代数、ヒストグラムなどの組み込み関数を使用できます。
Python のデコレーターは、関数またはクラスのコードを変更または挿入するために使用されます。
デコレータを使用すると、元のコードの実行前または後にコードのセクションが実行されるように、クラスまたは関数のメソッド呼び出しをラップできます。
デコレータは、権限の確認、メソッドに渡されるパラメータの変更または追跡、特定のメソッドへの呼び出しの記録などに使用できます。
2) すべての数値コードは SciPy に存在します。それにもかかわらず、NumPy は依然として下位互換性の目標を維持しており、以前のバージョンでサポートされていたすべての機能を維持するよう努めています。
つまり、SciPy に属するのが適切ではありますが、NumPy には依然としていくつかの線形代数関数が含まれています。いずれにせよ、SciPy には、他のどのモジュールよりも包括的なバージョンの線形代数モジュールとその他の多くの数値アルゴリズムが含まれています。
科学技術計算に Python を使用する場合は、NumPy と SciPy をインストールすることをお勧めします。ほとんどの新機能は NumPy ではなく SciPy に属します。
Q90. NumPy/SciPy を使用して 3D プロット/視覚化を作成するにはどうすればよいですか?
Matplotlib は mplot3d サブパッケージで基本的な 3D プロットを提供し、Mayavi は強力な VTK エンジンを使用してさまざまな高品質 3D 視覚化機能を提供します。
クローラーと恐ろしいフレームワーク
Q91.scrapy とscrapy-redis の違いは何ですか?なぜ Redis データベースを選ぶのですか?
そして、scrapy-redis は、redis データベースに基づいており、scrapy フレームワーク上で実行される一連のコンポーネントであり、scrapy が分散戦略をサポートできるようにします。スレーバー側は、アイテム キュー、リクエスト キュー、およびリクエスト フィンガープリントを共有します。マスター側のredisデータベースを収集します。
redis はマスターとスレーブの同期をサポートしており、データはメモリにキャッシュされるため、redis に基づく分散クローラーは、リクエストとデータの高頻度の読み取りにおいて非常に効率的です。
Q92.どのようなクローラー フレームワークまたはモジュールを使用しましたか?
サードパーティ:requests
フレームワーク: Scrapy
urllib モジュールと urllib2 モジュールは両方ともリクエスト URL に関連する操作を実行します。ですが、提供する機能は異なります。
urllib2.: urllib2.urlopen は Request オブジェクトまたは URL を受け入れることができます (Request オブジェクトを受け入れる場合、URL のヘッダーを設定できます)。urllib.urlopen は URL のみを受け入れます
urllib urllib2 には urlencode がないため、常に urllib と urllib2 が一緒に使用されることがよくあります。
scrapy はカプセル化されたフレームワークであり、マルチスレッドに基づいたダウンローダー、パーサー、ログ、および例外処理が含まれています。
ツイスト方式は、固定の単一 Web サイトのクローリング開発には利点がありますが、複数の Web サイトで 100 の Web サイトをクローリングする場合、同時処理や分散処理の点で柔軟性が十分ではなく、調整や調整が不便です。拡大する。
request は HTTP ライブラリです。リクエストの作成のみに使用されます。HTTP リクエストの場合、強力なライブラリです。ダウンロードと解析はすべて自分で処理されます。柔軟性が高く、同時実行性が高く、分散展開が可能です。非常に柔軟性があり、機能をより適切に実装できます。
Q93. よく使用される mysql エンジンは何ですか?エンジン間の違いは何ですか?
1) InnoDB はトランザクションをサポートしますが、MyISAM はサポートしません。これは非常に重要です。トランザクションは高度な処理方法です。たとえば、一部の列の追加、削除、変更では、エラーがある限りロールバックして復元できますが、MyISAM ではそれができません。
MyISAM は詳細です。クエリおよび挿入ベースのアプリケーションに適していますが、InnoDB は頻繁な変更が必要で、より高度なセキュリティが必要なアプリケーションに適しています
3)InnoDB は外部キーをサポートしますが、MyISAM はサポートしません;
4) MyISAM はデフォルトのエンジンであり、InnoDB を指定する必要があります;
5) InnoDB は FULLTEXT タイプのインデックスをサポートしません;
6) InnoDB はテーブル内の行数を保存しません。 select count(*) from table このとき、InnoDB;
はテーブル全体をスキャンして行数を計算する必要がありますが、MyISAM は単に保存された行数を読み取るだけで済みます。
count(*) ステートメントに where 条件が含まれる場合、MyISAM はテーブル全体をスキャンする必要があることに注意してください;
7) 自己増加フィールドの場合、InnoDB にはインデックスのみが含まれている必要があります。ただし、MyISAM テーブルでは、他のフィールドと一緒に結合インデックスを確立できます。
8) テーブル全体をクリアする場合、InnoDB は行を 1 つずつ削除するため、効率が非常に遅くなります。 MyISAM はテーブルを再構築します;
9)InnoDB は行ロックをサポートしています (場合によってはテーブル全体がロックされます。たとえば、更新テーブル セット a=1 whereuser like ‘%lee%’
Q94. Scrapy フレームワークの動作メカニズムについて説明してください?
start_urls から URL の最初のバッチを取得してリクエストを送信します。リクエストはエンジンによってスケジューラに渡され、リクエスト キューに入力されます。取得が完了しました、
スケジューラはリクエストキュー内のリクエストをダウンローダに渡してリクエストに対応するレスポンスリソースを取得し、自身が作成した解析メソッドにレスポンスを渡して抽出処理を行います。が抽出されたら、それを処理のためにパイプライン ファイルに渡します;
2) URL が抽出された場合は、前の手順の実行を続けます (URL リクエストを送信すると、エンジンがそのリクエストをスケジューラに渡します)そしてそれをキューに入れます...) リクエストキューにリクエストがなくなるまで、プログラムは終了します。
Q95. 関連クエリとは何ですか?
Q96. クローラーを作成するには複数のプロセスを使用した方が良いですか?それともマルチスレッドの方が良いのでしょうか?なぜ?
マルチスレッドを有効にすると、スレッド A が待機している間、CPU リソースを無駄にせずに自動的にスレッド B に切り替えることができるため、プログラムの実行効率が向上します)。
実際のデータ収集プロセスでは、ネットワークの速度や応答の問題だけでなく、自分のマシンのハードウェア条件も考慮してマルチプロセスまたはマルチスレッドを設定する必要があります。
Q97. データベースの最適化?
2) ハードウェアを最適化します; SSD の使用、ディスク キュー テクノロジ (RAID0、RAID1、RDID5) の使用など;
3) MySQL 独自のテーブル パーティショニング テクノロジを使用して、データをさまざまなファイルに階層化し、ディスク読み取り効率を向上させることができます;
4) 適切なテーブル エンジンを選択し、パラメータを最適化します;
5 ) アーキテクチャ レベルのキャッシュ、静的化、分散を実行します;
6) NoSQL などのより高速なストレージ方法を使用して、頻繁にアクセスされるデータを保存します
Q98. 分散 クローラーは主にどのような問題を解決しますか?
#2)bandwidth
3)cpu
4)io
Q99. 確認コードについてはどうすればよいですかクロールプロセス中?対処?
2) 有料インターフェイスが付属しています
Q100. 一般的なクローラ対策とその対策は何ですか?
ヘッダーをクローラーに直接追加し、ブラウザーのユーザー エージェントをクローラーのヘッダーにコピーしたり、リファラー値をターゲット Web サイトのドメイン名に変更したりできます。
2) ユーザーの行動に基づくアンチクローラー
同じ IP が短期間に同じページに複数回アクセスしたり、同じアカウントが短期間に同じ操作を複数回行うこと。
ほとんどの Web サイトは前者の状況にありますが、この状況については、IP プロキシを使用することで解決できます。
特別なクローラーを作成して、インターネット上のパブリック プロキシ IP をクロールし、検出後にすべてを保存できます。
多数のプロキシ IP を取得した後は、数リクエストごとに 1 つの IP を変更できます。これはリクエストまたは urllib2 で簡単に実行できるため、最初のアンチクローラーを簡単にバイパスできます。
2 番目のケースでは、各リクエストの後、次のリクエストを行う前にランダムに数秒待つことができます。
論理的な抜け穴のある一部の Web サイトでは、リクエストを数回行い、ログアウトして再度ログインし、リクエストを続けることで、同じアカウントが短期間に同じリクエストを複数回行うことができないという制限を回避できます。
3) 動的ページのアンチクローラー
まず、Fiddler を使用してネットワーク リクエストを分析します。Ajax リクエストを見つけて、特定のパラメーターと応答の特定の意味を分析できれば、上記の方法を使用できます。
リクエストまたは urllib2 を使用して Ajax リクエストをシミュレートし、レスポンスの JSON 形式を解析して必要なデータを取得します。
しかし、一部の Web サイトでは、Ajax リクエストのすべてのパラメーターが暗号化されており、必要なデータのリクエストを作成できません。
この場合、Selenium phantomJS を使用してブラウザ カーネルを呼び出し、phantomJS を使用して js を実行して人間の操作をシミュレートし、ページ内で js スクリプトをトリガーします。
以上がPython でよく聞かれる面接の質問は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。