面试题之第一部分(Python基础篇) 80题

第一部分(python基础篇)80题

  1. 为什么学习Python?*

    # 1. python应用于很多领域,比如后端,前端,爬虫,机器学习(人工智能)等方面,几乎能涵盖各个开发语言的领域,同时它相对于其他语言而言,简洁。
    
  2. 通过什么途径学习的Python?*

    # 通过自学,网上看视频资料,网上买书的方法学习
    
  3. Python和Java、PHP、C、C#、C++等其他语言的对比?*

    '''
    python 
    1. 简单————Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格。Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。
    2. 易学————就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。
    3. 免费、开源————Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。
    4. 高层语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
    5. 可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台。
    6. 解释性————这一点需要一些解释。一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码 运行 程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。
    7. 面向对象————Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。
    8. 可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
    9. 可嵌入性————你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
    10. 丰富的库————Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
    
    缺点:
    1. 运行速度慢,相比于C++/C运行速度偏慢,不过对于用户而言,机器上运行速度是可以忽略的。
    
    2. 构架选择太繁杂,没有像C#这样的官方.net构架,也没有像ruby由于历史较短,构架开发的相对集中,所以人人都有不同的方案。
    
    
    
    C:
    	优点:
            1. 简洁紧凑、灵活方便 
            2. 运算符丰富
            3. 数据结构丰富
            4. C是结构式语言
            5. C语法限制不太严格,程序设计自由度大
            6. C语言允许直接访问物理地址,可以直接对硬件进行操作
            7. C语言程序生成代码质量高,程序执行效率高
            8. C语言适用范围大,可移植性好
            9. C语言有一个突出的优点就是适合于多种操作系统,如DOS、UNIX,也适用于多种机型
            10. 有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护
    	缺点:
    		运算符和运算优先级过多,不便于记忆,语法定义不严格,编程自由度大,对新手不友好。
    
    
    更多对比请参考:https://www.jianshu.com/p/7c8fdedf352e
    
    '''
    
  4. 简述解释型和编译型编程语言?

    # 同声翻译:解释性语言
    
    
    # 谷歌翻译:编译性语言
    
    # 个人感觉他是想考察你是否对其他的语言有所了解,同时也想看看你对python的理解有多深
    
  5. Python解释器种类以及特点?*

    '''
    1. CPython
    	c语言开发的 使用最广的解释器
    2. IPython
    	基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样
    3. PyPy
    	目标是执行效率 采用JIT技术 对python代码进行动态编译,提高执行效率
    4. JPython
    	运行在Java上的解释器 直接把python代码编译成Java字节码执行
    5. IronPython
    	运行在微软 .NET 平台上的解释器,把python编译成. NET 的字节码
    '''
    
  6. 位和字节的关系?

    # 1字节(Bytes) = 8位(bit)
    
  7. b、B、KB、MB、GB 的关系?

    '''
    1B = 8b
    1KB = 1024B
    1MB = 1024KB
    1GB = 1024MB
    '''
    
  8. 请至少列举5个 PEP8 规范(越多越好) *

    '''
    1. 代码排版
    
    2. 文档排版
    
    3. 避免多余空格
    
    4. 注释
    
    5. 命令风格
    
    6. 编码建议
    
    '''
    
  9. 通过代码实现如下转换:

    二进制转换成十进制:v = “0b1111011”

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

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

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

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

    十进制转换成十六进制:v = 87

'''
第一题
v = b'0b1111011'
print(int(v,2))

第二题:
print("转换为二进制为:", bin(18))

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

print(int("011",8))

第四题:

print(oct(v))

第五题:
v = '0x12'
print(int(v,16))


第六题:
v = 87
print(hex(v))
'''
  1. 请编写一个函数实现将IP地址转换成一个整数。

如 10.3.9.12 转换规则为:

​ 10 00001010

3 00000011

​ 9 00001001

12 00001100

再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?

IP = "10.3.9.12"

def addr2dec(addr):
    "将点分十进制IP地址转换成十进制整数"
    items = [int(x) for x in addr.split(".")]
    # return sum([items[i] << [24, 16, 8, 0][i] for i in range(4)])
    return sum([items[i]*2**[24,16,8,0][i] for i in range(4)])

print(addr2dec(IP))
# 167971084
  1. python递归的最大层数?

第一种:

def foo(n):
    print(n)
    n += 1
    foo(n)
 
if __name__ == '__main__':
    foo(1)
    
# 998

第二种:

import sys

sys.setrecursionlimit(100000)

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


if __name__ == '__main__':
    foo(1)
    
# 3221左右
  1. 求结果:
    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 False and 1
>>> v1 = 1 or 3	
>>> v1
1
>>> v2 = 1 and 3
>>> v2
3
>>> v3 = 0 and 2 and 1
>>> v3
0
>>> v4 = 0 and 2 or 1
>>> v4
1
>>> v5 = 0 and 2 or 1 or 4
>>> v5
1
>>> v6 = 0 or False and 1
>>> v6
False


'''
对于python而言
1. 在不加括号时候,and优先级大于or
2. x or y的值只可能是x或y,x为真就是x,x为假就是y
3. x and y的值只可能是x或y,x为真就是y,x为假就是x
'''
  1. ascii、unicode、utf-8、gbk 区别?
'''
1. ascii 8位一个字节

2. unicode
	英文:32位  四个字节
	中文:32位  四个字节
3. utf-8
	英文:8位 一个字节
	中文:16位 两个字节
4. gbk:
	英文:8位  一个字节
	中文:16位  两个字节

python3中:
	str 在内存中是unicode编码
	
	bytes类型
		对于英文:
			str:
				表现形式:s = 'alex'
				编码方式:010101010 unicode
			bytes:
				表现形式:s = b'alex'
				编码方式:000101010 utf-8 gbk
		对于中文:
			str:
				表现形式:s = '中国'
				编码方法:010101010 unicode
			bytes:
				表现形式:s = b' xe91e91e01e21e31e32'
				编码方式:000101010 utf-8 gbk
	
	encode 编码,如何将str --> bytes
		使用方法:str.encode('utf-8')
	decode 解码,如何将bytes --> str
		使用方法:bytes.decode('utf-8')
'''
  1. 字节码和机器码的区别?
'''
机器码:机器语言

字节码:汇编语言

'''

  1. 三元运算规则以及应用场景?
a = 10
b = 20
x = a if a < b else b

# 为真时的结果 if 判断条件 else 为假时的结果(注意,没有冒号)
  1. 列举 Python2和Python3的区别?
'''
1. 2中print "字符串"  被  3中的 print()取代
2. 2中input得到的是int类型,raw_input得到的是str类型,而3中只有input且是str类型 
3. 2中字符串以8-bit字符串存储,3中字符串以16-bit unicode字符串存储
4. 2中
	try:
		pass
	except Exception,e:
		pass
	3中
	try:
		pass
	except Exception as e:
		pass
'''
  1. 用一行代码实现数值交换:
    
 a = 1
    b = 2
a,b = b,a
  1. Python3和Python2中 int 和 long的区别?
'''
python2中有long类型
python3中没有long类型,只有int类型
'''
  1. xrange和range的区别?
'''
在python2中:
	xrange  返回的是一个迭代值(生成器)
	range	返回的是一个列表

在python3中:
	range 返回的是一个迭代值(生成器)

'''
  1. 文件操作时:xreadlines和readlines的区别?
'''
xreadlines()则直接返回一个iter(file)迭代器,在Python 2.3之后已经不推荐这种表示方法了


readlines()是把文件的全部内容读到内存,并解析成一个list,当文件的体积很大的时候,需要占用很多内存,使用该方法是一种不明智的做法。
'''
  1. 列举布尔值为False的常见值?
# 0,None,空(空容器),Flase
  1. 字符串、列表、元组、字典每个常用的5个方法?
'''
字符串:split,切片,for循环,成员运算,strip,len,replace,lower(),upper(),find()

列表: append(),for循环,pop(),排序,join,insert(),切片,len(),count()
	增:
	删:
	改:
	查:
元组:
	查:
		index()
		count()
		len()
	比较:
		cmp(tuple1,tuple2) 比较两个元组元素;
		len(tuple):计算元组元素个数;
		max(tuple):返回元组中元素最大值。;
		min(tuple):返回元组中元素最小值。
		tuple(seq):将列表转换为元组


'''
  1. lambda表达式格式以及应用场景?
# lambda arges1 [arges2...]: 表达式
lambda x: x+2
  1. pass的作用?
# 相当于填充代码
  1. *args和**kwargs作用
'''

*args 作为形参,当用户传入多个位置参数时,其值都存在args中(以元组的形式)


**kwargs  作为形参,当用户传入多个关键字参数时,其值都存在kwargs中(以键值对的形式存储)

'''
  1. is和==的区别
# is 是判断内存地址的(身份运算符)

# == 是判断值是否相等

'''
内存地址相同,值一定相等;值相等,内存地址不一定相等。

'''
  1. 简述Python的深浅拷贝以及应用场景?
'''
普通拷贝
a 是 b的普通拷贝,则a发生改变 b也发生改变。b发生改变,a也发生改变

浅拷贝
a 是 b的浅拷贝,则a中的不可变数据类型发生改变,b不会变。a中可变类型发生改变,b也会随之改变

深拷贝  
a 是 b的深拷贝,a,b无关

'''


# 浅拷贝
import copy
copy.copy()


# 深拷贝
import copy
copy.deepcopy()
28. Python垃圾回收机制?

python里每一个东西都是对象,它们的核心就是一个结构体:PyObject

typedef struct_object {
 int ob_refcnt;
 struct_typeobject *ob_type;
} PyObject;

PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少

#define Py_INCREF(op)   ((op)->ob_refcnt++) //增加计数
#define Py_DECREF(op)  //减少计数
    if (--(op)->ob_refcnt != 0) 
        ; 
    else 
        __Py_Dealloc((PyObject *)(op))

当引用计数为0时,该对象生命就结束了。

引用计数机制的优点:

  • 简单
  • 实时性:一旦没有引用,,内存就会直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时

引用计数机制的缺点:

  • 维护引用计数消耗资源

  • 循环引用

    list1 = []
    list2 = []
    list1.append(list2)
    list2.append(list1)
    

    list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,这将是致命的。
    对于如今的强大硬件,缺点1尚可接受,但是循环引用导致内存泄露,注定python还将引入新的回收机制。(标记清除和分代收集)

    参考连接:https://www.cnblogs.com/pinganzi/p/6646742.html#_label6

29. Python的可变类型和不可变类型?
'''
可变类型:列表,字典,集合

不可变类型:整型,浮点型,字符串

'''
  1. 求结果:

    v = dict.fromkeys(['k1','k2'],[])
    v['k1'].append(666)
    print(v)
    v['k1'] = 777
    print(v)
    
    {'k1': [666], 'k2': [666]}
    {'k1': 777, 'k2': [666]}
    
    原因:k1和k2指向的是同一个列表,也就是同一块内存空间。
    
  2. 求结果

    def num():
        return [lambda x:i*x for i in range(4)]
    
    print([m(2) for m in num()])
    
    [6, 6, 6, 6]
    原因:只有到需要计算i的值时,才会真正计算i的值
    

    类似的题目:

    flist = []
    for i in range(3):
        def foo(x):
            print(x + i)
        flist.append(foo)
    
    for f in flist:
        f(2)
    
    4
    4
    4
    原因:只有到需要计算i的值时,才会真正去算i的值。
    
原文地址:https://www.cnblogs.com/plf-Jack/p/11093713.html