Wenn wir nicht wissen, wie viele Parameter wir an die Funktion übergeben sollen, beispielsweise wenn wir eine Liste oder ein Tupel übergeben, verwenden wir *args:
def func(*args): for i in args: print(i) func(3,2,1,4,7) 3 2 1 4 7
Wenn wir nicht wissen Ich weiß nicht, wie viele Parameter übergeben werden sollen. Wenn Sie Schlüsselwortargumente verwenden, verwenden Sie **kwargs, um Schlüsselwortargumente zu sammeln:
def func(**kwargs): for i in kwargs: print(i,kwargs[i]) func(a=1,b=2,c=7) a.1 b.2 c.7
Verwenden Sie den Befehl os.remove(filename) oder os.unlink(filename)
Sie können auf in Python in C geschriebene Module zugreifen über:
Module = = PyImport_ImportModule(“<modulename>”)
Es handelt sich um einen Etagendivisionsoperator, der zur Division zweier Operanden verwendet wird. Das Ergebnis ist der Quotient und es werden nur die Zahlen vor dem Dezimalpunkt angezeigt.
Zum Beispiel 10 // 5 = 2 und 10,0 // 5,0 = 2,0.
Führende Leerzeichen in einer Zeichenfolge sind Leerzeichen, die vor dem ersten Nicht-Leerzeichen in der Zeichenfolge erscheinen.
Wir verwenden die Methode Istrip(), um es aus dem String zu entfernen.
’Data123 '.lstrip()
Ergebnis:
'Data123 ’
Der Aufruf von Istrip() entfernt führende Leerzeichen Verwenden Sie die Methode rstrip().
'Data123 '.rstrip() 'Data123'
a,b = 0, 1 while b<100: print (b) a, b = b, a+b
Wenn die Zeichenfolge nur numerische Zeichen enthält, können Sie sie mit der Funktion int() in eine Ganzzahl umwandeln.
int(‘22’)
Überprüfen wir den Variablentyp:
type('22') <class'str'> type(int('22')) <class'int'>
Um Zufallszahlen zu generieren, können wir die Funktion random() aus dem Zufallsmodul importieren.
from random import random random() 0.013501571090371978
Wir können auch die Funktion randint() verwenden, die zwei Parameter zur Darstellung eines Intervalls benötigt und eine zufällige Ganzzahl innerhalb des Intervalls zurückgibt.
from random import randint randint(2,7) 4
Der einfachste Weg ist die Verwendung der Methode „capitalize()“.
'daxie'.capitalize() 'Daxie'
Für dieses Problem können wir die Methode isalnum() verwenden.
'DATA123'.isalnum() True 'DATA123!'.isalnum() False
Wir können auch einige andere Methoden verwenden:
'123'.isdigit()#检测字符串是否只由数字组成 True '123'.isnumeric()#只针对unicode对象 True 'data'.islower()#是否都为小写 True 'Data'.isupper()#是否都为大写 False
Verbindung in Python besteht darin, zwei Sequenzen miteinander zu verbinden:
'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
Hier ist ein Fehler aufgetreten, da (4) als Ganzzahl betrachtet wird und erneut ausgeführt wird:
(2,3)+(4,) (2, 3,4)
Wenn sich eine Funktion während ihres Aufrufs direkt oder indirekt selbst aufruft, handelt es sich um eine Rekursion. Um eine Endlosschleife zu vermeiden, muss es jedoch eine Endbedingung geben:
def facto(n): if n==1: return 1 return n*facto(n-1) facto(5) 120
Der Generator generiert eine Reihe von Werten für die Iteration, es handelt sich also um ein iterierbares Objekt.
Es berechnet kontinuierlich das nächste Element während der for-Schleife und beendet die for-Schleife unter geeigneten Bedingungen.
Wir definieren eine Funktion, die Werte einzeln „liefert“ und verwenden dann eine for-Schleife, um darüber zu iterieren.
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
Iterator ist eine Möglichkeit, auf die Elemente einer Sammlung zuzugreifen.
Das Iteratorobjekt beginnt mit dem Zugriff vom ersten Element der Sammlung, bis auf alle Elemente zugegriffen wurde.
Iteratoren können nur vorwärts und nicht rückwärts gehen. Wir erstellen Iteratoren mit der Funktion 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) Wenn Sie einen Generator verwenden, verwenden wir die integrierten Funktionen iter() und next(). 2) Im Generator verwenden wir das Schlüsselwort „yield“, um jedes Mal ein Objekt zu generieren/zurückzugeben.
3) Sie können anpassen, wie viele „yield“-Anweisungen es im Generator gibt wird jedes Mal gespeichert, wenn die Schleife angehalten wird. Iteratoren benötigen zum Iterieren nur ein iterierbares Objekt und es besteht keine Notwendigkeit, lokale Variablen zu verwenden
5) Sie können Ihren eigenen Iterator mithilfe von Klassen implementieren, aber Sie können keine Generatoren implementieren
6) Generatoren laufen schnell und haben eine einfache Syntax, einfacher ;
7) Iteratoren können mehr Speicher sparen.
F66. Wofür wird die Funktion zip() verwendet?
Python-Neulinge sind möglicherweise nicht sehr vertraut mit dieser Funktion, mit der zip() einen Iterator von Tupeln zurückgeben kann.
[(‘a’,1), (‘b’, 2), (‘c’, 3)]
Hier paart die Funktion zip() die Datenelemente in den beiden Listen und erstellt daraus ein Tupel.
F67. Wie kann ich mit Python herausfinden, in welchem Verzeichnis Sie sich gerade befinden?
Wir können die Funktion/Methode getcwd() verwenden, um es aus dem Modul OS zu importieren.
os.getcwd()
‘C:Users37410Desktop code’
Q68. Wie berechnet man die Länge einer Zeichenfolge?
Das ist auch relativ einfach: Rufen Sie einfach die Funktion len() für die Zeichenfolge auf, deren Länge wir berechnen möchten.
8
Q69 Wie lösche ich das letzte Objekt aus der Liste?
Entfernen Sie das letzte Objekt oder Objekt aus der Liste und geben Sie es zurück.
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不仅效率更高,也更方便
Sie erhalten viele Vektor- und Matrixoperationen, die manchmal unnötige Arbeit vermeiden können.
4) NumPy-Arrays sind schneller
Sie können NumPy, FFT, Faltung, schnelle Suche, grundlegende Statistiken, lineare Algebra, Histogramme usw. integriert verwenden.
Dekoratoren werden in Python verwendet, um Code in Funktionen oder Klassen zu ändern oder einzufügen.
Mit Dekoratoren können Sie einen Klassen- oder Funktionsmethodenaufruf so umschließen, dass ein Codeabschnitt vor oder nach der Ausführung des Originalcodes ausgeführt wird.
Dekoratoren können verwendet werden, um Berechtigungen zu überprüfen, an Methoden übergebene Parameter zu ändern oder zu verfolgen, Aufrufe an bestimmte Methoden zu protokollieren usw.
In einer idealen Welt enthält NumPy nur die grundlegendsten Array-Datentypen und -Operationen, wie Indizierung, Sortierung, Umformung und grundlegende Elementfunktionen.
2) Der gesamte numerische Code wird in SciPy gespeichert. Dennoch behält NumPy das Ziel der Abwärtskompatibilität bei und ist bestrebt, alle vom Vorgänger unterstützten Funktionen beizubehalten.
Obwohl NumPy eher zu SciPy gehört, enthält es dennoch einige lineare Algebrafunktionen. Unabhängig davon enthält SciPy eine umfassendere Version des linearen Algebra-Moduls und viele andere numerische Algorithmen als alle anderen.
Wenn Sie Python für wissenschaftliche Berechnungen verwenden, wird empfohlen, NumPy und SciPy zu installieren. Die meisten neuen Funktionen gehören zu SciPy und nicht zu NumPy.
Wie beim 2D-Plotten fallen auch 3D-Grafiken nicht in den Rahmen von NumPy und SciPy, aber genau wie im 2D-Fall gibt es Pakete, die sich in NumPy integrieren lassen.
Matplotlib bietet grundlegende 3D-Plots im Unterpaket mplot3d, während Mayavi die leistungsstarke VTK-Engine verwendet, um eine Vielzahl hochwertiger 3D-Visualisierungsfunktionen bereitzustellen.
Crawler und Scary-Framework
Scrapy ist ein Python-Crawler-Framework mit extrem hoher Crawling-Effizienz und hoher Anpassungsfähigkeit, unterstützt jedoch keine Verteilung.
Scrapy-Redis ist eine Reihe von Komponenten, die auf der Redis-Datenbank basieren und auf dem Scrapy-Framework ausgeführt werden, wodurch Scrapy verteilte Strategien unterstützen kann. Die Slaver-Seite teilt die Artikelwarteschlange, die Anforderungswarteschlange und den Anforderungsfingerabdrucksatz in der Redis-Datenbank der Master-Seite .
Da Redis die Master-Slave-Synchronisation unterstützt und Daten im Speicher zwischengespeichert werden, sind auf Redis basierende verteilte Crawler beim hochfrequenten Lesen von Anforderungen und Daten sehr effizient.
Python kommt mit: urllib, urllib2
Dritter: Anfragen
Framework: Scrapy
Sowohl die Module urllib als auch urllib2 führen Vorgänge im Zusammenhang mit der Anforderung von URLs aus, bieten jedoch unterschiedliche Funktionen.
urllib2.: urllib2.urlopen kann ein Request-Objekt oder eine URL akzeptieren (beim Akzeptieren eines Request-Objekts können Sie die Header einer URL festlegen. urllib.urlopen akzeptiert nur eine URL. urllib2 hat also keinen URL-Code.) Der Grund, warum urllib und urllib2 oft zusammen verwendet werden: Scrapy ist ein gekapseltes Framework. Es umfasst einen Downloader, einen Parser, ein Protokoll und eine Ausnahmebehandlung, die auf Multithreading basiert.
Die verdrehte Methode bietet Vorteile für das Crawlen und Entwickeln einer festen einzelnen Website. Für das Crawlen von 100 Websites auf mehreren Websites ist sie jedoch hinsichtlich der gleichzeitigen und verteilten Verarbeitung nicht flexibel genug, was die Anpassung und Erweiterung umständlich macht.
request ist eine HTTP-Bibliothek, die nur für HTTP-Anfragen verwendet wird. Das Herunterladen und Parsen erfolgt selbst. Sie bietet eine höhere Flexibilität und eine verteilte Bereitstellung flexibel für Funktionen können besser implementiert werden.
F93. Welche MySQL-Engines werden am häufigsten verwendet? Was sind die Unterschiede zwischen den Motoren?
Es gibt zwei Haupt-Engines, MyISAM und InnoDB. Die Hauptunterschiede sind wie folgt:
3) InnoDB unterstützt Fremdschlüssel, MyISAM unterstützt dies jedoch nicht muss angegeben werden.
5) InnoDB unterstützt ihn nicht.
6) InnoDB speichert die Anzahl der Zeilen in der Tabelle nicht
muss die gesamte Tabelle scannen, um zu berechnen, wie viele Zeilen vorhanden sind, aber MyISAM muss sie nur auslesen. Speichern Sie einfach die Anzahl der Zeilen. Beachten Sie, dass MyISAM auch die gesamte Tabelle scannen muss, wenn die count(*)-Anweisung die gesamte Tabelle enthält. 7) Für sich selbst erhöhende Felder muss InnoDB einen Index nur für dieses Feld enthalten, jedoch in der MyISAM-Tabelle , es kann einen gemeinsamen Index mit anderen Feldern erstellen; 8) Beim Löschen der gesamten Tabelle löscht InnoDB eine Zeile nach der anderen, was sehr langsam ist. MyISAM erstellt die Tabelle neu; 9) InnoDB unterstützt Zeilensperren (in einigen Fällen ist die gesamte Tabelle gesperrt, z. B. bei der Aktualisierung der Tabelle „a=1“, wobei der Benutzer „%lee%“ mag. Q94. Beschreiben Sie, wie das funktioniert Framework führt den Mechanismus aus? Holen Sie sich den ersten Stapel von URLs und senden Sie die Anfrage. Die Anfrage wird von der Engine an den Scheduler übergeben und in die Anfragewarteschlange gestelltDer Scheduler übergibt die Anforderung in der Anforderungswarteschlange an den Downloader, um die der Anforderung entsprechende Antwortressource zu erhalten, und übergibt die Antwort an die von ihm selbst geschriebene Analysemethode zur Extraktionsverarbeitung:
Wenn Die Extraktion ist erforderlich. Die Daten werden zur Verarbeitung an die Pipeline-Datei übergeben Anfrage an den Scheduler senden und in die Warteschlange stellen...), bis keine Anfragen mehr in der Anfragewarteschlange vorhanden sind und das Programm endet.
F95. Was sind verwandte Abfragen und was sind sie?
Q96 Verwenden Sie mehrere Prozesse, um Crawler gut zu schreiben? Oder ist Multithreading besser? Warum?
Das Aktivieren von Multithreading automatisch zu Thread B wechseln, während Thread A wartet, sodass keine CPU-Ressourcen verschwendet werden und die Effizienz der Programmausführung verbessert werden kann.
Beim eigentlichen Datenerfassungsprozess müssen Sie nicht nur die Netzwerkgeschwindigkeit und Reaktionsprobleme berücksichtigen, sondern auch die Hardwarebedingungen Ihres eigenen Computers, um Multiprozess oder Multithreading einzurichten.
F97.
2) Hardware optimieren; SSD verwenden, Festplattenwarteschlangentechnologie verwenden (RAID0, RAID1, RDID5) usw .;# 🎜🎜#
3) Verwenden Sie die MySQL-eigene Tabellenpartitionierungstechnologie, um Daten in verschiedene Dateien zu schichten, was die Leseeffizienz der Festplatte verbessern kann. 4) Wählen Sie die entsprechende Tabellen-Engine und Parameteroptimierung ; 5) Caching, Statik und Verteilung auf Architekturebene; 6) Übernehmen Sie schnellere Speichermethoden, wie z. B. NoSQL-Speicher für häufigen Zugriff auf Daten#🎜🎜 #F98. Welche Probleme löst der verteilte Crawler hauptsächlich?
1)ip
3)cpu
4)io
#🎜 🎜#F99. Wie gehe ich mit dem Bestätigungscode während des Crawling-Vorgangs um? 1) Scrapy wird mit 2) kostenpflichtiger Schnittstelle Q100 geliefert. 1) Headers Anti-Crawling, das von Benutzern über Headers Anti-Crawling angefordert wird, ist die gebräuchlichste Anti-Crawling-Strategie. Sie können Header direkt zum Crawler hinzufügen und den User-Agent des Browsers in die Header des Crawlers kopieren oder den Referrer-Wert in den Domainnamen der Zielwebsite ändern. 2) Anti-Crawler basierend auf Benutzerverhalten Durch Erkennen des Benutzerverhaltens, z. B. wenn dieselbe IP in kurzer Zeit mehrmals dieselbe Seite besucht oder die Dasselbe Konto führt mehrmals in kurzer Zeit dasselbe aus. Die meisten Websites befinden sich in der ersteren Situation. In dieser Situation kann die Verwendung eines IP-Proxys Abhilfe schaffen. Sie können einen Crawler speziell zum Crawlen der im Internet öffentlichen Proxy-IPs schreiben und sie alle nach der Erkennung speichern. Nachdem Sie über eine große Anzahl von Proxy-IPs verfügen, können Sie alle paar Anfragen eine IP ändern. Dies ist einfach in Anfragen oder urllib2 möglich, sodass Sie den ersten Anti-Crawler problemlos umgehen können. Für den zweiten Fall können Sie nach dem Zufallsprinzip nach jeder Anfrage einige Sekunden warten, bevor Sie die nächste Anfrage stellen. Einige Websites mit logischen Lücken können die Einschränkung, dass dasselbe Konto nicht mehrere Anfragen in einem kurzen Zeitraum stellen kann, umgehen, indem sie mehrmals Anfragen stellen, sich abmelden, erneut anmelden und weiterhin Anfragen stellen. 3) Anti-Crawler für dynamische Seiten Verwenden Sie zunächst Fiddler, um die Netzwerkanforderung zu analysieren. Wenn Sie die Ajax-Anfrage finden, können Sie auch die spezifischen Parameter analysieren Um die spezifische Bedeutung der Antwort zu ermitteln, können wir die obige Methode verwenden. Verwenden Sie Anfragen oder urllib2, um Ajax-Anfragen zu simulieren und das JSON-Format der Antwort zu analysieren, um die erforderlichen Daten zu erhalten. Einige Websites verschlüsseln jedoch alle Parameter der Ajax-Anfrage und können keine Anfrage für die benötigten Daten erstellen. In diesem Fall verwenden Sie Selenium + PhantomJS, um den Browser-Kernel aufzurufen, und PhantomJS, um JS auszuführen, um menschliche Vorgänge zu simulieren und JS-Skripte auf der Seite auszulösen.Das obige ist der detaillierte Inhalt vonWas sind die häufig gestellten Interviewfragen in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!