python面试题(一)

python面试题

1、一行代码实现1–100之和

利用sum()函数求和

In [1]: sum(range(1,101))
Out[1]: 5050

2、如何在一个函数内部修改全局变量

函数内部global声明 修改全局变量

In [2]: a = 5
    
In [3]: def fn():
   ...:     global a
   ...:     a = 4
   ...:
    
In [4]: fn()
    
In [5]: print(a)
4

3、列出5个python标准库

os:提供了不少与操作系统相关联的函数

sys: 通常用于命令行参数

re: 正则匹配

math: 数学运算

datetime:处理日期时间

4、字典如何删除键和合并两个字典

del和update方法

In [6]: dic = {"name":"zs","age":"18"}
    
In [7]: del dic["name"]
    
In [8]: dic
Out[8]: {'age': '18'}
    
In [9]: dic2 = {"name":"ls"}
    
In [10]: dic.update(dic2)
    
In [11]: dic
Out[11]: {'age': '18', 'name': 'ls'}

5、谈下python的GIL

GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。

多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

6、python实现列表去重的方法

先通过集合去重,在转列表

In [20]: list = [11,12,13,14,15,16,13]
    
In [21]: a = set(list)
    
In [22]: a
Out[22]: {11, 12, 13, 14, 15, 16}
    
In [23]: [x for x in a]
Out[23]: [11, 12, 13, 14, 15, 16]

**7、fun(*args,*kwargs)中的*args,*kwargs什么意思?

*args**kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。这里的不定的意思是:预先并不知道,函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键字。*args是用来发送一个非键值对的可变数量的参 数列表给一个函数.这里有 个例子帮你理解这个概念:

In [24]: def dem(args_f,*args_v):
    ...:     print(args_f)
    ...:     for x in args_v:
    ...:         print(x)
    ...:
        
In [25]: dem('a','b','c','d')
a
b
c
d

**kwargs允许你将不定长度的键值对,作为参数传递给-个函数。如果你想要在一个函数里处理带名字的参数,你应该使用**kwargs。这里有个例子帮你理解这个概念:**kwargs允许你将不定长度的键值对,作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数,你应该使用**kwargs。这里有个例子帮你理解这个概念:

In [28]: def dem(**args):
    ...:     for k,v in args.items():
    ...:         print(k,v)
    ...:
        
In [29]: dem(name='zz')
name zz

8、python2和python3的range(100)的区别

python2返回列表,python3返回迭代器,节约内存

9、一句话解释什么样的语言能够用装饰器?

函数可以作为参数传递的语言,可以使用装饰器

10、python内建数据类型有哪些

整型–int

布尔型–bool

字符串–str

列表–list

元组–tuple

字典–dict

11、简述面向对象中__new__和__init__区别

__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数,

In [31]: class Bike:
    ...:     def __init__(self,newWheelNum,newColor):
    ...:         self.wheelNum = newWheelNum
    ...:         self.color = newColor
    ...:     def move(self):
    ...:         print('sssss')
    ...:

In [32]: BM = Bike(2,'green')

In [33]: print("颜色%s"%BM.color)
颜色green

In [34]: print('数量%d'%BM.wheelNum)
数量2

1、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别

2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例

3、__init__有一个参数self,就是这个__new__返回的实例,__init____new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

In [35]: class A(object):
    ...:     def __init__(self):
    ...:         print("This is __init__",self)
    ...:     def __new__(cls):
    ...:         print("This is cls's ID",id(cls))
    ...:         print("This is __new__",object.__new__(cls))
    ...:         return object.__new__(cls)
    ...:
        
In [36]: A()
This is cls's ID 2419503142488
This is __new__ <__main__.A object at 0x0000023357893448>
This is __init__ <__main__.A object at 0x0000023357893448>
Out[36]: <__main__.A at 0x23357893448>

12、简述with方法打开处理文件帮我我们做了什么?

打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open

写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close

13、列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]

map()函数第一个参数是fun,第二个参数是一般是list,第三个参数可以写list,也可以不写,根据需求

In [37]: lis = [1,2,3,4,5]
In [38]: def fn(x):
    ...:     return x**2
    ...:
        
In [39]: res = map(fn,lis)
    
In [40]: res
Out[40]: <map at 0x23357602d08>
    
In [41]: res = [i for i in res if i>10]
    
In [42]: res
Out[42]: [16, 25]

14、python中生成随机整数、随机小数、0–1之间小数方法

随机整数:random.randint(a,b),生成区间内的整数

随机小数:习惯用numpy库,利用np.random.randn(5)生成5个随机小数

0-1随机小数:random.random(),括号中不传参

In [45]: result = random.randint(10,20)
    
In [46]: res = np.random.randn(5)
    
In [47]: ret = random.random()
    
In [48]: print("正整数",result)
正整数 10

In [49]: print("5个随机小数",res)
5个随机小数 [-1.0842771   0.44870887  2.08266221 -2.2804419  -0.49320772]

In [50]: print("0-1随机小数",ret)
0-1随机小数 0.6645325980490703

15、避免转义给字符串加哪个字母表示原始字符串?

r , 表示需要原始字符串,不转义特殊字符

16、

中国
用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的

In [1]: import re
    
InIn [2]: str = '
中国
,用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的'
In [3]: res = re.findall(r'>(.*?)<',str) In [4]: print(res) ['中国']

17、python中断言方法举例

assert()方法,断言成功,则程序继续执行,断言失败,则程序报错

In [5]: a = 3

In [6]: assert(a>1)

In [7]: b = 4

In [8]: assert(b<7)

In [9]: assert(b>7)
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-9-bb60b8ff3db1> in <module>
----> 1 assert(b>7)

AssertionError:

18、数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句

select  distinct  name  from  student

19、10个Linux常用命令

ls  pwd  cd  touch  rm  mkdir  tree  cp  mv  cat  more  grep  echo 

20、python2和python3区别?列举5个

1、Python3 使用 print 必须要以小括号包裹打印内容,比如 print(‘hi’)

​ Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print ‘hi’

2、python2 range(1,10)返回列表,python3中返回迭代器,节约内存

3、python2中使用ascii编码,python中使用utf-8编码

4、python2中unicode表示字符串序列,str表示字节序列

python3中str表示字符串序列,byte表示字节序列

5、python2中为正常显示中文,引入coding声明,python3中不需要

6、python2中是raw_input()函数,python3中是input()函数

21、列出python中可变数据类型和不可变数据类型,并简述原理

不可变数据类型:数值型、字符串型string和元组tuple

不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址),如下图用id()方法可以打印对象的id

In [10]: a = 3

In [11]: b = 3

In [12]: id(a)
Out[12]: 140707111215568

In [13]: id(b)
Out[13]: 140707111215568

可变数据类型:列表list和字典dict;

允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

In [15]: a = [1,2]

In [16]: b = [1,2]

In [17]: id(a)
Out[17]: 2517729695496

In [18]: id(b)
Out[18]: 2517730887240

22、s = “ajldjlajfdljfddd”,去重并从小到大排序输出"adfjl"

set去重,去重转成list,利用sort方法排序,reeverse=False是从小到大排

list是不 变数据类型,s.sort时候没有返回值,所以注释的代码写法不正确

In [19]: s = "ajldjlajfdljfddd"

In [20]: s = set(s)

In [21]: s = list(s)

In [22]: s.sort(reverse=False)

In [23]: res = ''.join(s)

In [24]: res
Out[24]: 'adfjl'

23、用lambda函数实现两个数相乘

In [25]: sum = lambda a,b:a*b

In [26]: sum(5,5)
Out[26]: 25

24、字典根据键从小到大排序

dic={“name”:“zs”,“age”:18,“city”:“深圳”,“tel”:“1362626627”}

In [27]: dic={"name":"zs","age":18,"city":"深圳","tel":"1362626627"}

In [28]: lis = sorted(dic.items(),key=lambda i : i[0],reverse=False)

In [29]: lis
Out[29]: [('age', 18), ('city', '深圳'), ('name', 'zs'), ('tel', '1362626627')]

In [30]: dict(lis)
Out[30]: {'age': 18, 'city': '深圳', 'name': 'zs', 'tel': '1362626627'}

25、利用collections库的Counter方法统计字符串每个单词出现的次数"kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"

In [1]: from collections import Counter

In [2]: a = "kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"

In [3]: res = Counter(a)

In [4]: res
Out[4]:
Counter({'k': 1,
         'j': 3,
         'a': 4,
         'l': 9,
         'f': 5,
         ';': 6,
         'd': 3,
         's': 2,
         'h': 6,
         'g': 1,
         'b': 1})

你可能感兴趣的:(Python)