python爬虫罕见面试题(一)_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

媒介

  之以是在这里写下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 = 1
2 def fun(a):
3     a = 2
4 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('''i
2 love
3 you''') #特别功用,能够直接打印多行内容,而前面两种状况须要显现输入n能力换行

输出结果:

1 i
2 love
3 you

而单引号和双引号若是想要完成上面的结果,须要加上换行符。

1 print('inlovenyou')
3、如安在一个function里设置一个全局的变量。

先说观点,全局变量是指界说在函数外部的变量。全局变量的作用域为全局。

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

这里举个例子,若是把函数比作国度,那末全局就是环球,全局变量好比是阿拉伯数字,每一个国度都熟悉。

以是,依据界说能够晓得,在函数内部是没法界说一个全局变量的,只能做到修正已界说的全局变量。

4、python内里怎样拷贝一个工具?(赋值、浅拷贝、深拷贝的区分)

在python中怎样拷贝一个工具是须要依据详细的需求来定的。

(1)赋值:实在就是工具的援用。相当于C的指针,修正了个中一个工具,另一个随着转变。注重关于不可变工具而言,若是修正了个中一个工具,就相当于修正它的指针指向,另一个工具是不会随着转变的。

1 a = ['1', '2'] # a是一个可变工具
2 b = a
3 a = a.pop()
4 print(b) # 修正了a,b也随着变

输出结果:

1 ['1']

当a为不可变工具时:

1 a = 1
2 b = a
3 a = 2
4 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 copy
2 a = 'TEST_STRING'
3 b = copy.copy(a)
4 print(a, b)
5 a = a.lower()
6 print(a, b)

输出结果:

1 TEST_STRING TEST_STRING
2 test_string TEST_STRING

 (3)深拷贝:完整拷贝了父工具和子工具(详细的要领有:b = copy.deepcopy(a))

1 import copy
2 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 copy
2 a = 'TEST_STRING'
3 b = copy.deepcopy(a)
4 print(a, b)
5 a = a.lower()
6 print(a, b)

输出结果:

1 TEST_STRING TEST_STRING
2 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 123
2 other param hello
3 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 123
2 name jack
3 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)   1
5 print(dic)

输出结果:

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

 

要领二:

应用python的collections包。

1 from collections import Counter
2 
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 Bob
2 Lily
3 Lily

以上。

 

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。