python基础面试题

python面试题库——1Python基础篇

第一部分 Python基础篇(80题)
为什么学习Python?
语言本身简洁,优美,功能超级强大,跨平台,从桌面应用,web开发,自动化测试运维,爬虫,人工智能,大数据处理都能做

Python和Java、PHP、C、C#、C++等其他语言的对比?
C语言由于其底层操作特性和历史的积累,在嵌入式领域是当之无愧的王者
. PHP跨平台,性能优越,跟Linux/Unix结合比跟Windows结合性能强45%,开发成本低,PHP 5已经有成熟的面向对象体系,适合开发大型项目淘宝网、Yahoo、163、Sina等等大型门户,很多选用PHP来作为他们的开发语言
JAVA的优点:1.简单性2.面向对象性(面向对象的程度可以达到95%)3.健壮性4.跨平台性5.高性能(自动垃圾回收机制)6.多线程7.动态性8.安全性
C++的优点:1.可扩展性强3.可移植性4.面向对象的特性5.强大而灵活的表达能力和不输于C的效率6.支持硬件开发
简述解释型和编译型编程语言
1.编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。
2.解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。
3.C/C++ 等都是编译型语言,而Java,C#等都是解释型语言。
5.脚本语言一般都有相应的脚本引擎来解释执行。 他们一般需要解释器才能运行。JAVASCRIPT,ASP,PHP,PERL,Nuva都是脚本语言。C/C++编译、链接后,可形成独立执行的exe文件。
Python解释器种类以及特点?
CPython:这个解释器是用C语言开发的,所以叫CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。
Jython:Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IPython:IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了IE。
位和字节的关系?

1 计算机存储信息的最小单位,称之为位(bit),音译比特,二进制的一个“0”或一个“1”叫一位。
2、计算机存储容量基本单位是字节(Byte),音译为拜特,8个二进制位组成1个字节,一个标准英文字母占一个字节位置,一个标准汉字占二个字节位置。

b、B、KB、MB、GB 的关系?

1024B=1K(千)B
1024KB=1M(兆)B
1024MB=1G(吉)B
1024GB=1T(太)B

什么是PEP8?

PEP8是一个编程规范,内容是一些关于如何让你的程序更具可读性的建议。
其主要内容包括代码编排、文档编排、空格的使用、注释、文档描述、命名规范、编码建议等。

请至少列举5个 PEP8 规范(越多越好)。
缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔
各种右括号前不要加空格。
逗号、冒号、分号前不要加空格。
函数的左括号前不要加空格。如Func(1)。
序列的左括号前不要加空格。如list[2]。
操作符左右各加一个空格,不要为了对齐增加空格。
函数默认参数使用的赋值符左右省略空格。
不要将多句语句写在同一行,尽管使用‘;’允许。
if/for/while语句中,即使执行语句只有一句,也必须另起一行。
类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。

.什么是pickling和unpickling?

Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling。
反之从存储的字符串文件中提取原始Python对象的过程,叫做unpickling。

通过代码实现如下转换:
二进制转换成十进制:v = “0b1111011”

十进制转换成二进制:v = 18

八进制转换成十进制:v = “011”

十进制转换成八进制:v = 30

十六进制转换成十进制:v = “0x12”

十进制转换成十六进制:v = 87
(1)二进制转换成十进制:v = “0b1111011”

#先将其转换为字符串,再使用int函数,指定进制转换为十进制。
print(int(“0b1111011”,2))
值为123
(2)十进制转换成二进制:v = 18

print(“转换为二进制为:”, bin(18))
#转换为二进制为: 0b10010
(3)八进制转换成十进制:v = “011”

print(int(“011”,8))
#9
(4)十进制转换成八进制:v = 30

print(“转换为八进制为:”, oct(30))
#转换为八进制为: 0o36
(5)十六进制转换成十进制:v = “0x12”

print(int(“0x12”,16))
#18
(6)十进制转换成十六进制:v = 87

print(“转换为十六进制为:”, hex(87))
转换为十六进制为: 0x57

如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
a=[‘1’,‘2’,‘3’]
b=[int(i) for i in a]
print(b)
输出为:[1, 2, 3]

请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010

     3            00000011

     9            00001001

    12            00001100

再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
python递归的最大层数?

复制代码
def fab(n):
if n == 1:
return 1
else:
return fab(n-1)+ n

print (fab(998))

#得到的最大数为998,以后就是报错了,998这个数值莫名想起广告词····
复制代码
复制代码

复制代码
复制代码
import sys
sys.setrecursionlimit(100000)

def foo(n):
print(n)
n += 1
foo(n)

if name == ‘main’:
foo(1)

#得到的最大数字在3922-3929之间浮动,这个是和计算机有关系的,将数字调到足够大了,已经大于系统堆栈,python已经无法支撑到太大的递归崩了。
复制代码

计算题
1、求结果

v=dict.fromkeys([‘k1’,‘k2’],[])
v[‘k1’].append(666)
print(v)
v[‘k1’] = 777
print(v)
v=dict.fromkeys([‘k1’,‘k2’],[])
v[‘k1’].append(666)
print(v) #{‘k2’: [666], ‘k1’: [666]}
v[‘k1’] = 777
print(v) #{‘k2’: [666], ‘k1’: 777}
2、求结果

def num():
return [lambda x:ix for i in range(4)]
print(m(2) for m in num())
def num():
return [lambda x:i
x for i in range(4)]
print(m(2) for m in num())# <generator object at 0x0000000000B2FA40> 为元祖
print(list(m(2) for m in num())) # [6, 6, 6, 6]
3、求结果

a、[i%2 for i in range(10)]

b、( i % 2 for i in range(10) )

复制代码
复制代码
a=[i%2 for i in range(10) ]
print(a) # 因为 [] 为列表 所以会有结果为[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

b=(i%2 for i in range(10))
print(b) # 因为()为元祖 所以会有结果为 <generator object at 0x0000000000645D00>
c=list(b) # 将元祖转换格式为列表
print© # 打印c,结果为 [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
复制代码
复制代码
4、求结果:

a. 1 or 2

b. 1 and 2

c. 1 < (2==2)

d. 1 < 2 == 2

print(1 or 2) # 1
print(1 and 2) # 2
print(1<(22)) # False 因为22为True,而True表示为1,False表示为0,所以1<1,结果为False
print(1<22) # True python是允许连续比较1<22意思是1<2且2==2

9;求结果:
v1 = 1 or 3

v2 = 1 and 3

v3 = 0 and 2 and 1

v4 = 0 and 2 or 1

v5 = 0 and 2 or 1 or 4

v6 = 0 or Flase and 1

v1 = 1 or 3 #1

v2 = 1 and 3 #3
v3 = 0 and 2 and 1 #0
v4 = 0 and 2 or 1 #1
v5 = 0 and 2 or 1 or 4 #1
v6 = 0 or False and 1 #False

ascii、unicode、utf-8、gbk 区别?
ASCII码使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,只有256个字符。

 在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面(英文为 Basic Multilingual Plane,简写 BMP。它又简称为“零号平面”, plane 0)里的所有字符,要用四位十六进制数(例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五位或六位十六进制数了。旧版的Unicode标准使用相近的标记方法,但却有些微的差异:在Unicode 3.0里使用“U-”然后紧接着八位数,而“U+”则必须随后紧接着四位数。

Unicode能够表示全世界所有的字节
  GBK是只用来编码汉字的,GBK全称《汉字内码扩展规范》,使用双字节编码。
  UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

字节码和机器码的区别?
字节码

字节码是一种中间码

字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。
字节码主要为了实现特定软件运行和软件环境、硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java语言。
总结:字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。

机器码

机器码就是计算机可以直接执行,并且执行速度最快的代码。

用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码。

机器语言是微处理器理解和使用的,用于控制它的操作二进制代码。
  8086到Pentium的机器语言指令长度可以从1字节到13字节。
  尽管机器语言好像是很复杂的,然而它是有规律的。
  存在着多至100000种机器语言的指令。这意味着不能把这些种类全部列出来。
总结:机器码是电脑CPU直接读取运行的机器指令,运行速度最快

三元运算规则以及应用场景?
三元运算符的功能与“if…else”流程语句一致,它在一行中书写,代码非常精练、执行效率更高。在PHP程序中恰当地使用三元运算符能够令脚本更为简洁、高效。代码格式如下:

(expr1) ? (expr2) : (expr3);
解释:如果条件“expr1”成立,则执行语句“expr2”,否则执行“expr3”。
实现同样的功能,若使用条件流程语句,就需要书写多行代码:

if(expr1) {
expr2;
} else {
expr3;
}
可见,前面所说的三元运算符之好并非夸张。可是,多数情况下我们只在代码较为简单的时候使用三元运算符,即执行语句只为单句的时候。如:

a &gt; a&gt; a>b ? print “a大于b” : print “a小于b”;
事实上,三元运算符可以扩展使用,当设置的条件成立或不成立,执行语句都可以不止一句,试看以下格式:

(expr1) ? (expr2).(expr3) : (expr4).(expr5);
我们非常明显地看到,多个执行语句可以使用用字符串运算符号(“.”)连接起来,各执行语句用小角括号包围起来以表明它是一个独立而完整的执行语句。这样扩展后它的功能更为逼近“if…else”流程语句。

同时三元运算符还可以嵌套使用。例如,a大于b成立时:如果a小于c,那么x=c-a否则x=a-c;否则a小于b成立时:如果b小于c,那么x=c-b否则x=b-c:

a &gt; a&gt; a>b ? x = ( x=( x=(a<$c ? c − c- ca : a − a- ac) : x = ( x=( x=(b<$c ? c − c- cb : b − b- bc);
嵌套使用的三元运算符可读性不太好,日后对代码的维护极可能存在问题,但比起“if…else”之类的流程语句,在上述情形之下,它的确太简练了,这是它的诱人之处。

对于喜欢偷懒和追求代码简洁的人来说,用三元运算符取代if流程语句应该是绝佳的选择。即使不用考虑“三元”中条件句以外的任意某一“元”,使用三元运算符仍然比if语句简练。以下语句的语法是正确的,它们以小解引号的方式忽略了第二或第三“元”:

a &gt; a&gt; a>b ? print “Yes” : “”;
a &gt; a&gt; a>b ? ‘’: print ‘No’;
应该注意的是:在使用三元运算符时,建议使用print语句替代echo语句。

Python自省
这个也是python彪悍的特性.

自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().

列举 Python2和Python3的区别?
(1)Print

在 Python 2 中, print 被视为一个语句而不是一个函数,这是一个典型的容易弄混的地方,因为在 Python 中的许多操作都需要括号内的参数来执行。如果在 Python 2 中你想要你的控制台输出 ”Sammy the Shark is my favorite sea creature”,你应该写下这样的 print 语句:

print “Sammy the Shark is my favorite sea creature”
在使用 Python 3 时,print()会被显式地视为一个函数,因此要输出上面相同的字符串,你可以使用这种非常简单且易于使用的函数语法:

print(“Sammy the Shark is my favorite sea creature”)
这种改变使得 Python 的语法更加一致,并且在不同的 print 函数之间进行切换更加容易。就方便性而言,print()语法也与 Python 2.7 向后兼容,因此您的 Python 3 print()函数可以在任一版本中运行。

(2)整数的除法

在 Python 2 中,您键入的任何不带小数的数字,将被视为整数的编程类型。虽然乍看起来这似乎是一个简单的处理编程类型的方法,但有时候当你试图除以整数以期望获得一个带小数位的答案(称为浮点数),如:

5 / 2 = 2.5
然而,在 Python 2 中,整数是强类型的,并且不会变成带小数位的浮点数,即使这样做具有直观上的意义。

当除法/符号的任一侧的两个数字是整数时,Python 2进行底除法,使得对于商x,返回的数字是小于或等于x的最大整数。这意味着当你写下 5 / 2 来对这两个数字相除时,Python 2.7 将返回最大的小于或等于 2.5 的整数,在这种情形下:

a = 5 / 2
print a
#a=2
为解决这个问题,你可以在 5.0 / 2.0 中添加小数位,以得到预期的答案 2.5。

在 Python 3 中,整数除法变得更直观,如

a = 5 / 2
print(a)
#a=2.5
你也可以使用 5.0 / 2.0 返回 2.5,但是如果你想做底层划分,你应该使用 “//” 这样的 Python 3 语法,像这样:

b = 5 // 2
print(b)
#b=2
在 Python 3 中的这种修改使得整数除法更为直观,并且它的特点是不能向后兼容 Python 2.7。

(3)支持 Unicode

当编程语言处理字符串类型时,也就是一个字符序列,它们可以用几种不同的方式来做,以便计算机将数字转换为字母和其他符号。

Python 2 默认使用 ASCII 字母表,因此当您输入“Hello,Sammy!”时, Python 2 将以 ASCII 格式处理字符串。被限定为在多种扩展形式上的数百个字符,用ASCII 进行字符编码并不是一种非常灵活的方法,特别是使用非英语字符时。

要使用更通用和更强大的Unicode字符编码,这种编码支持超过128,000个跨越现今和历史的脚本和符号集的字符,你必须输入

u“Hello,Sammy!”
, 前缀 u 代表 Unicode。

Python 3 默认使用 Unicode,这节省了程序员多余的开发时间,并且您可以轻松地在程序中直接键入和显示更多的字符。因为 Unicode 支持更强大的语言字符多样性以及 emoji 的显示,所以将它作为默认字符编码来使用,能确保全球的移动设备在您的开发项目中都能得到支持。

如果你希望你的 Python 3 代码向后兼容 Python 2,你可以通过在你的字符串的前面保留 “u” 来实现。

(4)后续发展

Python 3 和 Python 2 之间的最大区别不是语法上的,而是事实上 Python 2.7 将在 2020 年失去后续的支持,Python 3 将继续开发更多的功能和修复更多的错误。

最近的发展包括格式化的字符串,类创建的简单定制,和用一种更干净的句法方式来处理矩阵乘法。

Python 3 的后续开发意味着,开发人员可以对问题被及时解决抱有信心,并且随着时间的推移更多的功能将被添加进来,程序也会变得更加有效。

用一行代码实现数值交换:

a = 1

 b = 2

a,b=b,a
print(a,b) #a=2,b=1

Python3和Python2中 int 和 long的区别?
long整数类型被Python3废弃,统一使用int

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()函数

xrange和range的区别?
range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。

range示例:

复制代码
复制代码

range(5)
[0, 1, 2, 3, 4]

range(1,5)
[1, 2, 3, 4]

range(0,6,2)
[0, 2, 4]
复制代码
复制代码
xrange 函数说明:用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。
xrange示例:

复制代码
复制代码

xrange(5)
xrange(5)

list(xrange(5))
[0, 1, 2, 3, 4]

xrange(1,5)
xrange(1, 5)

list(xrange(1,5))
[1, 2, 3, 4]

xrange(0,6,2)
xrange(0, 6, 2)

list(xrange(0,6,2))
[0, 2, 4]
复制代码
复制代码
由上面的示例可以知道:要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间,这两个基本上都是在循环的时候用:

for i in range(0, 100):
print i

for i in xrange(0, 100):
print i
这两个输出的结果都是一样的,实际上有很多不同,range会直接生成一个list对象:

a = range(0,100)
print type(a)
print a
print a[0], a[1]
输出结果:

复制代码
复制代码
<type ‘list’>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
0 1
复制代码
复制代码

而xrange则不会直接生成一个list,而是每次调用返回其中的一个值:

a = xrange(0,100)
print type(a)
print a
print a[0], a[1]
结果如下:

<type ‘xrange’>
xrange(100)
0
总结:

1.range和xrange都是在循环中使用,输出结果一样。

2.range返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。

3.xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好。

注意:Python 3.x已经去掉xrange,全部用range代替。

文件操作时:xreadlines和readlines的区别?
二者使用时相同,但返回类型不同,xreadlines返回的是一个生成器,readlines返回的是list

列举布尔值为False的常见值?

字符串、列表、元组、字典每个常用的5个方法?
字符串

复制代码
复制代码
words = ‘today is a wonderfulday’
print(words.strip(‘today’))#如果strip方法指定一个值的话,那么会去掉这两个值
print(words.count(‘a’))#统计字符串出现的次数
print(words.index(‘is’))#找下标
print(words.index(‘z’))#找下标如果元素不找不到的话,会报错
print(words.find(‘z’))#找下标,如果元素找不到的话,返回-1
print(words.replace(‘day’,‘DAY’))#字符串替换
print(words.isdigit())#判断字符串是否为纯数字
print(words.islower())#判断字符串是否为小写字母
print(words.isupper())#判断字符串是否为大写字母
print(words.startswith(‘http’))#判断是否以某个字符串开头
print(words.endswith(’.jpg’))#判断是否以某个字符串结尾
print(words.upper())#将字符串变成大写
print(words.lower())#将字符串变成小写
字符串常用功能:
移除空白
分割
长度
索引
切片
复制代码
复制代码
列表

复制代码
复制代码
sample_list = [‘a’,1,(‘a’,‘b’)] #创建列表
sample_list = [‘a’,‘b’,0,1,3] # Python 列表操作
value_start = sample_list[0] #得到列表中的某一个值
end_value = sample_list[-1] #得到列表中的某一个值
del sample_list[0] #删除列表的第一个值
sample_list[0:0] = [‘sample value’] #在列表中插入一个值
list_length = len(sample_list) #得到列表的长度
for element in sample_list: #列表遍历
print(element)
基本操作:

索引
切片
追加
删除
长度
切片
循环
包含
复制代码
复制代码

元祖

复制代码
复制代码
#元组也是一个list,他和list的区别是元组的元素无法修改
tuple1 = (2,3,4,5,6,4,7)
print(type(tuple1))
print(tuple1[:7])
print(tuple1[:5:-1])
for i in range(6):
print(tuple1[i])<

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值