本文精选自各大公司经典面试题,版权归原作者所有。

 

1. Python 的特点和优点是什么?

答案:略。

 

2. 什么是lambda函数?它有什么好处?

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。 lambda 函数不能包含命令,它们所包含的表达式不能超过一个。不要试图向lambda函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。

lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个:

 

>>> g = lambda x, y: x*y

>>> g(3,4)

12

>>> g = lambda x, y=0, z=0: x+y+z

>>> g(1)

1

>>> g(3, 4, 7)

14

 

也能够直接使用lambda函数,不把它赋值给变量:

 

>>> (lambdax,y=0,z=0:x+y+z)(3,5,6)

14

 

如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda函数。否则,你还是定义函数才对,毕竟函数没有这么多限制。

 

3. 深拷贝和浅拷贝的区别是什么?

深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中,我们使用 deepcopy()函数进行深拷贝,使用方法如下:

 

>>> import copy

>>> b=copy.deepcopy(a)

 

浅拷贝是将对象的引用复制给另一个对象。因此,如果我们在副本中进行更改,则会影响原对象。使用 copy()函数进行浅拷贝,使用方法如下:

 

>>> b=copy.copy(a)

 

4. 列表和元组有什么不同?

 

try…except…except…[else…][finally…]

 

执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行;如果存在finally语句,最后总是会执行。

 

5.   Python里面如何生成随机数?

答:random模块

随机整数:random.randint(a,b):返回随机整数x,a<=x<=b

random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。

随机实数:random.random( ):返回0到1之间的浮点数

random.uniform(a,b):返回指定范围内的浮点数

 

6. 如何在Python中实现多线程?

a.  Python有一个multi-threading包,但是如果你想让multi-thread加速你的代码,那么使用它通常不是一个好主意。

b. Python有一个名为GlobalInterpreter Lock(GIL)的结构。 GIL确保只有一个“线程”可以在任何时候执行。一个线程获取GIL,做一点工作,然后将GIL传递到下一个线程。

c. 这种情况很快发生,因此对于人眼看来,您的线程似乎并行执行,但它们实际上只是轮流使用相同的CPU核心。

d. 所有这些GIL传递都增加了执行的开销。这意味着如果您想让代码运行得更快,那么使用线程包通常不是一个好主意。

 

7.     如何在python中使用三元运算符?

三元运算符是用于显示条件语句的运算符。这包含用于评估为true或false值的语句。

句法:三元操作符语法如下,

[on_true] if [expression] else [on_false]

 

例:

 x,y = 25,50

 big = x if x < y else y

 

如果x <y为真,则返回值为big= x,如果不正确则返回big = y作为结果。

 

8. 用一个例子解释Python中的继承。

继承允许一个类获得另一个类的所有成员(比如属性和方法)。继承提供代码可重用性,使创建和维护应用程序变得更容易。我们继承的类称为super-class,继承的类称为派生/子类。

以下是Python支持的不同类型的继承:

a. 单一继承 - 派生类获取单个超类的成员。

b. Multi-level继承 - 从基类base1继承的派生类d1,d2继承自base2。

c. 分层继承 - 从一个基类可以继承任意数量的子类

d. 多重继承 - 派生类从多个基类继承。

 

9. 解释Flask是什么及其好处?

Flask是基于“Werkzeug,Jinja2和良好意图”BSD许可证的Python网络微框架。 Werkzeug和Jinja2是它的两个依赖项。这意味着它对外部库几乎没有依赖性。它使框架变得轻盈,只是少量依赖于更新和更少的安全性错误。

会话基本上允许您记住从一个请求到另一个请求的信息。在flask中,会话使用签名的cookie,以便用户可以查看会话内容并进行修改。当且仅当有密钥Flask.secret_key,用户可以修改会话。

 

10. Python中的字典是什么?

Python中的内置数据类型称为字典。它定义了键和值之间的one-to-one关系。字典包含一对键及其对应的值。字典由键来索引。

我们来举个例子:

以下示例包含一些键,Country, Capital & PM,它们的相应值分别是印度,德里和莫迪。

dict={'Country':'India','Capital':'Delhi','PM':'Modi'}

print dict[Country]

India

print dict[Capital]

Delhi

print dict[PM]

Modi

 

11. 什么是负指数,为什么使用它们?

Python中的序列是索引的,它由正数和负数组成。正的数字使用'0'作为第一个索引,'1'作为第二个索引,以此类推。

负数的索引从'-1'开始,表示序列中的最后一个索引,' - 2'作为倒数第二个索引,依次类推。

 

12. 如何用Python来进行查询和替换一个文本字符串?

可以使用sub()方法来进行查询和替换,sub方法的格式为:

a. sub(replacement, string[,count=0])

b. replacement是被替换成的文本

c. string是需要被替换的文本

d. count是一个可选参数,指最大被替换的数量

 

13. 解释一下python的and-or语法

与C表达式 bool ? a : b类似,但是bool and a or b,当 a 为假时,不会象C表达式 bool ? a : b 一样工作

应该将 and-or 技巧封装成一个函数:

 

defchoose(bool, a,b):return(booland[a]or[b])[0]

 

因为 [a] 是一个非空列表,它永远不会为假。甚至 a 是 0 或 '' 或其它假值,列表[a]为真,因为它有一个元素。

 

14. 请写出一段Python代码实现删除一个list里面的重复元素

1,使用set函数,set(list)

2,使用字典函数,

 

>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]

>>> b={}

>>>b=b.fromkeys(a)

>>>c=list(b.keys())

>>> c

 

15. 单引号,双引号,三引号的区别?

单引号和双引号是等效的,如果要换行,需要符号(\),三引号则可以直接换行,并且可以包含注释

如果要表示Let’s go 这个字符串

单引号:s4 = ‘Let\’s go’

双引号:s5 = “Let’s go”

s6 = ‘I realy like“python”!’

这就是单引号和双引号都可以表示字符串的原因了。

 

16. 当退出 Python 时是否释放所有内存分配?

答案是否定的。那些具有对象循环引用或者全局命名空间引用的变量,在 Python 退出是往往不会被释放

另外不会释放 C 库保留的部分内容。

 

17. Python里面search()和match()的区别?

match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none 。

 

18. 如何在Python中随机化列表中的项目?

考虑下面显示的示例:

 

from random import shuffle

x = ['Keep', 'The', 'Blue', 'Flag','Flying', 'High']

shuffle(x)

print(x)

 

以下代码的输出如下。

 

['Flying', 'Keep', 'Blue', 'High', 'The','Flag']

 

19. 在python中编译和链接的过程是什么?

编译和链接允许正确编译新扩展而不会出现任何错误,并且只有在通过编译过程时才能进行链接。如果使用动态加载,则它取决于系统提供的样式。 python解释器可用于提供配置设置文件的动态加载,并将重建解释器。

 

这需要的步骤如下:

a. 使用任何名称以及系统编译器支持的任何语言创建文件。例如file.c或file.cpp

b. 将此文件放在正在使用的发行版的Modules /目录中。

c. 在Modules /目录中存在的Setup.local文件中添加一行。

d. 使用spam file.o运行该文件

e. 成功运行此重建解释程序后,在top-level目录中使用make命令。

f.  如果文件已更改,则使用命令“make Makefile”运行rebuildMakefile。

 

20. Python解释“re”模块的split(), sub(), subn()方法。

要修改字符串,Python的“re”模块提供了3种方法。他们是:

split() - 使用正则表达式将“split”给定字符串放入列表中。

sub() - 查找正则表达式模式匹配的所有子字符串,然后用不同的字符串替换它们

subn() - 它类似于 sub(),并且还返回新字符串和替换的序号。

 

21. range和xrange之间有什么区别?

在大多数情况下,xrange和range在功能方面完全相同,它们都提供了一种生成整数列表供您使用的方法。唯一的区别是range返回一个Python列表对象,xrange返回一个xrange对象。

这意味着xrange实际上并不像run-time那样生成静态列表。它使用称为yielding的特殊技术根据需要创建值。该技术与一种称为生成器的对象一起使用。这意味着,如果你有一个非常巨大的范围,你想生成一个列表,比如10亿,xrange就是要使用的功能。

如果你有一个真正的内存敏感系统,例如你正在使用的手机,尤其如此,因为range将使用尽可能多的内存来创建整数数组,这可能导致内存错误并导致崩溃程序。

 

22. Django,Pyramid和Flask之间的差异。

Flask是“microframework”,主要用于具有更简单要求的小型应用程序。在Flask中,您必须使用外部库。

Pyramid适用于大型应用程序。它提供了灵活性,并允许开发人员为他们的项目使用正确的工具。开发人员可以选择数据库,URL结构,模板样式等。

Django也可以像Pyramid一样用于更大的应用程序。

 

23. 列出Django中的继承样式。

在Django中,有三种可能的继承样式:

抽象基类:当您只希望父类包含您不想为每个子模型键入的信息时,使用此样式。

Multi-table继承:使用此样式如果您是sub-classing现有模型并且需要每个模型都有自己的数据库表。

代理模型:您可以使用此模型,如果您只想修改模型的Python级别行为,而无需更改模型的字段。

 

24. 什么是Python monkey补丁?

在Python中,术语monkey补丁仅指run-time上的类或模块的动态修改。

考虑以下示例:

 

# m.py

class MyClass:

def f(self):

print "f()"

 

然后我们可以像这样运行monkey-patch测试:

 

import m

def monkey_f(self):

print "monkey_f()"

 

m.MyClass.f = monkey_f

obj = m.MyClass()

obj.f()

 

输出如下:

 

monkey_f()

 

我们可以看到,在模块之外,我们确实对函数f()的行为做了一些改变,实际执行的是函数monkey_f(),。

 

25. 有两个序列a,b,大小都为n,序列元素的值任意整形数,无序?

 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

 1. 将两序列合并为一个序列,并排序,为序列Source

 2. 拿出最大元素Big,次大的元素Small

 3. 在余下的序列S[:-2]进行平分,得到序列max,min

 4. 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

 

26. 如何用Python来发送邮件?

可以使用smtplib标准库。

以下代码可以在支持SMTP监听器的服务器上执行。

import sys, smtplib

 

fromaddr =raw_input(“From: “)

toaddrs = raw_input(“To: “).split(‘,’)

print “Enter message, end with ^D:”

msg = ”

while 1:

line = sys.stdin.readline()

if not line:

break

msg = msg + line

 

# 发送邮件部分

 

server = smtplib.SMTP(‘localhost’)

server.sendmail(fromaddr, toaddrs, msg)

server.quit()

 

27. 请写一个Python逻辑,计算一个文件中的大写字母数量。

 

>>> import os

 

>>>os.chdir('C:\\Users\\lifei\\Desktop')

>>> with open('Today.txt') astoday:

   count=0

   for i in today.read():

       if i.isupper():

           count+=1

print(count)

 

运行结果:

26

 

28. Python中的标识符长度能有多长?

在Python中,标识符可以是任意长度。此外,我们在命名标识符时还必须遵守以下规则:

a. 只能以下划线或者 A-Z/a-z 中的字母开头

b. 其余部分可以使用 A-Z/a-z/0-9

c. 区分大小写

d. 关键字不能作为标识符,Python中共有如下关键字:

 

29. 解释一下Python中的//,%和 ** 运算符

//运算符执行地板除法(向下取整除),它会返回整除结果的整数部分。

>>> 7//2

3

这里整除后会返回3.5。

同样地,执行取幂运算。ab会返回a的b次方。

>>> 2**10

1024

 最后,%执行取模运算,返回除法的余数。

>>> 13%7

6

>>> 3.5%1.5

0.5

 

30. 在Python中如何使用多进制数字?

我们在Python中,除十进制外还可以使用二进制、八进制和十六进制。

a. 二进制数字由0和1组成,我们使用 0b 或 0B 前缀表示二进制数。

 >>> int(0b1010)

10

 

b. 使用bin()函数将一个数字转换为它的二进制形式。

>>> bin(0xf)

‘0b1111’

 

c. 八进制数由数字 0-7 组成,用前缀 0o 或 0O 表示 8 进制数。

>>> oct(8)

‘0o10’

 

d. 十六进数由数字 0-15 组成,用前缀 0x 或者 0X 表示 16 进制数。

>>> hex(16)

‘0x10’

 

>>> hex(15)

‘0xf’

 

31. 怎样获取字典中所有键的列表?

使用 keys() 获取字典中的所有键

 

>>>mydict={'a':1,'b':2,'c':3,'e':5}

>>> mydict.keys()

dict_keys(['a', 'b', 'c', 'e'])

 

32. 怎样声明多个变量并赋值?

一共有两种方式:

>>> a,b,c=3,4,5 #This assigns 3,4, and 5 to a, b, and c respectively

>>> a=b=c=3 #This assigns 3 to a,b, and c

 

33. 元组的解封装是什么?

首先我们来看解封装:

>>> mytuple=3,4,5

>>> mytuple

(3, 4, 5)

 

这将 3,4,5 封装到元组 mytuple 中。

现在我们将这些值解封装到变量 x,y,z 中:

 >>> x,y,z=mytuple

>>> x+y+z

 得到结果12.

 

34. 解释如何在Django中设置数据库。

可以使用命令edit mysite /setting.py,它是一个普通的python模块,模块级别代表Django设置。

 Django默认使用SQLite;对于Django用户来说这很容易,因此不需要任何其他类型的安装。如果您的数据库选择不同,则必须使用DATABASE'default'项中的以下键来匹配您的数据库连接设置。

引擎:您可以使用'django.db.backends.sqlite3','django.db.backeneds.mysql','django.db.backends.postgresql_psycopg2','django.db.backends.oracle'等来更改数据库

名称:数据库的名称。如果您使用SQLite作为数据库,那么数据库将是您计算机上的文件,Name应该是完整的绝对路径,包括该文件的文件名。

如果您没有选择SQLite作为数据库,则必须添加密码,主机,用户等设置。Django使用SQLite作为默认数据库,它将数据作为单个文件存储在文件系统中。如果你有数据库服务器-PostgreSQL,MySQL,Oracle,MSSQL-并且想要使用它而不是SQLite,那么使用数据库的管理工具为你的Django项目创建一个新的数据库。无论哪种方式,在您的(空)数据库到位的情况下,剩下的就是告诉Django如何使用它。这是项目的settings.py文件的来源。

 

我们将添加以下代码行文件:

 

DATABASES = {

    'default': {

         'ENGINE' : 'django.db.backends.sqlite3',

         'NAME' : os.path.join(BASE_DIR, 'db.sqlite3'),

    }

}

 

 

35. 如何获取任何网址或网页的Google缓存时限?

 使用以下URL格式:

http://webcache.googleusercontent.com/search?q=cache:URLGOESHERE

 

请务必将“URLGOESHERE”替换为要检索其缓存的页面或站点的正确Web地址,并查看时间。例如,要查看edureka.co的Google Webcache年龄,您需要使用以下网址:

http://webcache.googleusercontent.com/search?q=cache:edureka.co

 

36. 什么是Python中的map函数?

Map函数执行作为第一个参数给出的函数,该函数遍历第二个参数给出的迭代的所有元素的。如果给定的函数包含多于1个参数,则给出了许多迭代。

 

37. 如何在NumPy数组中获得N个最大值的索引?

我们可以使用以下代码获取NumPy数组中N个最大值的索引:

 

import numpy as np

arr = np.array([1, 3, 2, 4, 5])

print(arr.argsort()[-3:][::-1])

 

输出

[ 4 3 1 ]

 

38. 你如何用Python /NumPy计算百分位数?

我们可以使用以下代码计算百分位数

import numpy as np

a = np.array([1,2,3,4,5])

p = np.percentile(a, 50)  #Returns 50th percentile, e.g. median

print(p)

 输出

 3

 

39. NumPy阵列(arrays)相对(嵌套)Python列表(lists)有哪些优势?

a. Python的列表是高效的general-purpose容器。它们支持(相当)有效的插入,删除,追加和连接,Python的list comprehension使它们易于构造和操作。

b. Python列表的一些限制:它们不支持向量化“vectorized”操作,如元素加法和乘法,并且它们可以包含不同类型的对象这一事实意味着Python必须存储每个元素的类型信息,并且必须在每个元素上操作时执行类型调度代码。

c. NumPy不仅效率更高;它也更方便。你可以免费获得大量的向量和矩阵运算,这有时可以避免不必要的工作。

d. NumPy数组更快,你可以使用NumPy,FFT,卷积,快速搜索,基本统计,线性代数,直方图等内置方法。

 

40. NumPy和SciPy有什么区别?

a. 在理想的世界中,NumPy只包含数组数据类型和最基本的操作:索引,排序,重塑,基本元素函数等。

b. 所有数字代码都将驻留在SciPy中。但是,NumPy的一个重要目标是兼容性,因此NumPy试图保留其前任任何一个支持的所有功能。

c. 因此,NumPy包含一些线性代数函数,即使它们更恰当地属于SciPy。无论如何,SciPy包含更多功能更全版本的线性代数模块,以及许多其他数值算法。

d. 如果你使用python进行科学计算,你应该安装NumPy和SciPy。大多数新功能属于SciPy而非NumPy。

 

——END——

 

技术交流群1:

添加班主任微信 qiuzhiquanquanqqls000

加入微信群

 

技术交流群2:

添加班主任QQ 17246989941752856301

加入QQ群(240920680