python测验

Python基础篇:

1 python的8种数据类型并分别列出你会的方法?

Int

Float

Boolean

Str:len,eval,lower,upper,count,index,max,min,replace

List:append,extend,insert,pop,remove,clear,index

Tuple:len

Set

Dict

Complex

2 哪些是可变元素哪些不可变?

可变:列表list、字典dict、集合set

不可变:int、float、bool、str、tuple

3 为什么函数的参数不能传可变数据类型,举例说明?

可变类型的默认值在函数定义时只会被创建一次,然后会在后续函数调用中重复使用,如果在函数中修改了这个默认值,它将在后续的函数调用中保持修改后的值,而不是返回最初的默认值。

def add(a:int,b:list=[]):   # 定义函数的时候就创建了列表

    print(id(b))

    b.append(a)

    print(b)

add(1)

add(2)

4 什么是闭包?为什么使用闭包?闭包有什么优点有什么缺点?

闭包是指有权访问另一个函数作用域中变量的函数

在需要可以读取函数内部的变量,还有让变量的值始终保持在内存中时使用

优点:变量长期驻扎在内存中,避免全局变量的污染

缺点:增大内存的使用量 使用不当会造成内存泄露

5 什么是生成器迭代器和可迭代对象?

生成器是用特殊方式定义的迭代器,迭代器调用next函数不断返回下一个值,可迭代对象能被for循环遍历

# 迭代器:die=iter(list)

# next(die)

# print(next(die)) 1...

# 2...

# 3......stopiteration报错

# 生成器:print((x for x in range(10)))

# def hello():

#     for i in range(10):

#         yield i

# print(hello())

# for i in hello():

#     print(i)

6 使用生成器生出斐波那契数列

def fib(n):

a,b,counter=0,1,0

while True:

if counter>n:

return

yield a

a,b=b,a+b

counter=counter+1

7使用生成器生出杨辉三角形

def triangles():

    L = [1]              #定义L为一个只包含一个元素的列表

    while True:

        yield L          #定义为生成器函数

        L =[1] + [L[n] + L[n-1] for n in range(1,len(L))] + [1]

n = 0

for t in triangles():

    print(t)

    n = n + 1

    if n == 10:

        break

8 什么是魔术方法,举例说明你知道的魔术方法和具体作用?

允许你在类中自定义函数,并绑定到类的特殊方法中

__new__是从一个class建立一个object的过程,__init__是有了这个object之后,给这个object初始化的过程,__call__() 方法可以实现将类的实例对象作为函数调用的效果

9 说说什么是类方法,静态方法,类属性,实例属性,他们有什么区别?

静态属性是类本身的属性,存储与类相关的数据,类属性是定义在类内部的属性,存储与类的方法相关的数据,可以被类的所有实例共享和访问,实例属性是实例对象特有的,不能通过类对象调用,类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,静态方法,需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数

10 什么是单例模式?请你实现一个单例模式?

单例模式就是确保一个类只有一个实例存在

11 说说三种高级方法的使用, map reduce filter

Map

将⼀个函数映射到⼀个输⼊列表的所有元素上。

Reduce

对⼀个列表进⾏⼀些计算并返回结果

Filter

过滤列表中的元素,并且返回⼀个由所有符合要求的元素所构成的列表,符合要求即函数映射到该元素时返回值为True。

12 说说什么是装饰器,举个例子具体说明装饰器的作用

装饰器就是给已有函数增加额外功能的函数

# 添加一个登录验证的功能

def check(fn):

    def inner():

        print("请先登录....")

        fn()

    return inner

def comment():

    print("发表评论")

# 使用装饰器来装饰函数

comment = check(comment)

comment()

# 装饰器的基本雏形

# def decorator(fn): # fn:目标函数.

#     def inner():

#         '''执行函数之前'''

#         fn() # 执行被装饰的函数

#         '''执行函数之后'''

#     return inner

13 说说什么是断言?有什么用?

assert 语句,简单理解就是简易版的 if 语句, 用于判断某个表达式的值,结果为 True,程序运行,否则,程序停止运行,抛出AssertionError错误。

14 说如何读写文件,读文件写文件写二进制文件应该使用什么方法?

file 对象使用 open 函数来创建,使用write和read方法来写入和读取数据,readline() 方法用于从文件读取整行,包括 “\n” 字符,readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表。二进制可以使用encode()方法将字符串转换为字节。

15 如何读取大文件

可以使用文件对象的迭代器来读取大型文本文件。

16 写出冒泡排序

def bubble_sort(arr):

    n = len(arr)

    for i in range(n):

        for j in range(n-i-1):

            if arr[j] > arr[j+1]:

                arr[j], arr[j+1] = arr[j+1], arr[j]

    return arr

arr = [5, 69, 12, 1, 66, 85, 21]

print('数组:', arr)

print('排序结果:', bubble_sort(arr))

17 如何实现人工报错?

try

except

18 mysql 三表联查如何操作?写出伪代码?

SELECT

    t1.name1,

    t2.name2,

    t3.name3

FROM

    table1 t1

INNER JOIN

    table2 t2 ON t1.a = t2.a

INNER JOIN

    table3 t3 ON t2.b = t3.b

19 如果现在已经知道有三个班级 A班 B班 C班,如何知道每个班级第二名的成绩?

select Max(score ) from A where score not in (select Max(score ) from A)

20 说说python中的序列化反序列化以及具体作用?

序列化和反序列化的作用是实现数据的持久化存储和传输

Js 基础篇:

21 如何定义一个匿名函数?(尽可能多的写出方法)

(function(){ })();

(function(){ }());

+ function(){ }();

!function(){ }();

-function(){ }();

~function(){ }();

var test =function(){}();

void function(){}();

;(function(){})()

22 说说js中定义变量的三种方法?他们的区别?

Var,let,const

 var 声明的变量属于函数作用域,而 let 和 const 声明的变量属于块级作用域;( js 作用域在上篇文章)

 var 声明的变量存在变量提升,而 let 和 const 没有

 var 声明的变量可以重复声明,而在同一块级作用域, let 变量不能重新声明, const 常量不能修改(对象的属性和方法,数组的内容可以修改)

23 说说构造函数,原型对象 实例对象都是什么意思?他们三个之间有什么联系?

构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值

原型对象可以把那些不变的方法,直接定义在原型对象上,这样所有实例对象就可以共享这些方法

实例对象,JS 在创建实例对象的时候,每个实例对象都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象。

联系:任何一个函数都有prototype属性,它本身是一个对象,称之为原型、构造函数也是函数,也有prototype属性,构造函数中原型对象上的属性和方法,都可以被实例化对象所继承,任何一个对象都有constructor属性,实例化对象的constructor属性指向构造函数,原型也是对象,也有constructor属性,构造函数的原型的constructor属性指向构造函数,任何一个对象都有__proto__属性,它是一个指针,实例化对象的__proto__指向构造函数的原型

24 说说js中一个函数的形参是否要与实参对应?如果一个函数的形参为2个,实际传递了

一个实参会发生什么情况?

不一定需要一一对应。、

传递的参数个数少于形参个数,缺失的形参将会被赋予undefined值。

25 如何看待数组?数组和对象的用法是否完全一样?

数组是一个有序的数据集合,每个元素都有一个对应的索引值,可以通过索引值访问和操作数组中的元素。

数组是线性的,而对象是散列的。数组中每个元素都有索引,而对象中的元素通过键来标识。数组通常用于存储和操作相同类型的多个数据项,如一系列数字或字符串。对象则用于存储不同类型的数据项,如一个人或一个物品的信息。数组中的元素必须是相同类型,而对象的键值对可以是任意类型。这使得对象在表示复杂数据结构时更加灵活。

26 在js中如何查看数据类型?

typeof,instanceof,constructor 属性

27 如何设置一个对象的具体属性?比如是否可修改是否可配置是否可遍历?

writable:false,  //不可修改

enumerable:false, //不可遍历

configurable:false, //不可重新配置

28 如何将一个对象设置为另一个对象的原型对象?

Object.setPrototypeOf

29 如何遍历一个对象上所有的属性?

Reflect.ownKeys

30 如果遍历一个对象上的可遍历属性?

Object.keys

31 如何判断一个数组中元素的个数?

Length

32 说说this相关的用法,在不同的情况下this代表了什么意思?结合代码说明?

构造函数中的this:

function Person(name) {

this.name = name;

}

const p = new Person('xiaoming');

console.log(p.name);

普通函数中的this:

function getVal() {

console.log(this); //window

}

对象函数中的this:

        let obj = {

            name: 'xiaoming',

            clickFn: () => {

                console.log('this', this)

            }

        }

        function timer() {

            console.log(111, this)

            obj.clickFn();

        }

        const btn = document.querySelector('button');

        btn.addEventListener('click', timer.bind(obj))

箭头函数中的this:

var name = 'hello'

const obj = {

    name: 'obj',

    a: () => {

        console.log(this.name)

    }

}

const obj1 = {

    name: 'obj1'

}

obj.a.call(obj1) // hello

33 说说什么是base64?关于base64的俩个函数分别是什么?

Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符,主要目的是为了不出现特殊字符,简化程序的处理。

btoa():任意值转为 Base64 编码

atob():Base64 编码转为原来的值

34 说说什么是xhr断点,如何打xhr断点?

XHR断点允许开发人员在发送和接收XHR请求时暂停代码执行,以便检查请求和响应的详细信息,以及对其进行调试和分析。通过设置XHR断点,开发人员可以捕获特定的XHR请求,并在请求发生时暂停代码执行,以便检查请求的参数、请求头、响应数据等。

打开浏览器并进入要调试的网页。点击浏览器菜单中的“开发人员”选项,选择“开发人员工具”。在开发人员工具中选择“网络”选项卡。在网络选项卡中,可以看到所有的网络请求,包括XHR请求。找到要设置断点的XHR请求,右键点击该请求,选择“断点请求”。设置断点后,当该XHR请求被触发时,代码执行将会暂停,可以在“调试”选项卡中查看请求和响应的详细信息。

35 ‘ds23gl23s234ja’ 用什么方法可以提取出其中的数字?

let str = "ds23gl23s234ja";

let numbers = str.match('/\d+/');

36  说说什么是自执行函数,一遍的表现形式是什么?

自执行函数也叫立执行函数是将函数的声明和调用合并在一起

在函数前加上!+ -等运算符或使用()都能将之转换为自执行函数

37  说说eval的作用是什么?这种东西如何对我们进行反爬,我们要如何处理?

eval命令接受一个字符串作为参数,并将这个字符串当作语句执行。js被加密后放在eval()中执行,如果想还原js,在开发者控制台使用console.log()输出解密后的js。因为不论是eval()还是log(),js解析执行最终都依赖于浏览器内核。

通过在Node.js环境下去重写eval函数去记录捕获传入eval函数的字符串内容。

38 如果一个函数没有形参,但是调用它的时候有确实传递了很多参数,那么如何接受这些参数并使用?

在函数中使用Arguments对象来表示多出来的实参

39 如果一个函数返回多个值,那么实际会产生什么效果?比如下面的伪代码

Function hello(){

Return hh = 12+5,gg.t = hh,gg

}

40 我们已知的作用域有哪些?举例说明

application作用范围整个Web应用

session 域 (HttpSession)作用范围一次会话

request域  --(HttpServletRequest)作用范围整个请求链(请求转发也存在)

pageContext域—(PageContext)

爬虫通用篇:

41 如果我们请求接口返回的数据是json形式但是不是标准的json,我们应该啊如何处理?

使用JSON验证工具,检查语法错误,使用合适的JSON解析器

42 header头信息中有哪些常用重要的参数,分别代表什么意思?

1.Accept

作用: 浏览器端可以接受的媒体类型, 例如: Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)

通配符 代表任意类型 例如 Accept: / 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)

2.Accept-Encoding:

作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码); 例如: Accept-Encoding: zh-CN,zh;q=0.8

3.Accept-Language

作用: 浏览器申明自己接收的语言。 语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等; 例如: Accept-Language: en-us。

4.Connection

Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

5.Host(发送请求时,该报头域是必需的)

作用: 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的 例如: 我们在浏览器中输入:http://www.hzau.edu.cn 浏览器发送的请求消息中,就会包含Host请求报头域,如下:Host:www.hzau.edu.cn 此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号

6.Referer

当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站

7.User-Agent

作用:告诉 HTTP 服务器, 客户端使用的操作系统和浏览器的名称和版本。我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从 User-Agent 这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。

8.Cache-Control

Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。我们网页的缓存控制是由HTTP头中的“Cache-control”来实现的,常见值有private、no-cache、max-age、must-revalidate等,默认为private。这几种值的作用是根据重新查看某一页面时不同的方式来区分的

43什么是线程进程协成?它们之间有什么区别?你更提倡用哪种?

线程: 可以理解成执行代码的分支,线程是执行对应的代码的,cpu会调度对应的线程去工作,也可以说线程是cpu调度的基本单位(工作原理)

进程: 通俗理解一个运行起来的程序或者软件叫做进程

如何理解进程:把进程想成现实生活中的公司,公司可以给员工提供办公资源(办公桌椅,办公电脑等资源), 真正干活的是员工,所以员工可以想成线程,公司就是进程

协成:又称为微线程,也称为用户级线程,在不开辟线程的基础上完成多任务,在def里面只看到一个yield关键字可以理解程是协程(理解), 在单线程的基础上可以完成多任务,多个任务按照一定顺序交替执行(目的)

推荐协程,协程更快,可以保留上一次调用状态,是异步操作

44 我们抓取网页数据的步骤是什么(比如,源码没有数据怎么查看,如果还是没有有哪些可能性,怎么处理呢)

确定要爬取的目标网页,选择合适的爬取工具,使用浏览器的开发者工具来查看网页的源码,分析网页的HTML结构和CSS选择器。如果网页使用了Ajax加载数据,还需要分析Ajax请求的接口和参数,使用选择的爬取工具编写代码,测试和调试爬取代码。
45 如何不考虑追溯源码,如何判断一段加密代码到底是什么加密?

1、如果密文是十进制,字符范围是“0-9”,可以猜测是ASCII编码;

2、如果密文由“a-z”、“A-Z”和“=”构成,特别是末尾有“=”,那么判断可能是Base64编码;

Base64在线解码网址:BASE64加密解密

3.、如果密文为数字+字母构成,可以尝试rot13(常用)或者rotX(如果Base解出来的是乱码,可以尝试一下rot-13解码)

Rot-13在线解码网址:ROT13解码计算器 - 计算专家

需要了解更多关于rot-13的看一看这篇博客:ROT13是什么!_苦短性感的博客-CSDN博客_rot13

4、如果密文有“%”,形式为“%xx”和“%uxxxx”,字符范围又是十六进制的“0-F”,判断是escape()函数编码,用unescape()解码;

5、如果密文由“[],(),{},+,!”字符组成的编码通常就是通过Jother解码,可以使用Chrome浏览器对其进行解码,直接将需要解密的内容丢到 Console 回车就OK!

6,如果密文是一堆乱七八糟的繁体字,那么就是佛语加密,也就是与佛论禅

与佛论禅 在线解码:与佛论禅

佛语前边要(中文冒号)加上“佛曰:”或者“ 如是我闻:”

46画出scrapy 框架的流程图并写出运行流程?

Scrapy 中的数据流由引擎控制,其过程如下:

Engine 首先打开一个网站,找到处理该网站的 Spider 并向该 Spider 请求第一个要爬取

的 URL。

Engine 从 Spider 中获取到第一个要爬取的 URL 并通过 Scheduler 以 Request 的形式调

度。

Engine 向 Scheduler 请求下一个要爬取的 URL。

Scheduler 返回下一个要爬取的 URL 给 Engine,Engine 将 URL 通过 Downloader

Middlewares 转发给 Downloader 下载。

一旦页面下载完毕, Downloader 生成一个该页面的 Response,并将其通过

Downloader Middlewares 发送给 Engine。

Engine 从下载器中接收到 Response 并通过 Spider Middlewares 发送给 Spider 处理。

Spider 处理 Response 并返回爬取到的 Item 及新的 Request 给 Engine。

Engine 将 Spider 返回的 Item 给 Item Pipeline,将新的 Request 给 Scheduler。

重复第二步到最后一步,直到 Scheduler 中没有更多的 Request,Engine 关闭该网站,

爬取结束。

47 说说scrapy downloadmiddleware中包含哪些方法,都起到什么作用?

process_request(request, spider)

Request 被 Scrapy 引擎调度给 Downloader 之前,process_request() 方法就会被调用,也就是在 Request 从队列里调度出来到 Downloader 下载执行之前,我们都可以用process_request() 方法对 Request 进行处理。

process_response(request, response, spider)

Downloader 执行 Request 下载之后,会得到对应的 Response。Scrapy 引擎便会将 Response发送给 Spider 进行解析。在发送之前,我们都可以用 process_response() 方法来对 Response进行处理。

process_exception(request,exception,spider)

当 Downloader 或 process_request() 方法抛出异常时,例如抛出 IgnoreRequest 异常,

process_excep方法就会被调用。

48  说说scrapy框架的去重机制是怎么样的?

Scrapy 的去重是利用集合来实现的

49 说说什么是布隆过滤器,大体的实现思路是什么?有什么优缺点?

使用位数组表示一个待检测集合,并可以快速地通过概率算法判断一个元素是否

存在于这个集合中。

首先要保证不能破坏Scrapy-Redis分布式爬取的运行架构。我们需要修改Scrapy-Redis的源码,将它的去重类替换掉。同时,Bloom Filter的实现需要借助于一个位数组,既然当前架构还是依赖于Redis,首先实现一个基本的散列算法,将一个值经过散列运算后映射到一个m位数组的某一位上,接下来再实现Bloom Filter。Bloom Filter里面需要用到k个散列函数,这里要对这几个散列函数指定相同的m值和不同的seed值,接下来要实现比较关键的两个方法:一个是判定元素是否重复的方法exists(),另一个是添加元素到集合中的方法insert().

50 说说什么是字体加密,遇到字体加密的大体处理思路是什么?

字体加密即为所复制非所得

先找到网页当中使用的是什么字体,把对应的字体库下载到本地,然后手动做模板,访问页面,获取字体库路径,并下载到本地,对新获取的字体库字符与模板中的字符进行匹配计算,找出两个字体库间的映射关系,找到映射关系后,直接把映射的字符替换到网页文本当中去,然后再进行爬取

51 说说scrapy_redis是什么东西,有什么作用?

Scrapy-Redis 库提供了 Scrapy 分布式的队列、调度器、去重等功能

52 简单说说如果一个接口存在无法解决的加密,我们应该如何进行处理?

通过逆向分析加密算法尝试解密;若是接口的返回数据被加密的情况下可以通过模拟请求的方法来解密

53 如果在nodejs环境中使用MD5加密对一个数据加密?举例说明

const crypto = require('crypto');

function md5(data) {

  return crypto.createHash('md5').update(data).digest('hex');

}

const myData = "Hello, world!";

const md5Hash = md5(myData);

console.log(md5Hash); // 输出MD5加密后的字符串

54 nodejs 环境中是否有window ,如果没有它的公共变量是什么?

在Node.js环境中,没有浏览器窗口,因此也没有window对象。Node.js提供了一个名为global的全局对象,它可以用于模拟window对象中的某些属性和方法

55 什么是ob混淆,如何能够判断一段代码是否进行过ob混淆,它有什么具体特征?

OB 混淆是指将 JavaScript 代码中的变量名、函数名、字符串等替换为无意义的字符串,从而增加代码的保护性和防止代码的逆向分析。

一般由一个大数组或者含有大数组的函数、一个自执行函数、解密函数和加密后的函数四部分组成; 函数名和变量名通常以 _0x 或者 0x 开头,后接 1~6 位数字或字母组合; 3、自执行函数,进行移位操作,有明显的 push、shift 关键字

56 如果要实现带验证码的模拟登录,有哪些方法思路?

要实现模拟登录,我们只需要模拟这个请求就好了,登录完成之后获取 Response 设置的 Cookies,将 Cookies 保存好,以后后续的请求带上 Cookies 就可以正常访问了

模拟请求登录结果,带上必要的登录信息,获取 JWT 的结果,后续的请求在 Request Headers 里面加上 Authorization 字段,值就是 JWT 对应的内容。

57 说说代理IP池实现 的思路,分成哪几个部分,每个部分主要负责实现什么功能,整个架构如何运行的。

在redis数据库中建一个列表,表空时获取代理入库,请求网站时从头弹出一个代理,请求成功从队尾插入,不计数,失败也从队尾插入,计数+1失败次数过多不再插入队尾

存储模块使用 Redis 的有序集合,用来做代理的去重和状态标识,同时它也是中心模块和基础模块,将其他模块串联起来。

获取模块定时从代理网站获取代理,将获取的代理传递给存储模块,并保存到数据库。

检测模块定时通过存储模块获取所有代理,并对代理进行检测,根据不同的检测结果对代理设置不同的标识。

接口模块通过 Web API 提供服务接口,接口通过连接数据库并通过 Web 形式返回可用的代理。

58 选择代理IP的标准有哪些?

请求速度,安全性,单次最大能提取代理ip数,请求间隔,价格

59 如何用ddddocr 识别一段汉字,举例说明

# test.py

import ddddocr

ocr = ddddocr.DdddOcr(show_ad=False)  # show_ad=False关闭广告

with open("./img/1.jpg", "rb") as f1:

    im = f1.read()

    yzm1 = ocr.classification(im)

with open("./img/2.jpg", "rb") as f2:

    im = f2.read()

    yzm2 = ocr.classification(im)

print(yzm1, yzm2)

60 如果一个网站是瀑布流的形式,没有最大页数,那么我们翻到超过最大页之后有哪些可能性?如何处理?

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值