Python 面试问题
Python 面试问题
最近正在团队内部普及 Python 语言,有些刚接触 Python 语言的工程师在概念上有很多混淆的地方,刚好看到这篇文章:Python面试问题,里面列举的问题都是关于 Python 基本的常识或者容易混淆的知识点,因此推荐给团队的 Python 初学者。
参数是如何传递的?传值还是传引用?(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 == []
什么是列表和字典推导(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 的代码书写方式。
什么是 PEP 8?
PEP 8 定义的是 Python 代码规范,告诉你如何书写可读性强,更好维护的代码。详细内容请参考PEP 8 官方文档。Sublime Text编辑工具带有 PEP 8 格式检测插件,所存盘的文件都应当符合 PEP 8 的规范。
你使用虚拟环境(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
如何计算列表里所有元素的和?如何计算列表里所有元素的乘积?
这个问题相当简单,但需要记住一点,你需要用 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))
你能列出列表(list)和元组(tuple)的区别吗?举例子说明用法的不同。
列表和元组是 Python 里最基本的两个数据类型:
- 首先,列表对象是可变的(mutable),但元组不是;
- 其次,元组可被哈希(hashed),例如可以用作字典对象的键值(key);
至于例子,地图上的地理坐标可以用二元组表示,而地图上的路径可以用坐标点列表来表示。
你知道
range
和xrange
的区别吗?range
函数返回的是一个列表对象,xrange
返回的是一个xrange
对象。他们的主要区别是:- 内存的占用不同。列表对象已经在内存中存在了,而
xrange
对象永远占 用同样的内存大小,无论需要生成的range
有多大。 xrange
对象不能使用列表对象的切片函数,也就是说range(10)[3:5]
能工作,但是xrange(10)[3:5]
就不工作了。
类似的问题还有:
map
和itertools.imap
的区别?filter
和itertools.ifilter
的区别?清楚这些区别,你就能知道怎样更有效地使用这些函数。- 内存的占用不同。列表对象已经在内存中存在了,而
请说出一些 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 的关注度不够。
什么是修饰器(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
with
语句及其用法?简单地说,
with
语句允许你在进入和/或退出指定的代码块的时候,执行特定的代码。最常用的例子是使用with
句打开文件。为了在你自己定义的对象上使用with
语句,你必须定义__enter__
和__exit__
方法。更多的信息你可以查看理解 Python 的 with 语句。
除了原文列举上述问题,下面知识点也是 Python 面试中很可能被问到的:
- Package/Module的定义,以及模块加载原则;
- 如何构建你自己的类型,如列表(list),字典(dict),迭代器(iterator);
- 生成器(generator)的概念以及使用方式;
- built-in 类型和函数;
- 对象属性的操作原理,如dict,getattr,getattribute,描述 器(descriptor);
- 元类编程(metaclass)的概念,以及如何使用;
- 如何进行Package/Module的打包和分发;
- 什么是WSGI;
- 字符串的处理和正则表达式;
- 如何操作json和xml数据;
另外,还必须尽可能地多了解 Python 语言最为强大的 库函数。
http://xiaocong.github.io/blog/2013/06/16/python-interview-question-and-answer/
Python 面试问题的更多相关文章
- Python面试真题答案或案例
Python面试真题答案或案例如下: 请等待. #coding=utf-8 #1.一行代码实现1--100之和 print(sum(range(1,101))) #2.如何在一个函数内部修改全局变量 ...
- Python面试 【315+道题】
Python面试 [315+道题] 第一部分 Python基础篇(80题) 为什么学习Python? 因为看到python的发展趋势,觉得需要与时俱进,第一点,python开发速度极快,能快速完成一个 ...
- 10个Python面试常问的问题
概述 Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位需求越来越高.下面我收集了10个Python面试官经常问的问题,供大家参考学习. 类继承 有如下的 ...
- Python面试基础篇
1. 为什什么学习Python? Life is short, You need Python 2. 通过什什么途径学习的Python? pass 3. Python和Java.PHP.C.C#.C+ ...
- Python 面试中 8 个必考问题(转载)
Python 面试中 8 个必考问题 1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list ...
- 常见的25个python面试问答
常见的25个python面试问答 说到好用简洁的大数据技术,除了Hadoop.R等等,Python也是其中熠熠生辉的一员,因而广受企业和商家的青睐.求职季,不少应聘者在面试相关职业时都被要求掌握Pyt ...
- python面试笔试题汇总
Python面试攻略(嗨谈篇) 110道python面试笔试题汇总,你能答对几道? Python 面试问答 Top 25 2018 年最常见的 Python 面试题 & 答案
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- Python面试常考点之深入浅出链表操作
Python面试常考点之深入浅出链表操作 在Python开发的面试中,我们经常会遇到关于链表操作的问题.链表作为一个非常经典的无序列表结构,也是一个开发工程师必须掌握的数据结构之一.在本文中,我将针对 ...
- Python面试简介及并行并发
今天的分享内容大体如下: 一. 面试 1. 什么是面试 2. 优秀的面试 二. Python综述 1. Python设计哲学及版本变迁 2. Python发展现状及其他语言使用场景 3. GIL 4. ...
随机推荐
- PC、APP、H5三端测试的相同与不同
随着手机应用的不断状态,同一款产品的移动端应用市场占相较PC端也越来越大,那么app与PC端针对这些产品的测试有什么相同与不同之处呢?笔者总结如下: 首先谈一谈相同之处... 一,针对同一个系统功能的 ...
- web可拖动控件js
先下载:http://code.jquery.com/ui/1.10.3/jquery-ui.js $('.i-i-yuan').draggable({ containment: '#app'//可通 ...
- 动态网页基础——JSP
WEB项目的目录结构 META-INT WEB-INF 对外都是不可访问的,不可把index.jsp/index.html 放这 JSP JSP是为了简化Servlet的工作出现的替代品,Servl ...
- 19. Jmeter抓包之浏览器请求
web测试过程中我们经常需要抓包,通常我们使用fiddler或者Charles.但是jmeter也可以抓包,而且非常好用,闲话不多说,下面进入正题.下面用一个例子进行说明 需求:bing首页搜索南京测 ...
- Spoj 2798 Qtree3
一棵结点为黑色或白色的树,初始都是白色的.有两种操作 1 将一个结点换颜色 2 询问从根到结点u路径上面的第一个黑色点,没有则输出-1 InputIn the first line there are ...
- Git push “fatal: Authentication failed ”
Git push "fatal: Authentication failed " 问题原因 之前设置了两步验证 If you enabled two-factor authenti ...
- 第五周实验报告&学习总结
实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档: 实验内容 1.已知字符串:"this is a test of java".按要求执 ...
- [19/06/03-星期一] HTML基础_C/S与B/S的区别&标题标签(h1-h6)、段落标签(p)
一.C/S与B/S的区别 C/S(Client/Server):客户端/服务器 1)一般使用的软件都是C/S架构,比如QQ.360.office365: 2)C表示客户端,用户通过客户端来使用软件:S ...
- PostgreSQL dblink使用过程
安装: 进入/root/postgresql-11.2/contrib/dblink make && make install 切换到postgres用户 [root@fce40690 ...
- 一分钟安装mysql
学数据库的人都知道,MySQL数据库是比较基本的掌握要求,不仅开源而且社区版本是免费使用的.由于工作上或者经常更换系统的原因,有时候会需要安装MySQL数据库.为了不至于每次安装都要查阅资料,现把安装 ...