1.为什么学习Python
Python这门语言,入门比较简单,它简单易学,生态圈比较强大,涉及的地方比较多,特别是在人工智能,和数据分析这方面。在未来我觉得是往自动化,人工智能这方面发展的,所以学习了Python。
2.Python和其他语言的区别
从三个方面看Python
语言特点
简洁 优雅 省略了各种大括号和分号,还有一些关键字,类型说明
语言类型
解释型语言,运行的时候是一行一行的解释,并运行,所以调试代码很方便,开发效率高.
第三方库
python是开源的,并且python的定位时任由其发展,应用领域很多,比如Web,运维,自动化测试,爬虫,数据分析,人工智能.Python具有非常完备的第三方库
3.Python的优势
1. 简单:Python奉行简洁主义,易于读写,它使你能够专注于解决问题而不是去搞明白语言本身。
2. 免费:Python是开源软件。这意味着你不用花一分钱便能复制、阅读、改动它,这也是Python越来越优秀的原因——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。
3. 兼容性:Python兼容众多平台,所以开发者不会遇到使用其他语言时常会遇到的困扰。
4. 面向对象:Python既支持面向过程,也支持面向对象编程。在面向过程编程中,程序员复用代码,在面向对象编程中,使用基于数据和函数的对象。
6. 规范的代码:Python采用强制缩进的方式使得代码具有极佳的可读性。
7. 可扩展性和可嵌入性。如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
4.Python的解释器种类?
Python解释器主要有以下几个:
1、CPython
官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。CPython是使用最广且被的Python解释器。
2、IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。
3、PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
4、Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行
5、IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。在这些Python解释器中,使用广泛的是CPython 。这里还是要推荐下小编的Python学习喂鑫*(同音):‘’七六二,四五九,五一零‘’不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2021最新的Python资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。
5.python2和python3区别
一、核心类差异
1. Python3 对 Unicode 字符的原生支持。
Python2 中使用 ASCII 码作为默认编码方式导致 string 有两种类型 str 和 unicode,Python3 只支持 unicode 的 string。Python2 和 Python3 字节和字符对应关系为:
2. Python3 采用的是绝对路径的方式进行 import
Python2 中相对路径的 import 会导致标准库导入变得困难(想象一下,同一目录下有file.py,如何同时导入这个文件和标准库 file)。Python3 中这一点将被修改,如果还需要导入同一目录的文件必须使用绝对路径,否则只能使用相关导入的方式来进行导入。
3. Python2 中存在老式类和新式类的区别,Python3 统一采用新式类。新式类声明要求继承 object,必须用新式类应用多重继承。
4. Python3 使用更加严格的缩进。Python2 的缩进机制中,1 个 tab 和 8 个 space 是等价的,所以在缩进中可以同时允许 tab 和 space 在代码中共存。这种等价机制会导致部分 IDE 使用存在问题。
·Python3 中 1 个 tab 只能找另外一个 tab 替代,因此 tab 和 space 共存会导致报错:
TabError:inconsistent use of tabs and spaces in indentation.
二、废弃类差异
1. print 语句被 Python3 废弃,统一使用 print 函数
2. exec 语句被 python3 废弃,统一使用 exec 函数
3. execfile 语句被 Python3 废弃,推荐使用 exec(open("./filename").read)
4. 不相等操作符"<>“被 Python3 废弃,统一使用”!="
5. long 整数类型被 Python3 废弃,统一使用 int
6. xrange 函数被 Python3 废弃,统一使用 range,Python3 中 range 的机制也进行修改并提高了大数据集生成效率
7. Python3 中这些方法再不再返回 list 对象:dictionary 关联的 keys、values、items,zip,map,filter,但是可以通过 list 强行转换:
8. mydict={“a”:1,“b”:2,“c”:3}
9. mydict.keys #
10. list(mydict.keys) #[‘a’, ‘c’, ‘b’]
11. 迭代器 iterator 的 next函数被 Python3 废弃,统一使用 next(iterator)
12. raw_input 函数被 Python3 废弃,统一使用 input 函数
13. 字典变量的 has_key 函数被 Python 废弃,统一使用 in 关键词
14. file 函数被 Python3 废弃,统一使用 open 来处理文件,可以通过 io.IOBase 检查文件类型
15. apply 函数被 Python3 废弃
16. 异常 StandardError 被 Python3 废弃,统一使用 Exception
三 、修改类差异
1. 浮点数除法操作符“/”和“//”的区别
Python2:若为两个整形数进行运算,结果为整形,但若两个数中有一个为浮点数,则结果为浮点数;
Python3:为真除法,运算结果不再根据参加运算的数的类型。
Python2:返回小于除法运算结果的最大整数;从类型上讲,与"/"运算符返回类型逻辑一致。
Python3:和 Python2 运算结果一样。
2. 异常抛出和捕捉机制区别
Python2
3. raise IOError, “file error” #抛出异常
4. except NameError, err: #捕捉异常
Python3
5. raise IOError(“file error”) #抛出异常
6. except NameError as err: #捕捉异常
7. for 循环中变量值区别
Python2,for 循环会修改外部相同名称变量的值
8. i = 1
9. print ('comprehension: ', [i for i in range(5)])
10. print (‘after: i =’, i ) #i=4
Python3,for 循环不会修改外部相同名称变量的值
11. i = 1
12. print ('comprehension: ', [i for i in range(5)])
13. print (‘after: i =’, i ) #i=1
14. round 函数返回值区别
Python2,round 函数返回 float 类型值
15. isinstance(round(15.5),int) #True
Python3,round 函数返回 int 类型值
16. isinstance(round(15.5),float) #True
17. 比较操作符区别
Python2 中任意两个对象都可以比较
18. 11 < ‘test’ #True
Python3 中只有同一数据类型的对象可以比较
19. 11 < ‘test’ # TypeError: unorderable types: int < str
四、第三方工具包差异
五、工具安装问题
6.深拷贝和浅拷贝的区别是什么?
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同值)
浅拷贝(shallowCopy)只是增加了一指针指向已存在的内存地址。
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存
使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。
浅拷贝:仅仅时指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深拷贝:在计算机中开辟一块新的内存地址用于存放复制的对象。
但是在python中,对浅拷贝和深拷贝,还需要分数据类型是可变类型还是不可边类型。可变数据类型 ,不可变数据类型
7.位和字节的关系?
位:"位(bit)"是电子计算机中最小的数据单位。每一位的状态只能是0或1。
字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。
8.b、B、KB、MB、GB 的关系?
9.python递归的最大层数?
10.解释 Python 中的 help 函数和 dir 函数。
help 函数返回帮助文档和参数说明:
运行结果如下:
Help on function copy in module copy
copy(x)
Shallow copy operation on arbitrary Python objects.
See the module』sdocstring for more info.
dir 函数返回对象中的所有成员 (任何类型)
11.当退出 Python 时是否释放所有内存分配?
答案是否定的。那些具有对象循环引用或者全局命名空间引用的变量,在 Python 退出是往往不会被释放,另外不会释放 C 库保留的部分内容
12.什么是 Python 字典?
字典是我在 C++和 Java 中没有见过的数据结构,它拥有键-值对
3
字典是可变的,我们也可以用推导式的方式创建它.
{25: 5, 16: 4, 9: 3, 4: 2, 1: 1}
13.能否解释一下 *args 和 **kwargs?
如果我们不知道将多少个参数传递给函数,比如当我们想传递一个列表或一个元组值时,就可以使用*args。
3
2
1
4
7
当我们不知道将会传入多少关键字参数时,使用**kwargs 会收集关键字参数。
a.1
b.2
c.7
使用 args 和 kwargs 作为参数名只是举例,可以任意替换。这里还是要推荐下小编的Python学习喂鑫*(同音):‘’七六二,四五九,五一零‘’不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2021最新的Python资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。
对于 Python 的基础题任何疑问,请在评论区提问。
14.什么是负索引?
我们先创建如下列表:
与正索引不同,负索引是从右边开始检索。
6
同样可以用于列表的切片:
[3, 4, 5, 6, 7]
15. 如何随机打乱列表中元素,要求不引用额外的内存空间?
我们用 random 包中的 shuffle 函数来实现。
[3, 4, 8, 0, 5, 7, 6, 2, 1]
16.解释 Python 中的 join 和 split 函数
join 函数可以将指定的字符添加到字符串中。
‘1,2,3,4,5’
split 函数可以用指定的字符分割字符串
[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]
17.Python 区分大小写吗?
验证 Python 是否区分大小写的方法是测试 myname 和 Myname 在程序中是不是算同一个标识符。观察以下代码的返回结果:
Myname
NameError: name ‘Myname’ is not defined
如你所见,这里出现了 NameError,所以 Python 是区分大小的语言。
18.Python 中标识符的命名规则?
Python 中的标识符可以是任意长度,但必须遵循以下命名规则:
1. 只能以下划线或者 A-Z/a-z 中的字母开头。
2. 其余部分只能使用 A-Z/a-z/0-9。
3. Python 标识符区分大小写。
4. 关键字不能作为标识符。Python 有以下这些关键字
[图片上传失败…(image-55b0e-1629536540332)]
19.如何删除字符串中的前置空格
前置空格是第一个非空格字符前的所有空格,使用 lstrip 函数来删除.
‘Ayushi ‘
如图这个字符串既包含前置空格也包含后置空格. 调用 lstrip 函数去除了前置空格。如果想去除后置空格,使用 rstrip 函数。
‘ Ayushi’
20.Python 中的 pass 语句有什么作用?
我们在写代码时,有时可能只写了函数声明而没想好函数怎么写,但为了保证语法检查的正确必须输入一些东西。在这种情况下,我们使用 pass 语句。
类似的 break 语句可以跳出循环。
0
1
2
continue 语句可以跳到下一轮循环。
0
1
2
4
5
6
21.请解释 Python 中的闭包?
如果在一个内部函数里。对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就是一个闭包。
22.解释 Python 中的//,%和**运算符
//运算符执行地板除法,返回结果的整数部分 (向下取整)。
3
用/符号除法结果为 3.5。
符号表示取幂. ab 返回 a 的 b 次方
1024
% 是取模符号。返回除法后的余数。
6
0.5
23.Python 中有多少种运算符,解释算术运算符。
这类面试问题可以判断你的 Python 功底,可以举一些实例来回答这类问题。
在 Python 中我们有 7 中运算符:算术运算符、关系 (比较) 运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符。
\1. 加号 (+) 将两个对象的值相加。
15
\2. 减号 (-) 将第一个对象的值减去第二个对象的值。
-1
\3. 乘号 (*) 将两个对象的值相乘。
56
\4. 除号 (/) 将第一个对象的值除以第二个对象的值。
0.875
1.0
关于地板除法、取模和取幂,请参考上一个问题。
24.解释 Python 中的关系运算符。
关系运算符用来比较两个对象。
\1. 判断小于 (<):如果符号左边的值比右边小则返回 True。
False
\2. 判断大于 (>):如果符号左边的值比右边大则返回 True。
True
出现上面的错误结果是因为 Python 的浮点运算存在一些 Bug。
\3. 判断小于等于 (<=):如果符号左边的值小于或等于右边则返回 True。
True
\4. 大判断于等于 (>=):如果符号左边的值大于或等于右边则返回 True。
True
\5. 判断等于 (==) 如果符号两边的值相等则返回 True。
True
\6. 判断不等于 (!=) 如果符号两边的值不等则返回 True。
True
True
25.解释 Python 中的位运算符
此运算符按二进制位对值进行操作。
\1. 与 (&) 返回按位与结果
2
\2. 或 返回按位或结果
3
\3. 异或 (^) 返回按位异或结果
1
\4. 取反 (~) 返回按位取反结果
-3
\5. 左移位 (<<) 将符号左边数的二进制左移右边数位
4
1 的二级制 001 左移 2 位变成 100 也即十进制的 4
\6. 右移位 (>>)
1
26.如何在 Python 使用多进制数字?
除十进制以外,在 Python 中还可以使用二进制、八进制、十六进制。
\1. 二进制数有 0 和 1 组成,我们使用 0b 或 0B 前缀表示二进制数
10
使用 bin 函数可以将数字转换为二进制
‘0b1111’
\2. 八进制数由数字 0-7 组成,使用前缀 0o 或 0O 表示 8 进制数
‘0o10’
\3. 十六进数由数字 0-15 组成,使用前缀 0x 或者 0X 表示 16 进制数
‘0x10’
‘0xf’
27.如何获取字典中的所有键?
使用 keys 来获取字典中的所有键
28.问什么标识符不建议使用下划线开头?
因为在 Python 中以下划线开头的变量为私有变量,如果你不想让变量私有,就不要使用下划线开头。
29.什么是元组的解封装?
首先我们来介绍元组封装:
(3, 4, 5)
将 3,4,5 封装到元组 mytuple 中。
现在我们要将这些值解封装到变量 x,y,z 中
12
30.Python3和Python2中 int 和 long的区别?
python2有非浮点数准备的int和long类型。int类型最大值不能超过sys.maxint,而且这个最大值是平台相关的。
可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。
python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。
31.列举 Python 中的基本数据类型?
Python3中有6种基本数据类型,列表(list)、元组(tuble)、字典(dict)、集合(sets)、字符串(string)、数字(digit)。
32.将"hello world"转换为首字母大写"Hello World“hello world”.title
33.如何检测字符串中只含有数字?'123bp'.isdigit返回True or False#或者使用正则:bool(re.search(r’\d’,’qw123’))#或者使用Unicode码:if uchar >= u'\u0030' and uchar <= u'\u0039'
34.将字符串"ilovechina"进行反转"ilovechina"[::-1]
35.Python 交换两个变量的值a, b = b, a
36.Python 里面如何实现 tuple 和 list 的转换?tuple(list)
37.Python 中的字符串格式化方式你知道哪些?'I %s her %s'%('love','cat')'I {a} her {b}'.format(a='love',b='cat')f'I {a} her {b}' #【Python3.6推荐写法】
38.如何对list去重?
1)先建立一个新的空列表,通过遍历原来的列表,再利用逻辑关系not in 来去重。此方法保证了列表的顺序性。
li=[1,2,3,4,5,1,2,3]new_li=for i in li: if i not in new_li: new_li.append(i)print(new_li)
2)将列表转化为集合再转化为列表,利用集合的自动去重功能。简单快速。缺点是:使用set方法无法保证去重后的顺序。
li=[1,2,3,4,5,1,2,3]new_li=list(set(li))new_li.sort(key=li.index)print(new_li)
39.给定两个 list,A 和 B,找出相同元素和不同元素A、B 中相同元素:set(A)&set(B)A、B 中不同元素:set(A)^set(B)
40.如何打乱一个列表的元素?random.shuffle(l1)
41.字典操作中 del 和 pop 有什么区别del d[key] 直接删除d.pop(key) 返回键的值
42.请合并下面两个字典 a = {“A”:1,“B”:2},b = {“C”:3,“D”:4}a.update(b)
44.如何交换字典 {“A”:1,“B”:2}的键和值{value:key for key value in dict.items}
45.切片Slice
切片,是一个比较生疏的名词,这是现代计算机编程语言或者说Python里的一个概念,大致意思是从一个集合里切出一块来,就像切一块豆腐,一刀下去切出两块豆腐,问题是两刀能切出几块?开个小玩笑!
先看一个函数range、返回值是列表,内容和传入range的函数有关。
a = range(1, 21)print a
结果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
明白了,range可以产生从1到20共20个元素的列表,range的第二个参数不包含这个值,但包含第一个参数的值,每个元素值相差为1。
46.什么是切片
回到正题,切片是对有序的集合而言,意思从有序集合里提取数据构成子集集合,给定提取的起点start、终点end以及方向上的步长step,能否切出非空子集,起点start需能沿步长方向上到达终点。
字符串和列表、元组都是有序集合,均可实现切片操作,以列表为例给出切片的语法格式如下:
子集名 = 有序集合名[start : end : step]
上边range(1, 21)和切片里的start、end是呼应一致的,含起点start对应的值而不含终点end所对应的值。
step = 1
子集的构成是从start开始每step取一个数据一至到end-1位置结束,step默认为1时,可以省略不写。
s = "python"a = list(s)print ab = a[2:5]print b
程序的结果如下:
['p', 'y', 't', 'h', 'o', 'n']['t', 'h', 'o']
[图片上传失败…(image-67e174-1629536540310)]
从print b这条语句的打印结果[‘t’, ‘h’, ‘o’]可知,'t’在a列表的index为2,‘n’字符的index为5,那么a[2:5]的step为1,从’t’开始逐个取回字符’t’、‘h’、'o’组成新的列表的子集b,而字符’n’的index为5,5作为取切片操作a[2:5]里的终点,其字符’n’不取回。从例子可以看出step 为1可以理解为“逐个取”。
step > 1
step可以大于1,这个时候对于step的理解可以这样认为,每step个取一个。
s = "python"a = list(s)print ab = a[2:5:2]print b
程序的结果如下:
['p', 'y', 't', 'h', 'o', 'n']['t', 'o']
对于列表a取切片a[2 : 5 : 2], 从index为2开始,每2个元素为一组取每组的第一个数据值,一只到index为5结束,但不取index为5的数据。
a[2 : 5 : 2]具体操作是这样的,从index为2的字符’t’开始,到index为5的字符’n’之前,每2个为一组(‘t’, ‘h’)、(‘o’, ‘n’)取每组的第一个元素值’t’、'o’即结果子集b的值。
再看一个例子:
a = range(12)print ab = a[1 : 10 : 3]print b
结果是:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11][1, 4, 7]
从两行输出结果的第一行可以看出range函数可以产生一个从0开始到小于12的整数的列表,共12个数据。
第二行的输出[1, 4, 7]是怎么产生的呢?这个和对a列表的切片操作有关,a[1 : 10 : 3],这里a[1:10] = [1, 2, 3, 4, 5, 6, 7, 8, 9],每3个一组,从每组取第一个,即 [1, 2, 3],[4, 5, 6], [7,8, 9]这三组,取每组第一个1、4、7构成b这个子集,最后得到的b = [1, 4, 7]。
47.元组的定义
定义一个元组很简单,将一堆数据用圆括号括起来,用逗号间隔各个元素即可定义一个元组,元组里的数据是只读的不可被修改。
变量名 = (元素值序列)
48.字符串的三种引号print 'hello'print "hello"print '''hello'''print """hello"""
一般三引号可以在Python源代码里用作多行注释或定义多行的字符串,另外Python可以用井号(#)进行单行注释。
a = 12b = 13"""求和"""c = a + b
字符串是有序不可修改的序列,可以通过索引或者for循环体访问字符串里的各个元素值。
s = "python"print s[1]for c in s: printc
49.字典dict访问
通过键值
字典的数据是由key:value对儿构成的每项数据,那么想访问某项数据的value需要可以通过运算来获得,其语法结构如下:
字典名[key]
字典的get函数
字典有个等价函数get可以获得这种方式的相同结果,语法结构如下:
字典名.get(key)
get函数返回值就是这个key所对应的值。
例如:
d = {1 : 2, "a" : 13, 12.4 : 77}print d.get("a")
但是如果无key的话,get返回None而不会报错发生异常,而用运算即字典名[key]则会报错异常。
50.字典的setdefault函数
还有一个函数setdefault 函数,它和get函数类似,返回指定键的值,如果键不在字典中,将会添加键并将值设置为一个指定值,默认为None。
get 和 setdefault 区别: setdefault 返回的键如果不在字典中,会添加键(更新字典),而 get 不会添加键。