1.python的数据类型有哪些?
参考:
Python 中主要有8种数据类型:number(数字)、string(字符串)、list(列表)、tuple(元组)、dict(字典)、set(集合)、Boolean(布尔值)、None(空值)。
2.python2和3的区别?
参考:
1.大环境不同
python2.x:源码重复,不规范
python3.x:整合源码,更清晰优美简单
2.默认编码不同
python2.x:默认编码ASCII编码
python3.x:默认编码UTF-8
3.python3.x没有长整型
python2.x:有长整型long
python3.x:long整数类型被废弃,统一为int
4.打印方式不同
python2.x:print语句,print空格+打印内容
python3.x:print()函数,print(打印内容)
5.交互函数不同
python2.x:raw_input() input()
1) raw_input()函数的输入内容类型为字符串
2) input()函数的输入内容类型为输入字符的类型
3.python是如何执行的?
参考:
Python的传统运行执行模式:录入的源代码转换为字节码,之后字节码在PVM中运行。代码被自动编译,解释。
4.你知道的常用模块有哪些?
参考:
Python模块是包含Python代码的.py文件。此代码可以是函数类或变量。一些常用的内置模块包括:sys、math、random、data time、JSON。
5.is和==的区别?
参考:
is比较的是id是不是一样,==比较的是值是不是一样。
Python中,每个对象包含3个属性,id,type,valueid就是对象地址,可以通过内置函数id()查看对象引用的地址。type就是对象类型,可以通过内置函数type()查看对象的类型。value就是对象的值。
6.元组和列表的区别?
参考:
7.深拷贝和浅拷贝的区别?
参考:
深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。在Python中,我们使用函数deepcopy()执行深拷贝,导入模块copy,如下所示:
>>> import copy
>>> b=copy.deepcopy(a)
而浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。我们使用函数function()执行浅拷贝,使用如下所示:
>>> b=copy.copy(a)
8.Python中的字典是什么?
参考:
Python中的内置数据类型称为字典。它定义了键和值之间的一对一关系。字典包含一对键及其对应的值。字典由键索引。
9.面向对象中super的作用?
参考:
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
10.什么是闭包?
参考:
简单来说,闭包的概念就是当我们在函数内定义一个函数时,这个内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用时,我们称之为闭包。有点绕;
11.python如何进行内存管理?
参考:
1、引用计数机制
2、垃圾回收机制
3、内存池机制
12.什么是lambda函数?
参考:
lambda函数也叫匿名函数,该函数可以包含任意数量的参数,但只能有一个执行操作的语句。
13.单引号、双引号、三引号的区别是什么?
参考:
1、单引号和双引号没有区别。都可以用就是为了方便,减少写太多的转义字符。
2、三个双引号用来输入多行文本,也就是说在三引号之间输入的内容将被原样保留,之中的单号和双引号不用转义,其中的不可见字符比如\n和\t都会被保留,这样的好处是你可以替换一些多行的文本。
14.在Python中如何实现多线程?
参考:
Python有一个多线程库,但是用多线程来加速代码的效果并不是那么的好,
Python有一个名为Global Interpreter Lock(GIL)的结构。GIL确保每次只能执行一个“线程”。一个线程获取GIL执行相关操作,然后将GIL传递到下一个线程。
虽然看起来程序被多线程并行执行,但它们实际上只是轮流使用相同的CPU核心。
所有这些GIL传递都增加了执行的开销。这意味着多线程并不能让程序运行的更快。
15.请解释使用*args和**kwargs的含义?
参考:
当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用*args。
在我们不知道该传递多少关键字参数时,使用**kwargs来收集关键字参数。
16.谈谈对进程、线程、以及协程的理解?
参考:
进程: 一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。
线程: 调度执行的最小单位,也叫执行路径,不能独立存在, 依赖进程存在. 一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。
协程: 又称微线程,纤程。英文名Coroutine。一句话说明什么是协程,协程是一种用户态的轻量级线程。协程的调度完全由用户控制.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
协程的优点:
(1)无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)
(2)无需原子操作锁定及同步的开销
(3)方便切换控制流,简化编程模型
(4)高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
协程的缺点:
(1)无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
(2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
17.装饰器的是什么?作用是什么?
参考:
概念:
1.装饰器的实现是由闭包支撑的;
2.装饰器本质上是⼀个python函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能;
3.装饰器的返回值也是⼀个函数的对象,它经常用于有切面需求的场景,实现路由传参,flask的路由传参依赖于装饰器,浏览器通过url访问到装饰器的路由,从而访问视图函数获得返回的HTML页面;
应用场景:
1.可以在外层函数加上时间计算函数,计算函数运行时间;
2.计算函数运行次数;
3.可以用在框架的路由传参上;
4.插入日志,作为函数的运行日志;
5.事务处理,可以让函数实现事务的一致性,让函数要么一起运行成功,要么一起运行失败;
6.缓存,实现缓存处理;
7.权限的校验,在函数外层套上权限校验的代码,实现权限校验;
18.Python里面search()和match()的区别?
参考:
match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None。
search()函数会在整个字符串内查找模式匹配,只找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
19.如何提高python的运行效率?
参考:
1.关键代码使用外部功能包——这个窍门要你牺牲应用的可移植性以换取只有通过对底层主机的直接编程才能获得运行效率。以下是一些你可以选择用来提升效率的功能包:Cython、Pylnlne、PyPy、Pyrex;
2.在排序时使用键——尽可能多地使用键和内置的sort()方法;
3.尝试多种编码方法——每次创建应用时都使用同一种编码方法几乎无一例外会导致应用的运行效率不尽人意;
4.交叉编译你的应用——为了运行你的应用,你借助一个应用将你所编的人类可读的代码转换成机器可读的代码,但是,如果你用的是一个资源很有限的系统,这种方法或许不太可行;
5.针对循环的优化——尽量避免在循环中访问变量的属性;
6.使用较新的Python版本——保证自己的代码在新版本里还能运行。
20.list如何去重?
参考:
>>> l = [1,1,2,3,4,5,4]
>>> list(set(l))
[1, 2, 3, 4, 5]
或者
d = {}
for x in mylist:
d[x] = 1
mylist = list(d.keys())
21.如何对字符串进行反转?
参考:
字符串切片
>>> s = '123456'
>>> print(s[::-1])
654321
22.统计字符串中每个字母出现的次数?
参考:
方法一
def count_each_char_1(string):
res = {}
for i in string:
if i not in res:
res[i] = 1
else:
res[i] += 1
return res
print(count_each_char_1('aenabsascd'))
方法二
def count_each_char_2(string):
res = {}
for i in string:
res[i] = res.get(i,0)+1
return res
print(count_each_char_2('aenabsascd'))
23.python实现冒泡排序?
参考:
a=[1,7,4,89,34,2]
for i in range(0,len(a)):
for j in range(i+1,len(a)):
if a[j]
a[i],a[j]=a[j],a[i]
print(a)
24.实现斐波那契数列(第一项和第二项都是1,后面的都是前面2项相加)?
参考:
方法一
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 斐波那契数列
def fib(n):
a, b = 1, 1
for i in range(n-1):
a, b = b, a+b
return a
# 输出了第10个斐波那契数列
print fib(10)
方法二
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 斐波那契数列
# 使用递归
def fib(n):
if n == 1 or n == 2:
return 1
return fib(n - 1) + fib(n - 2)
# 输出了第10个斐波那契数列
print fib(10)
25.计算n!(n的阶乘)?
参考:
def factorial(n):
result = n
for i in range(1,n):
result *= i
return result
def main():
print factorial(4)
if __name__ == '__main__':
main()
26.python如何实现单例模式?
参考:
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。