前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于Python的20个面试题

关于Python的20个面试题

作者头像
用户1416054
发布2018-08-02 11:34:51
4480
发布2018-08-02 11:34:51
举报
文章被收录于专栏:JackeyGao的博客JackeyGao的博客

关于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

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
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

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> 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']
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于Python的20个面试题
    • 1) 什么是Python? 使用Python的好处是什么?
      • 2) 什么是PEP 8?
        • 3) 什么是序列化和反序列化?
          • 4) Python 如何解释运行?
            • 5) Python 如何管理内存?
              • 6) 哪个工具可以帮助找到错误或静态分析?
                • 7) 什么是装饰器?
                  • 8) list和tuple由什么区别?
                    • 9) 什么是unittest ?
                      • 10) 什么是字典、列表推导式?
                        • 11) Python 提供了哪些内置类型?
                          • 12) 什么是命名空间?
                            • 13) 什么是lambda?
                              • 14) pass 在Python中代表什么?
                                • 15) 什么是迭代器?
                                  • 16) 什么是slicing?
                                    • 17) 什么生成器?
                                      • 18) 什么是docstring?
                                        • 19) 如何复制对象?
                                          • 20) 什么是负索引?
                                            • 21) xrange和range之间有什么区别?
                                            相关产品与服务
                                            容器服务
                                            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档