python基础面试题
2018-12-13 本文已影响0人
xiaoshengMar
1. 为什么学习Python?
- 全球主流的编辑语言
Python , 是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继Java,C++之后的的第三大语言。 特点:简单易学、免费开源、高层语言、可移植性强、面向对象、可扩展性、可嵌入型、丰富的库、规范的代码等。 - 无所不能的编程语言
Python除了极少的事情不能做之外,其他基本上可以说全能,Python可以做系统运维、云计算开发、图形处理、金融分析、游戏开发、数学处理数据库编程、网络编程、WEB编程、PYMO引擎、黑客编程、爬虫开发、机器学习、人工智能等等。 - 企业越来越热衷的语言
Python强大的生态圈注定它了应用广泛,国内的豆瓣、搜狐、金山、通讯、盛大、网易、百度、阿里、土豆、新浪等,国外:谷歌、NASA、YOUTU、FACEBOOK、红帽等企业都在广泛应用。 - 国家政策推动支持
国务院发布了《新一代人工智能发展规划》,人工智能正式纳入国家发展战略,开启了国内人工智能产业发展的新篇章。2017年Python还被列入全国计算机等级考试,山东省小学课程加入了Python,浙江省、北京市、山东省已把Python纳入信息技术课程和高考的内容体系。
2. 通过什么学习Python?
通过网上各种学习视频,比如小甲鱼,慕课的七月老师以及各大Python的交流论坛等。
3. Python和Java、PHP、C、C#、C++等其他语言的对比?
- python语言,是一种面向对象、直译式计算机程序设计语言,Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。常见的一种应用情形是,使用python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写。
- Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。
- Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。
4.简述解释型和编译型编程语言?
1. 概念
- 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
- 解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!
2. 区别
- 编译型语言,执行速度快、效率高;依赖编译器、跨平台性差些。如C、C++、Delphi、Pascal,Fortran。
- 解释型语言,执行速度慢、效率低;依赖解释器、跨平台性好。如Java、Basic。
3. python
- Python 的采用了类似Java的编译模式,先将Python程序编译成Python字节码,然后由一个专门的Python字节码解释器负责解释执行字节码。
- python是解释型语言,它通过python解释器实现向底层语言的映射。我们知道python虚拟机是由C语言编写的,所以python程序会转化为C程序而执行。比如,python中的所有对象都会在C中有对应的PyObject结构体。python的list、dict等数据类型也要在C中有对应的表示。而像生成器、迭代器等语法结构需要相应的支持。
5. python解释器种类及特点?
Python是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多种解释器,分别基于不同语言开发,每个解释器有不同的特点,但都能正常运行Python代码,以下是常用的五种Python解释器:
- CPython
当 从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。 - IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了IE。 - PyPy
PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度。 - Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。 - IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
在Python的解释器中,使用广泛的是CPython,对于Python的编译,除了可以采用以上解释器进行编译外,技术高超的开发者还可以按照自己的需求自行编写Python解释器来执行Python代码,十分的方便!
6. 位和字节的关系?
- 最小的存储单位称为位(bit):只能容纳两个值(0或1)之一,不能在一个位中存储更多的信息。位是计算机存储的基本单位。
- 字节(byte)是常用的计算机存储单位。
字节的标准定义:一个字节均为8位。由于上述所讲每个位或者是0或者是1,所以一个8位的字节包含256种可能的0,1组合。 - 对于一种给定的计算机设计,字(word)是自然的存储单位。
一个英文字符和英文标点占用一个字节,一个中文字符和中文标点占用2个字节。
7. b、B、KB、MB、GB 的关系?
- utf-8中一个字母或者数字等于一个字节,一个汉字等于3个字节,表情等于4个字节
b 比特bit / 位
B——字节
KB——千比特
MB——兆比特
GB——吉比特
1 B = 8b (8个bit/ 位) 一个字节(byte)等于8位(bit)
1 kB = 1024 B (kB - kilobajt)
1 MB = 1024 kB (MB - megabajt)
1 GB = 1024 MB (GB - gigabajt)
英文和数字占一个字节
中文占一个字符,也就是两个字节
字符 不等于 字节。
字符(char)是 Java 中的一种基本数据类型,由 2 个字节组成,范围从 0 开始,到 2^16-1。
字节是一种数据量的单位,一个字节等于 8 位。所有的数据所占空间都可以用字节数来衡量。例如一个字符占 2 个字节,一个 int 占 4 个字节,一个 double 占 8 个字节 等等。
1字符=2字节;
1Byte=8bit
1k=2^10;b:位;B:字节1kb=1024 位1kB=1024 字节。
8. 请至少列举5个 PEP8 规范(越多越好)。
-
代码编排
- 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
- 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
- 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
-
文档编排
- 模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
- 不要在一句import中多个库,比如import os, sys不推荐。
- 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。
-
空格的使用
- 总体原则,避免不必要的空格。
- 各种右括号前不要加空格。
- 逗号、冒号、分号前不要加空格。
- 函数的左括号前不要加空格。如Func(1)。
- 序列的左括号前不要加空格。如list[2]。
- 操作符左右各加一个空格,不要为了对齐增加空格。
- 函数默认参数使用的赋值符左右省略空格。
- 不要将多句语句写在同一行,尽管使用‘;’允许。
- if/for/while语句中,即使执行语句只有一句,也必须另起一行。
-
注释
- 总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
- 注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。
- 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。
- 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x
但是这种方式尽量少使用。 - 避免无谓的注释。
-
文档描述
- 为所有的共有模块、函数、类、方法写docstrings;非共有的没有必要,但是可以写注释(在def的下一行)。
- 如果docstring要换行,用三引号。
-
命名规范
- 总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格。
- 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。
- 模块命名尽量短小,使用全部小写的方式,可以使用下划线。
- 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
- 类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。
- 异常命名使用CapWords+Error后缀的方式。
- 全局变量尽量只在模块内有效,类似C语言中的static。实现方法有两种,一是all机制;二是前缀一个下划线。
- 函数命名使用全部小写的方式,可以使用下划线。
- 常量命名使用全部大写的方式,可以使用下划线。
- 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。
- 类的属性有3种作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public属性前,前缀一条下划线。
- 类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。
- 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。比如:类Foo中声明__a,访问时,只能通过Foo._Foo__a,避免歧义。如果子类也叫Foo,那就无能为力了。
- 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。
-
编码建议
- 编码中考虑到其他python实现的效率等问题,比如运算符‘+’在CPython(Python)中效率很高,都是Jython中却非常低,所以应该采用.join()的方式。
- 尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x。
- 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception。
- 异常中不要使用裸露的except,except后跟具体的exceptions。
- 异常中try的代码尽可能少。比如:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
要优于
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
- 使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如:
Yes: if foo.startswith('bar'):优于
No: if foo[:3] == 'bar': - 使用isinstance()比较对象的类型。比如
Yes: if isinstance(obj, int): 优于
No: if type(obj) is type(1): - 判断序列空或不空,有如下规则
Yes: if not seq:
if seq:
优于
No: if len(seq)
if not len(seq)- 字符串不要以空格收尾。
- 二进制数据判断使用 if boolvalue的方式。