Python 面试问题

最近正在团队内部普及 Python 语言,有些刚接触 Python 语言的工程师在概念上有很多混淆的地方,刚好看到这篇文章:Python面试问题,里面列举的问题都是关于 Python 基本的常识或者容易混淆的知识点,因此推荐给团队的 Python 初学者。

  1. 参数是如何传递的?传值还是传引用?(How are arguments passed – by reference of by value?)

    这个问题的有点c/c++风格,问题的实质是当一个传入的参数在函数体内被更改,那么在函数返回后,函数体外的这个参数变量的值是否改变。最简短的回答是,”都不是”,事实上 Python 里是传对象(call by object)。

    要弄明白这个变量的值是否在函数体外发生变化,需要明白两个概念:

    • Python 里的对象分为有可变(mutable)和不可变(immutable):数字(int, float),字符串,元组(tuple)是不可变的,列表(list),字典(dict)是可变的。
    • 所有的变量都是一个对象的引用。无论对象是否可变,这个变量都可被赋值为另外一个对象。

    因此,如果传入的参数变量指向一个不可变对象,那么在函数体外这个对象的内容永远不会发生变化;如果当传入的参数变量指向一个可变对象,那么这个对象是否发生变化,取决于函数体内部是否改变了这个可变对象的内容。

    下面的例子里,changed函数调用改变了传入对象的内容,unchanged函数将l变量赋值为一个新生成的对象l = l + ["a"],但原始对象并未发生变化:

    def changed(l):
    l.append("a") # change the original object def unchanged(l):
    l = l + ["a"] # l + ["a"] will create a new list, instead of changing the original object l1 = []
    changed(l1)
    # l1 == ["a"] l2 = []
    unchanged(l2)
    # l2 == []
  2. 什么是列表和字典推导(list and dict comprehensions)?你能给个例子吗?

    列表/字典推导是一种语法糖(syntax sugar),用来简化列表和字典的生成。根据第三版的”Learning Python”,列表推导的执行速度快于通常的循环,但并不确保以后的 Python 版本也是这个结果。

    # simple iteration
    a = []
    for x in range(10):
    a.append(x*2)
    # a == [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] # list comprehension
    a = [x*2 for x in range(10)] # dict comprehension
    a = {x: x*2 for x in range(10)}
    # a == {0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18 # set comprehension
    a = {x**2 for x in range(10) if x % 2 == 0}
    # a == set([0, 16, 4, 64, 36])

    列表推导是典型的 Pythonic 的代码书写方式。

  3. 什么是 PEP 8?

    PEP 8 定义的是 Python 代码规范,告诉你如何书写可读性强,更好维护的代码。详细内容请参考PEP 8 官方文档。Sublime Text编辑工具带有 PEP 8 格式检测插件,所存盘的文件都应当符合 PEP 8 的规范。

  4. 你使用虚拟环境(virtual environment)吗?

    很多 Python 程序员认为,包括我自己也是这样的观点,virtual environment是一个非常有用的工具,用来孤立你的开发和运行环境,特别是当需要同时开发多个项目,基于不同的 Python 版本以及运行库的时候。每当新建一个项目,或者clone一个已存在项目的时候,我都会按照下面的步骤建立和使用虚拟环境:

    # create virtual env
    virtualenv --no-site-packages --python=python3.2 ./venv # activate virtual env
    source ./venv/bin/activate
    # install requirements
    pip install -r requirements.txt #.....
    # update requirements
    pip freeze > requirements.txt
  5. 如何计算列表里所有元素的和?如何计算列表里所有元素的乘积?

    这个问题相当简单,但需要记住一点,你需要用 Pythonic 的方式来解答这个问题:

    # 计算列表内所有元素的和, 包括基本loop方式,sum函数方式,以及使用reduce函数
    
    # the basic way
    s = 0
    for x in range(10):
    s += x # the right way
    s = sum(range(10)) # the other way
    from operator import add
    s = reduce(add, range(10)) # 计算列表内所有元素的乘积 # the basic way
    s = 1
    for x in range(1, 10):
    s = s * x # the other way
    from operator import mul
    reduce(mul, range(1, 10))
  6. 你能列出列表(list)和元组(tuple)的区别吗?举例子说明用法的不同。

    列表和元组是 Python 里最基本的两个数据类型:

    • 首先,列表对象是可变的(mutable),但元组不是;
    • 其次,元组可被哈希(hashed),例如可以用作字典对象的键值(key);

    至于例子,地图上的地理坐标可以用二元组表示,而地图上的路径可以用坐标点列表来表示。

  7. 你知道rangexrange的区别吗?

    range函数返回的是一个列表对象,xrange返回的是一个xrange对象。他们的主要区别是:

    • 内存的占用不同。列表对象已经在内存中存在了,而xrange对象永远占 用同样的内存大小,无论需要生成的range有多大。
    • xrange对象不能使用列表对象的切片函数,也就是说 range(10)[3:5]能工作,但是xrange(10)[3:5]就不工作了。

    类似的问题还有:mapitertools.imap的区别?filteritertools.ifilter的区别?清楚这些区别,你就能知道怎样更有效地使用这些函数。

  8. 请说出一些 python2.x 与 python3.x 之间的区别。

    如果你经常看网上的文章,你肯定能说出一些区别:

    • python3.x 的字符串都是unicode;
    • python3.x 中print是函数,而不是语句;
    • python3.x 中使用range代替了xrange,删除了xrange函数;
    • python3.x 中全部类(class)都是新类型(new style);
    • python3.x 支持更简单的unpack方式,如first, *middle, last = [0, 1, 2, 3, 4, 5, 6, 7]

    如果你一条区别也说不出来,至少说明你对 Python 的关注度不够。

  9. 什么是修饰器(Decorator)?你能说出它的用途吗?

    修饰器(Decorator)也是一种非常 Pythonic 的方式,它可以让你非常方便地注入(inject)或者修改函数和类的代码。换句话说,修饰器允许你包装函数和类方法,在执行原始代码之前和之后执行其他的代码。修饰器语法能带来很多非常有意思的编码方式,例如:

    • 内存缓存

        def memoize(f):
      memo = {} # 将结果缓存在memo字典对象中,key是参数,value是结果。
      def helper(x):
      if x not in memo:
      memo[x] = f(x)
      return memo[x]
      return helper # 修饰fib函数,任何fib函数的调用,将首先察看是否已经有缓存的结果
      @memoize
      def fib(n):
      if n == 0:
      return 0
      elif n == 1:
      return 1
      else:
      return fib(n-1) + fib(n-2) print(fib(40)) # 102334155
    • 参数检测

        def argument_test_natural_number(f):
      def helper(x):
      if type(x) == int and x > 0:
      return f(x)
      else:
      raise Exception("Argument is not an integer")
      return helper @argument_test_natural_number
      def faculty(n):
      if n == 1:
      return 1
      else:
      return n * faculty(n-1) for i in range(1,10):
      print(i, faculty(i))
      # 1 1
      # 2 2
      # 3 6
      # 4 24
      # 5 120
      # 6 720
      # 7 5040
      # 8 40320
      # 9 362880 faculty(-1) # 使用非法的参数调用faculty函数,这将raise一个exception
      # Exception: Argument is not an integer
  10. with语句及其用法?

    简单地说,with语句允许你在进入和/或退出指定的代码块的时候,执行特定的代码。最常用的例子是使用with句打开文件。为了在你自己定义的对象上使用with语句,你必须定义__enter____exit__方法。

    更多的信息你可以查看理解 Python 的 with 语句


除了原文列举上述问题,下面知识点也是 Python 面试中很可能被问到的:

  • Package/Module的定义,以及模块加载原则;
  • 如何构建你自己的类型,如列表(list),字典(dict),迭代器(iterator);
  • 生成器(generator)的概念以及使用方式;
  • built-in 类型和函数;
  • 对象属性的操作原理,如dictgetattrgetattribute,描述 器(descriptor);
  • 元类编程(metaclass)的概念,以及如何使用;
  • 如何进行Package/Module的打包和分发;
  • 什么是WSGI;
  • 字符串的处理和正则表达式;
  • 如何操作json和xml数据;

另外,还必须尽可能地多了解 Python 语言最为强大的 库函数

http://xiaocong.github.io/blog/2013/06/16/python-interview-question-and-answer/

Python 面试问题的更多相关文章

  1. Python面试真题答案或案例

    Python面试真题答案或案例如下: 请等待. #coding=utf-8 #1.一行代码实现1--100之和 print(sum(range(1,101))) #2.如何在一个函数内部修改全局变量 ...

  2. Python面试 【315+道题】

    Python面试 [315+道题] 第一部分 Python基础篇(80题) 为什么学习Python? 因为看到python的发展趋势,觉得需要与时俱进,第一点,python开发速度极快,能快速完成一个 ...

  3. 10个Python面试常问的问题

    概述 Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位需求越来越高.下面我收集了10个Python面试官经常问的问题,供大家参考学习. 类继承 有如下的 ...

  4. Python面试基础篇

    1. 为什什么学习Python? Life is short, You need Python 2. 通过什什么途径学习的Python? pass 3. Python和Java.PHP.C.C#.C+ ...

  5. Python 面试中 8 个必考问题(转载)

    Python 面试中 8 个必考问题 1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list ...

  6. 常见的25个python面试问答

    常见的25个python面试问答 说到好用简洁的大数据技术,除了Hadoop.R等等,Python也是其中熠熠生辉的一员,因而广受企业和商家的青睐.求职季,不少应聘者在面试相关职业时都被要求掌握Pyt ...

  7. python面试笔试题汇总

    Python面试攻略(嗨谈篇) 110道python面试笔试题汇总,你能答对几道? Python 面试问答 Top 25 2018 年最常见的 Python 面试题 & 答案

  8. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  9. Python面试常考点之深入浅出链表操作

    Python面试常考点之深入浅出链表操作 在Python开发的面试中,我们经常会遇到关于链表操作的问题.链表作为一个非常经典的无序列表结构,也是一个开发工程师必须掌握的数据结构之一.在本文中,我将针对 ...

  10. Python面试简介及并行并发

    今天的分享内容大体如下: 一. 面试 1. 什么是面试 2. 优秀的面试 二. Python综述 1. Python设计哲学及版本变迁 2. Python发展现状及其他语言使用场景 3. GIL 4. ...

随机推荐

  1. CentOS 7.3下使用yum安装MySQL

    CentOS 7的yum源中默认是没有mysql的,要先下载mysql的repo源. 1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-commun ...

  2. 使用powershell管理Docker Toolbox

    打开PowerShell,输入: docker-machine ls 我们可以看到我们当前的Docker虚拟机的状态.如果什么都没有的话,那么我们可以使用以下命令创建一个Docker虚拟机. dock ...

  3. 20191127 Spring Boot官方文档学习(4.12)

    4.12.缓存(Caching) Spring框架提供了对应用程序透明添加缓存的支持.从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数.缓存逻辑是透明应用的,不会对调用者造成任何 ...

  4. sql limit order by and where

    1 sql limit limit size,返回前size行. limit offset , size,返回offset开始的size行,offset从0行开始. 2 sql limit with ...

  5. Windows Server 2012 上安装 dotNET Framework v3.5

    Windows Server 2012不能直接运行dotNET Framework v3.5安装程序进行安装,系统提供通过服务器管理器的添加功能和角色向导进行安装. 安装的前几个步骤再这里略去,在默认 ...

  6. Spring框架 课程笔记

    Spring框架 课程笔记 第1章  Spring概述 1.1 Spring概述 1)        Spring是一个开源框架 2)        Spring为简化企业级开发而生,使用Spring ...

  7. MySQL插入emoji表情报错 SQLException: Incorrect string value 的两种解决方案

    摘抄自:https://blog.csdn.net/dmw412724/article/details/81119325 原因:mysql的UTF-8只支持三个字节的存储,而一般字符是三个字节,但是e ...

  8. vue项目如何监听窗口变化,达到页面自适应?

    [自适应]向来是前端工程师需要解决的一大问题--即便作为当今非常火热的vue框架,也无法摆脱--虽然elementui.iview等开源UI组件库层出不穷,但官方库毕竟不可能满足全部需求,因此我们可以 ...

  9. 理解 JavaScript 闭包

    这是本系列的第 4 篇文章. 作为 JS 初学者,第一次接触闭包的概念是因为写出了类似下面的代码: for (var i = 0; i < helpText.length; i++) { var ...

  10. Slim Span (最小生成树)

    题意 求生成树的最长边与最短边的差值的最小值 题解 最小生成树保证每一条边最小,就只要枚举最小边开始,跑最小生成树,最后一个值便是最大值 在枚举最小边同时维护差值最小,不断更新最小值. C++代码 / ...