关于Python的20个面试题

关于Python的20个面试题

Posted March 08, 2017

Python 是一个高级、解释型、交互式和面向对象的脚本语言. Python 语言设计具有高度可读性的, 使用一些常见的英语词组和其他语言常用的标点符号组成的语法结构, 相对于其他语言它具有更少的语法结构.

Python 是解释语言: 意思就是代码由Python解释器在run-time时直接处理, 而不需要在运行前去编译你的程序.

Python 是可交互的: 意思就是可以用Python提示符来对解释器进行交互式操作.

Python 是面向对象的: 意思就是Python支持OOP编程.

Python 是初学者首选语言,从最基本的简单文本处理到web服务或者游戏的各种应用开发, Python都能胜任.

1) 什么是Python? 使用Python的好处是什么?

Python 是一种具有对象、模块、线程、异常和自动内容管理的编程语言. 它具有简单、易学、轻量、可扩展、内置数据结构和开源的优点.

请欣赏Python教义

Python

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

2) 什么是PEP 8?

PEP 8 是Python的一个规范, 是对Python开发具有可读性的一组定义.

3) 什么是序列化和反序列化?

Pickle 是Python里面一个基本但功能强大的Python 对象序列化(pickling)和反序列化(unpickling)的模块. picking 就是将对象的层次结构转化为字节流的一个过程。 而把字符串对象转换为原始的对象的过程就是unpickling.

4) Python 如何解释运行?

Python 是可执行语言, 它从程序员的源代码开始, 将程序员写的源代码转换为中间语言(字节码形式), 其次再被解释器转换为可以执行的机器语言.

5) Python 如何管理内存?

内存由Python私有堆空间管理, 所有的Python对象和数据结构都位于私有堆中. 程序员没有访问私有堆的权限, 解释器负责这个私有堆空间.

Python memory manager 为对象分配堆空间. 核心的API提供一些工具, 供程序员去编码.

Python 中内置了一个“垃圾桶”, 它回收所有未使用的内存并释放内存, 使其在次用于可用的堆空间.

6) 哪个工具可以帮助找到错误或静态分析?

PyChecker 是一个静态分析工具, 可以检测源代码中的错误并警告错误的编码风格. Pylint 是另外一个编码规范检查的工具.

7) 什么是装饰器?

装饰器是Python的语法糖, 可以轻松的改变函数的一个实现. 并能复用,

8) list和tuple由什么区别?

两者都是列表容器, 但list 可变, tuple不可变.

9) 什么是unittest ?

Python中的一个单元测试框架

10) 什么是字典、列表推导式?

是Python中语法, 可以基于一个现有可迭代对象, 生成Dict或者List.

11) Python 提供了哪些内置类型?

Mutable built-in types

  • List
  • Sets
  • Dictionaries

Immutable built-in types

  • Strings
  • Tuples
  • Numbers

12) 什么是命名空间?

在Python中, 任何对象都会存在一个地方, 在这个地方可以被调用. 那么这个地方空间就是命名空间. 它就像一个盒子或者一个结界, 其中的变量名映射到盒子中的位置. 当使用这个变量的时候, 会在其盒子内搜索这个映射对象。

13) 什么是lambda?

它是一个常被用作內联函数的单一表达式 ------ 匿名函数

14) pass 在Python中代表什么?

pass 意味着什么都不操作, 当我们在设计接口框架的时, 先定义了方法名, 如果来不及写方法的具体实现, 可以写入pass 来避免语法错误.

15) 什么是迭代器?

迭代器用于迭代一组元素、容器如list.

16) 什么是slicing?

切片, 从一个已有的序列(如: List, Tuple, Strings)中选择范围的机制称为切片.

Python

>>> li = [1,2,3,4,5,6,7,8,9]
>>> li[2:6]
[3, 4, 5, 6]
>>> 'Helloworld'[2:8]
'llowor'

17) 什么生成器?

在Python中, 使用生成器可以很方便的支持迭代器协议。 生成器通过生成器函数产生, 生成器函数可以通过常规的def语法来定义, 但是不用return返回, 而是使用yield一次返回一个结果, 在每个结果之间挂起, 继续它们的状态, 来自动实现迭代协议. 也就是说, yield是一个语法糖, 内部实现了支持了迭代器的协议, 同时yield内部是一个状态机, 维护着它们挂起和继续的状态.

以下为一个生成器函数实现斐波那契.

Python

>>> def fab(max):
...     n, a, b = 0, 0, 1
...     while n < max:
...         yield b;
...         a, b = b, a + b
...         n = n + 1
...
>>> for i in fab(5):
...     print(i)
...
1
1
2
3
5
>>>

18) 什么是docstring?

Python 的文档字符称为docstring, 他是一种记录函数, 模块和类的文档的形式. 代码及文档, 可以使用相应的工具生成文档页面, 部署到gitbook上, 或生成Markdown文档.

Python

def get(url, params=None, **kwargs):
    """Sends a GET request.
    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    kwargs.setdefault('allow_redirects', True)
    return request('get', url, params=params, **kwargs)

19) 如何复制对象?

python中赋值时时按照引用传递的, 所以如果从单纯的赋值语句来实现clone对象的话, 那可能bug出现的也会莫名其妙. Python中可以使用copy模块来复制对象.

copy.copy 为浅拷贝, 只copy父对象, 不会拷贝对象内部的字对象 copy.deepcopy 深拷贝, 拷贝对象及其字对象

Python

>>> import copy
>>> a = [1,2,3,4,['a','b']]
>>> b = a                    # 赋值拷贝
>>> c = copy.copy(a)         # 浅拷贝, 只拷贝了a的引用, 内部元素没有拷贝.
>>> d = copy.deepcopy(a)     # 深拷贝, 完全拷贝
>>>
>>> a.append(5)       
>>> a[4].append('c')
>>>
>>> print 'a=',a
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> print 'b=',b
b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]   #赋值拷贝, 内存地址指向一样的。 相当于一个人的两个名字而已.
>>> print 'c=',c
c= [1, 2, 3, 4, ['a', 'b', 'c']]      #浅拷贝, 子元素c[4]引用的地址和a[4]是一样的. 所以改变a[4]相当于改了c[4].
>>> print 'd=',d
d= [1, 2, 3, 4, ['a', 'b']]           #深拷贝完全拷贝. a和d完全改变了.

20) 什么是负索引?

python序列的索引可以是正数和负数的索引, 对于正索引就是从0开始, 1是第二个. 对于负索引, -1是最后一个元素, -2是倒数第二个元素.

Python

>>> a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> a[-1]
5
>>> a[-2]
['a', 'b', 'c']
>>> a[2:-2]  # 也可以在切片中使用, 第二个到倒数第二个之间的范围
[3, 4]

21) xrange和range之间有什么区别?

xrange 返回一个xrange对象, 而range返回一个列表. xrange对象其实就是一个生成器, range返回全部列表, 当range值过大, 则效率越慢. 在循环的时候最好使用xrange, 当然如果非要明确的(长度可控且不大)列表, 可以使用range.

Python

>>> print type(xrange(10000))
<type 'xrange'>
>>> print dir(xrange(10000))
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> print type(range(10000))
<type 'list'>
>>> print dir(range(10000))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

你一直弄不懂的Java反射机制

Java反射机制, 啧啧, 当你看到这几个字的时候就有一种不好的预感, 没错, 这个东西是不怎么好理解, 所以特开此篇, 从实用的角度, 用确切的代码来讲解一下...

17610
来自专栏数据科学与人工智能

【Python环境】Python面试题汇总(一)

拿网络上关于Python的面试题汇总了,给出了自认为合理的答案,有些题目不错,可以从中学到点什么,答案如不妥,请指正...... +++++++++++++++...

38960
来自专栏Java Web

《编写高质量代码》学习笔记(2)

写着写着发现简书提醒我文章接近字数极限,建议我换一篇写了。 ---- 建议52:推荐使用String直接量赋值 一般对象都是通过new关键字生成的,但是Str...

38240
来自专栏葡萄城控件技术团队

C#7.0中有哪些新特性?

以下将是 C# 7.0 中所有计划的语言特性的描述。随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的大部分将活跃起来。现...

20580
来自专栏程序员互动联盟

【编程基础】聊聊C语言-兵马未动粮草先行(1)

上一篇我们讲的聊聊C语言-我的地盘我做主,相信大家对变量的存储类型和变量的作用域有了一定的了解。现在我们马上公布上期的答案如下: #include<stdio....

35280
来自专栏Modeng的专栏

Javascript数组系列三之你不了解的迭代2

今天我们来继续 Javascript 数组系列的文章,上文 《Javascript数组系列二之迭代方法1》 我们说到一些数组的迭代方法,我们在开发项目实战的过程...

15630
来自专栏风口上的猪的文章

.NET面试题系列[10] - IEnumerable的派生类

IEnumerable分为两个版本:泛型的和非泛型的。IEnumerable只有一个方法GetEnumerator。如果你只需要数据而不打算修改它,不打算为集合...

14120
来自专栏Java技术栈

Java 程序员必须掌握的 5 个注解!

* 来源:www.codeceo.com/5-annotations-every-java-developer-should-know.html

10220
来自专栏飞雪无情的博客

从Java到Golang快速入门

Golang从09年发布,中间经历了多个版本的演进,已经渐渐趋于成熟,并且出现了很多优秀的开源项目,比如我们熟知的docker,etcd,kubernetes等...

14230
来自专栏me的随笔

Python知识梳理

我们可以使用type()函数类获取对象的类型,Python3中内置数据类型包括:None,int,float,complex,str,list,dict,tup...

17620

扫码关注云+社区

领取腾讯云代金券