python爬虫常见面试题(一)

python爬虫面试题集锦及答案 传统定义:分布式存储系统是大量 PC 服务器通过 Internet 互联,对外提供一个整体的服务。分布式存储系统具有以下的几个特性:可扩展 :分布式存储系统可以扩展到几百台甚至几千台这样的一个集群规模,系统的 整体性能线性增长。低成本 :分布式存储系统的自动容错、自动负载均衡的特性,允许分布式存储系统可 以构建在低成本的服务器上。另外,线性的扩展能力也使得增加、减少服务器的成本低, 实现分布式存储系统的自动运维。 阅读详情

前言

  之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆;二是给自己一个和大家交流的机会,互相学习、进步,希望不正之处大家能给予指正;三是我也是互联网寒潮下岗的那批人之一,为了找工作而做准备。

一、题目部分

1、python中常用的数据结构有哪些?请简要介绍一下。

2、简要描述python中单引号、双引号、三引号的区别。

3、如何在一个function里设置一个全局的变量。

4、python里面如何拷贝一个对象?(赋值、浅拷贝、深拷贝的区别)

5、如果custname字符串的编码格式为uft-8,如何将custname的内容转化为gb18030的字符串?

6、请写出一段python代码实现删除list中的重复元素。

7、这两个参数是什么意思?args和 kwargs。

8、

(1)统计如下list单词及其出现的次数。

a=['apple', 'banana', 'apple', 'tomato', 'orange', 'apple', 'banana', 'watermeton']

(2)给列表中的字典排序:例如有如下list对象:

alist=[{"name":"a", "age":20}, {"name":"b", "age":30}, {"name":"c", "age":25}] 将alist中的元素按照age从小到大排序。

(3)写出下列代码的运行结果

1 a = 12 def fun(a):3     a = 24 fun(a)5 print(a)
1 a = []2 def fun(a):3     a.append(1)4 fun(a)5 print(a)

复制代码

1 class Person:2     name = 'Lily'3  4 p1 = Person()5 p2 = Person()6 p1.name = 'Bob'7 print(p1.name)8 print(p2.name)9 print(Person.name)

复制代码

二、解答部分

注:以下答案,均为google后结合自己学所知识回答,可能会有不正确的地方,错误之处希望大家帮我指正出来,谢谢。

1、python中常用的数据结构有哪些?请简要介绍一下。

python中常见的数据结构有:列表(list),字典(dict),元组(tuple),字符串(string),集合(set),数字(int或long或float。。。)等。

其中,列表,元祖和字符串可以统一归为序列类,即这三种数据结构中的元素是有序的。比如,他们都有索引(下标)操作,还有切片、相加和长度(len),最大值(max),最小值(min)操作。这是他们的共同点。

补充:python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。

另外,关于这个问题,面试官很容易引出另一个问题:python中的哪些数据类型是可变的,哪些是不可变的?

首先,可变/不可变是针对该对象所指向的内存中的值是否可变来判断的。如可变类型的数据类型有列表和字典。不可变类型的数据类型有字符串,元组,集合,数字。

就举个最简单的数字的例子,python中有小整数池的概念,即[-5,256]范围内的整数,python解释器对他们做了特殊处理,都放在内存中的固定位置,不会因为你的操作二发生变化。

现在:a = 1 ,然后我们又重新对a赋值,a = 2,在重新赋值的过程中,整数1所对应的内存地址没有和数字的大小都没有发生变化,还在内存中的固定位置。整数2也是如此。变化的是a的指针(这里引用C中的概念)从指向数字1变成数字2。a对象指向的内存中的值没有发生变化,因此数字是不可变类型的数据类型。字符串,集合也是同理。

2、简要描述python中单引号、双引号、三引号的区别。

 首先,单引号和双引号在使用时基本上没有什么区别,唯一需要注意的是:当字符串中有单引号时,最好在外面使用双引号;当有双引号时,最好在外面使用单引号。

三引号一般不常用,除了用来做注释之外,还可以用来打印多行字符串。特殊用途,是可以打印多行字符串。

1 print('''i2 love3 you''') #特殊功能,可以直接打印多行内容,而前面两种情况需要显示输入
才能换行

输出结果:

1 i2 love3 you

而单引号和双引号如果想要实现上面的效果,需要加上换行符。

1 print('i\nlove\nyou')

3、如何在一个function里设置一个全局的变量。

先说概念,全局变量是指定义在函数外部的变量。全局变量的作用域为全局。

局部变量是指定义在函数内部的变量。局部变量的作用域为函数内,除了函数就无效了。

这里举个例子,如果把函数比作国家,那么全局就是全球,全局变量好比是阿拉伯数字,每个国家都认识。

所以,根据定义可以知道,在函数内部是无法定义一个全局变量的,只能做到修改已经定义的全局变量。

4、python里面如何拷贝一个对象?(赋值、浅拷贝、深拷贝的区别)

在python中如何拷贝一个对象是需要根据具体的需求来定的。

(1)赋值:其实就是对象的引用。相当于C的指针,修改了其中一个对象,另一个跟着改变。注意对于不可变对象而言,如果修改了其中一个对象,就相当于修改它的指针指向,另一个对象是不会跟着变化的。

1 a = ['1', '2'] # a是一个可变对象2 b = a3 a = a.pop()4 print(b) # 修改了a,b也跟着变

输出结果:

1 ['1']

当a为不可变对象时:

1 a = 12 b = a3 a = 24 print('b = {}'.format(b))

输出结果:

1 b = 1

 

(2)浅拷贝:拷贝父对象,但是不会拷贝父对象的子对象。(具体的方法有:b = copy.copy(a),切片如b = a[1:4])

1 a = {1: [1, 2, 3]}2 b = a.copy()3 print(a, b)4 a[1].append(4)5 print(a, b)

输出结果为:

{1: [1, 2, 3]} {1: [1, 2, 3]}
{1: [1, 2, 3, 4]} {1: [1, 2, 3, 4]}

当a为不可变对象时:

1 import copy2 a = 'TEST_STRING'3 b = copy.copy(a)4 print(a, b)5 a = a.lower()6 print(a, b)

输出结果:

1 TEST_STRING TEST_STRING2 test_string TEST_STRING

 (3)深拷贝:完全拷贝了父对象和子对象(具体的方法有:b = copy.deepcopy(a))

1 import copy2 a = {1: [1, 2, 3]}3 b = copy.deepcopy(a)4 print(a, b)5 a[1].append(4)6 print(a, b)

输出结果:

1 {1: [1, 2, 3]} {1: [1, 2, 3]}2 {1: [1, 2, 3, 4]} {1: [1, 2, 3]}

当a为不可变对象时:

1 import copy2 a = 'TEST_STRING'3 b = copy.deepcopy(a)4 print(a, b)5 a = a.lower()6 print(a, b)

输出结果:

1 TEST_STRING TEST_STRING2 test_string TEST_STRING

下面是图解:

1、b = a: 赋值引用,a 和 b 都指向同一个对象。

2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

3、b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

总结:

(1)当对象为不可变类型时,不论是赋值,浅拷贝还是深拷贝,那么改变其中一个值时,另一个都是不会跟着变化的。

(2)当对象为可变对象时,如果是赋值和浅拷贝,那么改变其中任意一个值,那么另一个会跟着发生变化的;如果是深拷贝,是不会跟着发生改变的。

啊,这一题答案真的是好长啊,累到掉渣!歇会儿。。。

5、如果custname字符串的编码格式为uft-8,如何将custname的内容转化为gb18030的字符串?

先将custname编码格式转换为unicode,在转换为gb18030。即custname.decode('utf-8').encode('gb18030')。

注意:unicode编码是一种二进制编码,是转换编码的中间桥梁。比如需要将utf-8转换为gbk,那么就需要先转换为unicode(decode),再转为gbk(encode)。

6、请写出一段python代码实现删除list中的重复元素。

两种方法:

(1)利用字典的fromkeys来自动过滤重复值

(2)利用集合set的特性,元素是非重复的

方法一:

复制代码

1 a = [1, 2, 3, 4, 5, 2, 3]2 3 def fun1(a):4     a = list(set(a))5     print(a)6 7 fun1(a)

复制代码

方法二:

复制代码

1 a = [1, 2, 3, 4, 5, 2, 3]2 3 def fun1(a):4     b = {}5     b = b.fromkeys(a)6     c = list(b.keys())7     print(c)8 9 c = fun1(a)

复制代码

7、这两个参数是什么意思?args和 kwargs。

首先,我想说的是*args和**kwargs并不是必须这样写,只有前面的*和**才是必须的。你可以写成*var和**vars。而写成*args和**kwargs只是约定俗称的一个命名规定。

*args和**kwargs主要用于函数定义,你可以将不定量的参数传递给一个函数。其中,*args 是用来发送一个非键值对的可变数量的参数列表给一个函数;**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs。

复制代码

1 def import_args(test, *args):2     print('param1', test)3     for item in args:4         print('other param', item)5 6 7 import_args('123', 'hello', '2019')

复制代码

这里传递了3个参数,按位置传参,'123'为test传参,'hello'和'2019'为*args传参,这里传了2个参数。

注意,看下面的*args的另一种用法:用来解压数据。

复制代码

1 def import_args(test, *args):2     print('param1', test)3     for item in args:4         print('other param', item)5 6 7 args = ['hello', '2019']8 import_args('123', *args)

复制代码

输出结果:

1 param1 1232 other param hello3 other param 2019

 

这段代码和上面的效果是一样的,但是这里第8行的*args和第1行的*args可是不一样的。第一行是表示函数可以接受不定数量的非键值对的参数,用来传参使用的。第八行是用来解压列表

['hello', '2019']的每一项数据的,用来解压参数的。这是*args的两种用法,也可说是*的两种用法,因为args是可变的。

 

接下来说说**kwargs。

复制代码

1 def import_kwargs(test, **kwargs):2     print('param1', test)3     for key, value in kwargs.items():4         print(key, value)5 6 7 d = {'name': 'jack', 'age': 26}8 import_kwargs('123', **d)

复制代码

**kwargs用来传递带键值对的参数,而**也是用来解压字典容器内的参数。

输出结果:

1 param1 1232 name jack3 age 26

总结:*args和**kwargs都是用于函数中传递参数的,*args传递的是非键值对的参数,**kwargs传递的是带键值对的参数,如果还有普通参数需要传递,那么应该先传递普通的参数。

8、

(1)统计如下list单词及其出现的次数。

a=['apple', 'banana', 'apple', 'tomato', 'orange', 'apple', 'banana', 'watermeton']

方法一:

利用字典。

1 a = ['apple', 'banana', 'apple', 'tomato', 'orange', 'apple', 'banana', 'watermeton']2 dic = {}3 for key in a:4     dic[key] = dic.get(key, 0) + 15 print(dic)

输出结果:

1 {'apple': 3, 'banana': 2, 'tomato': 1, 'orange': 1, 'watermeton': 1}

 

方法二:

利用python的collections包。

1 from collections import Counter2 3 a = ['apple', 'banana', 'apple', 'tomato', 'orange', 'apple', 'banana', 'watermeton']4 d = Counter(a)5 print(d)

输出结果:

1 Counter({'apple': 3, 'banana': 2, 'tomato': 1, 'orange': 1, 'watermeton': 1})  # 是一个类似字典的结构

(2)给列表中的字典排序:例如有如下list对象:

alist=[{"name":"a", "age":20}, {"name":"b", "age":30}, {"name":"c", "age":25}] 将alist中的元素按照age从小到大排序。

利用list的内建函数,list.sort()来进行排序。

1 alist = [{"name": "a", "age": 20}, {"name": "b", "age": 30}, {"name": "c", "age": 25}]2 alist.sort(key=lambda x: x['age'])3 print(alist)

这是一种效率很高的排序方法。

输出结果:

1 [{'name': 'a', 'age': 20}, {'name': 'c', 'age': 25}, {'name': 'b', 'age': 30}]

(3)写出下列代码的运行结果

第一段代码的运行结果为:1

分析,在函数外面定义了一个全局变量a为1,在函数内部定义了一个局部变量a为2。局部变量在离开函数后就失效了。

所以,结果为全局变量的a的值。如果在a=2之前加上global a,声明为全局变量,那么结果为2。

第二段代码的运行结果为:[1]

这是因为,将a传入到function中,这相当于对a进行赋值引用。由于a是可变类型的,所以在函数内部修改a的时候,外部的全局变量a也跟着变化。

第三段代码的运行结果为:

1 Bob2 Lily3 Lily

以上。

原文出处:https://www.cnblogs.com/tianyiliang/p/10212951.html  


 

常见的python与爬虫面试题准备好了 init:对象初始化方法new:创建对象时候执行的方法,单列模式会用到str:当使用print输出对象的时候,只要自己定义了str(self)方法,那么就会打印从在这个方法中return的数据del:删除对象执行的方法散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字 “指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。 阅读详情

相关推荐

爬虫面试题梳理

传统定义:分布式存储系统是大量 PC 服务器通过 Internet 互联,对外提供一个整体的服务。分布式存储系统具有以下的几个特性:可扩展 :分布式存储系统可以扩展到几百台甚至几千台这样的一个集群规模,系统的 整体性能线性增长。低成本 :分布式存储系统的自动容错、自动负载均衡的特性,允许分布式存储系统可 以构建在低成本的服务器上。另外,线性的扩展能力也使得增加、减少服务器的成本低, 实现分布式存储系统的自动运维。

m0_74653634的博客 2527

100道爬虫面试题以及答案(宝典级别的)

爬虫的面试题以及答案

wanlitengfei的专栏 1万+

我的爬虫入门书 —— 《Python3网络爬虫开发实战(第二版)》

年前学习python基础知识之后,在好奇心的推动下,我开始接触了python网络爬虫,而在刚开始接触网络爬虫时,繁多的资料让我猝不及防,对于习惯于优先通过书籍进行自主学习的我来说,通过长期看视频学习反而不是很习惯,但是在网络上找到的许多爬虫相关资料,不是说的过于简略,就是部分内容有些“过时”。该跟谁走?该怎么走?这个问题那段时间一直困扰着我。所幸,在热心群友的推荐下(haha,真的很热心的一个老哥),我入手了崔大写的《Python3网络爬虫开发实战(第二版)》,找到了符合我状况的“引路书”。

weixin_68789096的博客 2157

python爬虫面试题-python爬虫常见面试题(一)

前言之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆;二是给自己一个和大家交流的机会,互相学习、进步,希望不正之处大家能给予指正;三是我也是互联网寒潮下岗的那批人之一,为了找工作而做准备。一、题目部分1、python中常用的数据结构有哪些?请简要介绍一下。2、简要描述python中单引号、双引号、三引号的区别。3、如何在一个function里设置一个全局的变量。4、py...

weixin_37988176的博客 991

python爬虫常见的一些面试题

1. 什么是爬虫 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 2. 什么是URL URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的...

Brodie~的博客 1089

Python网络爬虫面试题3

Web爬虫是一种自动化程序或脚本,用于浏览和提取互联网上的内容。爬虫通过发送HTTP请求获取网页的HTML内容,然后解析和提取所需的数据。创建项目:使用创建新项目。定义Item:在items.py文件中定义需要抓取的数据结构。编写Spider:在spiders目录下编写Spider,定义初始URL和解析逻辑。处理数据:在中编写数据处理逻辑,如清洗和存储数据。运行爬虫:使用命令运行爬虫。XPath是一种用于在XML文档中定位节点的语言,常用于解析HTML和XML。

闲人编程的博客 2317

python爬虫字符问题_python爬虫常见面试题(一)

前言之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆;二是给自己一个和大家交流的机会,互相学习、进步,希望不正之处大家能给予指正;三是我也是互联网寒潮下岗的那批人之一,为了找工作而做准备。一、题目部分1、python中常用的数据结构有哪些?请简要介绍一下。2、简要描述python中单引号、双引号、三引号的区别。3、如何在一个function里设置一个全局的变量。4、py...

weixin_35980267的博客 137

3万多字200道python爬虫笔试面试及答案汇总,适合初学者入门.docx

3万多字200道python爬虫笔试面试及答案汇总,适合初学者入门,几乎涵盖所有爬虫面试题,适合新手,应届生浏览,包括真实笔试、面试题,总共3万多字。涵盖各种题型

python 爬题库_python爬虫常见面试题(一)

前言之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆;二是给自己一个和大家交流的机会,互相学习、进步,希望不正之处大家能给予指正;三是我也是互联网寒潮下岗的那批人之一,为了找工作而做准备。一、题目部分1、python中常用的数据结构有哪些?请简要介绍一下。2、简要描述python中单引号、双引号、三引号的区别。3、如何在一个function里设置一个全局的变量。4、py...

weixin_35260789的博客 916

Python面试常见问题汇总集锦(含爬虫工程师面试考点)

Python面试常见问题汇总集锦(含爬虫工程师面试考点)

基于STM32环境温湿度监测系统设计

基于STM32环境温湿度监测系统设计1. 实验目的2. 任务和要求3. proteus仿真图4. 实验代码 1. 实验目的 (1) 掌握使用 KEIL MDK5 进行软件开发的具体流程; (2) 掌握硬件电路的设计方法; (3) 掌握 STM32 微控制器的程序设计及代码编写方法。 2. 任务和要求 (1)在 STM32F103 平台下,通过温度传感器 DS18B20 和湿度传感器 DHT11 实现环境温湿度信息的采集; (2)将温度传感器和湿度传感器所采集的数据在 LCD 液晶屏幕上显示出来,超

唯一的博客 2万+

python 引用传参_python爬虫常见面试题(一)

前言之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆;二是给自己一个和大家交流的机会,互相学习、进步,希望不正之处大家能给予指正;三是我也是互联网寒潮下岗的那批人之一,为了找工作而做准备。一、题目部分1、python中常用的数据结构有哪些?请简要介绍一下。python中常见的数据结构有:列表(list),字典(dict),元组(tuple),字符串(string),集合...

weixin_31898831的博客 153

基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----上篇(第123点)

基于STM32F103C8T6的循迹避障小车完整制作过程 由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程种也参考了很多大神分享的资料,学到很多的东西。但是资料都比较分散,有些东西也不好找,在这里就想把自己制作小车的一个整体过程记录分享一下,希望能够帮到你。 我自己也算是一个小白,之前有做过 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎...

weixin_43924857的博客 14万+

python面试题_python爬虫常见面试题(一)

前言之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆;二是给自己一个和大家交流的机会,互相学习、进步,希望不正之处大家能给予指正;三是我也是互联网寒潮下岗的那批人之一,为了找工作而做准备。一、题目部分1、python中常用的数据结构有哪些?请简要介绍一下。python中常见的数据结构有:列表(list),字典(dict),元组(tuple),字符串(string),集合...

weixin_39946300的博客 264

计算机考研408复试题汇总

TCP连接是全双工的,两端都可以先挥手 其中一端完成数据发送任务后,发送一个FIN包来终止,另一端针对这个FIN包回复确认包, 直到另一端也发送请求终止数据包FIN,另一端作出确认应答,并且还要发送一个ACK=1表示确认号有效,如果没有收到这个就可以进行重传.

ca1m4n的博客 1万+

银河麒麟系统V10 sp1,安装wine 9.0

银河麒麟系统V10 sp1 x86_64,安装wine 9.0

daqinzl的专栏 1万+

Python爬虫常见的面试题

(1)通过请求头的一些特征来判断是否为爬虫。user-agent被检测,那可以找一些常见的user-agent放入列表,然后每次爬取随机选一个。referer检测,这种情况就是我们可以将其设置为网站首页或者百度这些的,具体看网站。(2)通过访问频率来判断是否是一个爬虫。一般就是设置抓取时间间隔。(3)爬取频繁将ip进行封禁。使用代理IP来解决。(4)验证码反爬简单的图形验证码:使用常见的一些模块去识别。例如ddddocr。

不愿意透露姓名的网友 1万+

电镀技术:微型制造的原子级加法工艺与核心优势

电镀是一种利用电解原理在基材表面沉积金属层的表面处理技术,其本质是通过电场控制溶液中金属离子的迁移与还原,实现原子级的可控沉积。这一过程的核心在于对电流密度、温度、添加剂等参数的精密调控,从而实现对镀层结晶结构、性能的“编程”。从技术价值看,电镀作为一种“加法制造”工艺,在微观尺度上具有无与伦比的保形性和材料灵活性,能够实现复杂三维结构的均匀覆盖与功能复合。在应用场景上,它尤其契合现代微型化制造的需求,例如在集成电路的铜互连填充、高密度PCB板微孔金属化、MEMS传感器电极制备以及柔性电子器件制造中发挥着不

weixin_42524842的博客 528

Python网络爬虫原理及实践

scrapy.cfg是scrapy框架的入口文件,settings节点指定爬虫的配置信息,deploy节点用于指定scrapyd服务的部署路径。

mate1357的博客 1879

【TestCenter】RFC2544时延测试

本文介绍了使用Spirent TestCenter测试路由器PPPOE时延的RFC2544标准方法。RFC2544定义了三种时延类型:转发时延(LILO)、存储转发时延(LIFO)和直通时延(FIFO)。文章详细说明了测试步骤,包括测试拓扑搭建、PPPOE环境配置、RFC2544测试任务创建等关键环节,并介绍了如何设置时延参数和查看测试报告。测试结果表明,大字节帧的时延高于小字节帧,且负载越高时延越大。该测试方法遵循国际标准,可全面评估网络设备在不同负载下的性能表现。

lai_2020的博客 1400

HT7533与1117稳压芯片动态特性对比:实测分析与优化策略

本文深入对比了HT7533与1117稳压芯片的动态特性,包括电压过冲和瞬态响应能力,并提供了实测数据与优化策略。HT7533适合低功耗设备,而1117在大电流和稳定性要求高的场景表现更优。文章还分享了PCB布局和电容选择的实用建议,帮助工程师根据项目需求选择合适的稳压芯片。

weixin_28454475的博客 610
上一篇: js加密原理
下一篇: scrapy-settings
djs123DJS
博客等级 码龄9年 49粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值