리스트나 튜플을 전달할 때처럼 함수에 몇 개의 매개변수를 전달할지 모를 때는 *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(파일명) 또는 os.unlink(파일명) 명령을 사용하세요.
다음을 통해 C에서 Python으로 작성된 모듈에 액세스할 수 있습니다.
Module = = PyImport_ImportModule(“<modulename>”)
두 개의 피연산자를 나누는 데 사용되는 바닥 나눗셈 연산자로, 그 결과가 몫이 되고, 소수점 이하의 숫자만 표시됩니다.
예를 들어 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 모듈에서 ran() 함수를 가져올 수 있습니다.
from random import random random() 0.013501571090371978
간격을 나타내기 위해 두 개의 매개변수를 사용하고 간격 내에서 임의의 정수를 반환하는 randint() 함수를 사용할 수도 있습니다.
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의 연결은 두 시퀀스를 함께 연결하는 것입니다. + 연산자를 사용하여 완료합니다.
'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 루프를 종료합니다.
우리는 값을 하나씩 "산출"하는 함수를 정의한 다음 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
Iterator는 컬렉션 요소에 액세스하는 방법입니다.
반복자 개체는 모든 요소에 액세스할 때까지 컬렉션의 첫 번째 요소부터 액세스하기 시작합니다.
반복자는 앞으로만 갈 수 있고 뒤로 갈 수 없습니다. 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' 문 수를 사용자 정의할 수 있습니다.
Generator 로컬 변수 상태 루프가 일시 중지될 때마다 저장됩니다. 반복자는 반복할 수 있는 객체만 필요하며 지역 변수를 사용할 필요가 없습니다.
5) 클래스를 사용하여 자체 반복자를 구현할 수 있지만 생성기를 구현할 수는 없습니다.
6) 생성기는 빠르게 실행되고 간단한 구문을 갖습니다. ;
7) 반복자는 더 많은 메모리를 절약할 수 있습니다.
Q66. zip() 함수는 무엇에 사용되나요?
list(zip([‘a’,‘b’,‘c’],[1,2,3]))
[(‘a’1), (‘b’, 2), (‘c’, 3)]
여기서 zip() 함수는 두 목록의 데이터 항목을 쌍으로 연결하고 그로부터 튜플을 생성합니다.
Q67. Python을 사용하여 현재 어떤 디렉토리에 있는지 알아내는 방법은 무엇입니까?
import os
os.getcwd()
‘C:Users37410Desktop code’
Q68. 문자열 길이를 어떻게 계산하나요?
len(‘Data 123’)
8
Q69. 목록에서 마지막 개체를 삭제하는 방법은 무엇인가요?
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의 데코레이터는 함수나 클래스의 코드를 수정하거나 삽입하는 데 사용됩니다.
데코레이터를 사용하면 원래 코드가 실행되기 전이나 후에 코드 조각이 실행되도록 클래스 또는 함수 메서드 호출을 래핑할 수 있습니다.
데코레이터는 권한 확인, 메소드에 전달된 매개변수 수정 또는 추적, 특정 메소드에 대한 호출 기록 등에 사용될 수 있습니다.
이상적인 세상에서 NumPy에는 인덱싱, 정렬, 재구성 및 기본 요소 기능과 같은 가장 기본적인 배열 데이터 유형 및 작업만 포함되어 있습니다.
2) 모든 숫자 코드는 SciPy에 있습니다. 그럼에도 불구하고 NumPy는 이전 버전과의 호환성이라는 목표를 여전히 유지하고 있으며 이전 버전에서 지원되는 모든 기능을 유지하려고 노력하고 있습니다.
따라서 SciPy에 더 적합하게 속하지만 NumPy에는 여전히 일부 선형 대수 함수가 포함되어 있습니다. 그럼에도 불구하고 SciPy에는 선형 대수학 모듈의 더 포괄적인 버전과 다른 어떤 것보다 많은 다른 수치 알고리즘이 포함되어 있습니다.
과학적인 계산을 위해 Python을 사용한다면 NumPy와 SciPy를 설치하는 것이 좋습니다. 대부분의 새로운 기능은 NumPy가 아닌 SciPy에 속합니다.
2D 플로팅과 마찬가지로 3D 그래픽도 NumPy 및 SciPy의 범위를 벗어나지만 2D 케이스와 마찬가지로 NumPy와 통합되는 패키지가 있습니다.
Matplotlib는 mplot3d 하위 패키지에서 기본 3D 플로팅을 제공하는 반면 Mayavi는 강력한 VTK 엔진을 사용하여 다양한 고품질 3D 시각화 기능을 제공합니다.
크롤러와 무서운 프레임워크
Scrapy는 크롤링 효율성이 매우 높고 사용자 정의 수준이 높은 Python 크롤러 프레임워크이지만 배포를 지원하지 않습니다.
Scrapy-redis는 redis 데이터베이스를 기반으로 하고 scrapy 프레임워크에서 실행되는 구성 요소 집합으로, 이를 통해 scrapy는 분산 전략을 지원할 수 있으며 마스터 측 redis 데이터베이스에 설정된 항목 대기열, 요청 대기열 및 요청 지문을 공유합니다. .
redis는 마스터-슬레이브 동기화를 지원하고 데이터가 메모리에 캐시되므로 Redis 기반 분산 크롤러는 요청 및 데이터를 자주 읽는 데 매우 효율적입니다.
Python에는 다음이 포함됩니다: urllib, urllib2
제3자: 요청
프레임워크: Scrapy
urllib 및 urllib2 모듈은 모두 URL 요청과 관련된 작업을 수행하지만 서로 다른 기능을 제공합니다.
urllib2.: urllib2.urlopen은 요청 개체 또는 URL을 허용할 수 있습니다(요청 개체를 허용할 때 URL의 헤더를 설정할 수 있음). urllib.urlopen은 하나의 url
urllib만 허용하지만 urllib2는 허용하지 않습니다. urllib와 urllib2가 자주 함께 사용되는 이유
scrapy는 멀티스레딩을 기반으로 하는 다운로더, 파서, 로그 및 예외 처리 기능을 포함하는 캡슐화된 프레임워크입니다.
트위스트 방식은 고정된 단일 웹사이트를 크롤링하고 개발할 때 장점이 있지만, 여러 웹사이트에서 100개의 웹사이트를 크롤링하는 경우 동시 및 분산 처리 측면에서 유연성이 부족하여 조정 및 확장이 불편합니다.
request는 요청에만 사용됩니다. HTTP 요청의 경우 다운로드 및 구문 분석이 모두 자체적으로 처리됩니다. 이는 또한 매우 높은 유연성을 제공합니다. 함수에 대한 유연성이 더 잘 구현될 수 있습니다.
MyISAM과 InnoDB의 두 가지 주요 엔진이 있습니다. 주요 차이점은 다음과 같습니다.
1) InnoDB는 트랜잭션을 지원하지만 MyISAM은 매우 중요합니다. 예를 들어 일련의 추가, 삭제 또는 수정 중에 오류가 발생하면 롤백하고 복원할 수 있지만 MyISAM은 그렇지 않습니다.
3) InnoDB는 외래 키를 지원하지만 MyISAM은 이를 지원하지 않습니다.
4) MyISAM이 기본 엔진이고 InnoDB가 필요합니다.
5) InnoDB는 FULLTEXT 유형 인덱스를 지원하지 않습니다.
6) InnoDB는 테이블의 행 수를 저장하지 않습니다. 전체 테이블을 스캔하여 행 수를 계산하지만 MyISAM은 단순히 읽어내기만 하면 됩니다. 행 수만 저장하면 됩니다.
count(*) 문에 where 조건이 포함되어 있으면 MyISAM도 전체 테이블을 스캔해야 합니다.
7) 자체 증가 필드의 경우 InnoDB는 해당 필드의 인덱스만 포함해야 하지만 MyISAM 테이블에는 있어야 합니다. , 다른 필드와 공동 인덱스를 생성할 수 있습니다.
8) 전체 테이블을 지울 때 InnoDB는 행을 하나씩 삭제하므로 매우 느립니다. MyISAM은 테이블을 재구축합니다.
9) InnoDB는 행 잠금을 지원합니다(어떤 경우에는 업데이트 테이블이 a=1로 설정되고 사용자가 ‘%lee%’
Q94와 같이 전체 테이블이 잠김). 프레임워크가 메커니즘을 실행하나요?
start_urls에서 첫 번째 URL 배치를 가져와 요청을 보냅니다. 요청은 엔진에 의해 스케줄러로 전달되고 획득이 완료된 후
스케줄러는 요청에 해당하는 응답 리소스를 얻기 위해 요청 큐에 있는 요청을 다운로더에게 전달하고, 추출 처리를 위해 자체적으로 작성한 파싱 메서드에 응답을 전달합니다.
필요한 데이터가 추출되면 전달됩니다. 처리를 위해 파이프라인 파일로 넘깁니다 ;
2) URL이 추출되면 이전 단계를 계속 수행합니다(URL 요청을 보내면 엔진이 요청을 스케줄러에 전달하고 대기열에 넣습니다...) 요청 큐에 요청이 없고 프로그램이 종료될 때까지.
주로 내부 조인, 왼쪽 조인, 오른쪽 조인, 전체 조인(외부 조인) 등 쿼리를 위해 여러 테이블을 조인합니다.
IO 집약적인 코드(파일 처리, 웹 크롤러 등)의 경우 멀티스레딩을 사용하면 효율적으로 효율성을 높일 수 있습니다(단일 스레드에서 IO 작업이 있는 경우 IO 대기가 발생하여 불필요한 시간 낭비가 발생하며
및 멀티 스레딩을 켜면 스레드 A의 효율성을 효과적으로 향상시킬 수 있습니다. 기다리는 동안 자동으로 스레드 B로 전환하여 CPU 리소스를 낭비하지 않고 프로그램 실행 효율성을 향상시킵니다.
실제 데이터 수집 과정에서는 멀티 프로세스나 멀티 스레딩을 설정하기 위해 네트워크 속도와 응답 문제뿐만 아니라 자신의 머신의 하드웨어 조건도 고려해야 합니다.
1) 인덱스, SQL 문 최적화 및 느린 쿼리 분석
2) SSD 사용, 디스크 대기열 기술(RAID0, RAID1, RDID5) 등 사용
3) MySQL 자체 테이블 파티셔닝 기술 사용 , 데이터를 여러 파일로 계층화하면 디스크 읽기 효율성이 향상됩니다.
4) 적절한 테이블 엔진을 선택하고 매개변수를 최적화합니다.
5) 아키텍처 수준 캐싱, 정적화 및 배포를 수행합니다.
6) 다음과 같은 더 빠른 저장 방법을 사용합니다. 자주 접근하는 데이터를 저장하는 NoSQL
1)ip
2)bandwidth
3)cpu
4)io
1) Scrapy가 함께 제공됩니다
2) 유료 인터페이스
1) 헤더 안티 크롤링을 통해 사용자가 요청한 헤더 안티 크롤링은 가장 일반적인 안티 크롤링 전략입니다.
헤더를 크롤러에 직접 추가하고 브라우저의 사용자 에이전트를 크롤러의 헤더에 복사하거나 추천자 값을 대상 웹 사이트 도메인 이름으로 수정할 수 있습니다.
2) 사용자 행동 기반 안티 크롤러
동일 IP가 짧은 시간 내에 동일한 페이지를 여러 번 방문하거나, 동일한 계정이 짧은 시간 내에 동일한 작업을 여러 번 수행하는 등 사용자 행동을 감지하여 시간의.
대부분의 웹사이트는 전자와 같은 상황입니다. 이 경우 IP 프록시를 사용하면 문제를 해결할 수 있습니다.
특수 크롤러를 작성하여 인터넷에 게시된 프록시 IP를 크롤링하고 감지 후 모두 저장할 수 있습니다.
프록시 IP가 많으면 몇 번의 요청마다 하나의 IP를 변경할 수 있습니다. 이는 요청이나 urllib2에서 쉽게 수행할 수 있으므로 첫 번째 안티 크롤러를 쉽게 우회할 수 있습니다.
두 번째 경우에는 각 요청 후 다음 요청을 하기 전에 무작위로 몇 초 정도 기다릴 수 있습니다.
논리적 허점이 있는 일부 웹사이트에서는 여러 번 요청하고, 로그아웃하고, 다시 로그인하고, 계속 요청함으로써 동일한 계정이 짧은 시간에 여러 번 동일한 요청을 할 수 없다는 제한을 우회할 수 있습니다.
3) 동적 페이지에 대한 안티 크롤러
먼저 Fiddler를 사용하여 네트워크 요청을 분석하고 Ajax 요청을 찾아 특정 매개변수와 응답의 구체적인 의미를 분석할 수 있다면 위 방법을 사용할 수 있습니다.
요청 또는 urllib2를 사용하여 Ajax 요청을 시뮬레이션하고 응답의 JSON 형식을 구문 분석하여 필요한 데이터를 가져옵니다.
그러나 일부 웹사이트는 Ajax 요청의 모든 매개변수를 암호화하여 필요한 데이터에 대한 요청을 구성할 수 없습니다.
이 경우 selenium+phantomJS를 사용하여 브라우저 커널을 호출하고 phantomJS를 사용하여 js를 실행하여 인간 작업을 시뮬레이션하고 페이지에서 js 스크립트를 트리거합니다.
위 내용은 파이썬 면접에서 자주 묻는 질문은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!