你应该知道的 30个python 的面试问题

原文: http://www.techbeamers.com/python-interview-questions-programmers/#q1
1. python 是什么? 使用python 有哪些好处? 你理解 PEP 8?

Python 是最成功的解释性语言之一, 当你写一个python 脚本的时候, 它是不需要编译的。 其它的解释性语言有php 和 javascript.

Python 程序的好处

    Python 是一种动态类型的语言, 这就是说在你使用变量的时候,你不需要声明(定义)变量类型。它允许你直接对一个变量赋值, 就像 var1 = 101, var2 ='You are an engineer', 没有任何错误

    Python 支持面向对象编程, 你可以使用类的继承特性和(composition)定义一个类(class). 它不使用像 public, private 这样的访问限制符。

    Python 中的函数就像类的实例一样, 你可以把它赋值给变量, 从其他函数返回 和 作为参数传递给其他函数。

   用python 开发是非常快的, 但是它的执行速度要比编译性语言慢一些。 幸运的是, python 可以使用 C 语言写的的扩展程序,这样的话,如果你对执行速度要求比较高,可以用这种方式优化你的python 脚本。

    Python 有很多用途, 它可以编写 基于web 的程序, 测试自动化, 数据建模,大数据分析 等等。你还可以把它作为一个“胶水” 同其它语言一起工作。

PEP 8 是python 最近发布的 一套推荐编码标准,它可以指导python 代码的易读性。

2.  下面的Python 代码片段会输出什么? 请给出您的答案。
def extendList(val, list=[]):
    list.append(val)
    return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

这是 上面代码片段的输出结果

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

你或许错误的认为 list1 等于 [10],  并且 list3 等于 [a], 你应该在想,每次调用extendList, 都会用[] 初始化 list .

其实,过程是这样的,参数 list 就像在 这个函数定义的时候就创建了, 所以当以当你调用这个函数,如果没有传递给list 一个参数,它会一直用这个默认的list.  所以你可以认为list 的默认值是在函数定义的时候创建的,而不是在调用的时候。

我们可以修改一下extendList 函数, 用下面的方式定义她

def extendList(val, list=None):
  if list is None:
    list = []
  list.append(val)
  return list

这是修改后的输出结果

list1 = [10]
list2 = [123]
list3 = ['a']
3.  如果程序中要求什么也不做,但是要符合语法,在python 中可以用什么语句实现?

    是 pass , 它是一个空操作, 执行的时候不做任何事情。  注意python 是区分大小写的, 如果你写错成Pass, 将会有一个NameError 的错误。

  试一下这段代码会输出什么

letter = "hai sethuraman"
for i in letter:
    if i == "a":
        pass
        print("pass statement is execute ..............")
    else:
        print(i)

4. 用一个标准库里的函数,传入参数‘~’, 然后输出当前用户的目录, 这个函数是什么?

   你需要导入os module,  然后用一行代码就可以搞定了。自己试一下会输出什么

import os
print (os.path.expanduser('~'))
5.   请列出python 中有哪些可用的内置类型?

  这里列出了最常用的python 中的内置类型

   不可变的内置类型

Numbers
Strings
Tuples
 可变的内置类型

  

List
Dictionaries
Sets
6. 如何在python 的程序中找到bugs 或 执行一些静态分析

 1, 你可以使用 PyChecker, 它是一个静态分析工具,可以在python 项目中辨认出bugs , 并且可以揭示相关的复制的bugs

 2,   另外一个工具是Pylint, 它可以检查python 的模块是否满足编码标准。

7. 什么时候使用python 的装饰器?

  Python 装饰器是python 的一种语法,为了快速调整函数做的一些相对修改。

Python decorator is a relative change that you do in Python syntax to adjust the functions quickly.

8. List 和 Tuple 的主要不同是什么?

    List  和 Tuple 的主要不同点是,list 是可变列表, tuple 不是。 tuple 是允许被进行哈希处理的,例如,它可以作为一个字典的 key

9.  Python 是怎么对内存进行管理的?

1, python 用私有堆来维护它的内存的, 所以这个堆包含所有的python 对象 和数据结构, 这个区域只能被python 解释器访问, 程序员是不能使用它的。

2,python 的内存管理器负责管理私有堆, 它会为python 对象分配空间。

3,python 使用一个内置的垃圾回收器, 它会回收所有的不再使用的内存,并释放给堆空间。

10. Lambda 和 def 的主要区别是什么?

  1. def 能够保护多个表达式, lambda 只是一个表达式函数

  2. def 定义一个函数,并给这个函数指定一个名词,以便以后调用它;  lambda 构成一个函数,只能作为一个函数返回。

  3. def 能够返回一个语句, lambda 不能

  4. lambda 支持在列表和字段内使用

11. 使用python 的 Reg 表达式模块<Re> 写一个验证邮箱地址的正则表达式

    python 的正则表达式模块是 re   

import re
print(re.search(r"[0-9a-zA-Z.]+@[a-zA-Z]+\.(com|co\.in)$","micheal.pages@mp.com"))
12. 请考虑下面的代码片段输出什么?  这段代码又错误?
list = ['a', 'b', 'c', 'd', 'e']
print (list[10:])

上面代码的结果是 [],  不会有任何错误,像 IndexError

你应该知道,当你尝试从一个列表获取一个索引超过列表大小的成员时(例如, 在上面的问题里,尝试用访问ist[10])将产生一个IndexError. 顺便提一下,当你从一个列表检索一个开放索引的切片时,并且索引超出了列表里的成员数量, 不会导致IndexError,  它将返回空的列表。

13. 在python 里 有 switch 或者 case 这样的语句吗?  如果没有, 原因是什么?

  没有, python 没有 switch 语句。  但是你可以自己写一个switch 函数

14. Python 中用哪个内置函数迭代一个数字序列

 range() 可以生成一个数字列表, 它经常用在循环语句中

for i in range(5):
    print(i)

range() 函数有伴随两套参数

1. range(stop)

    stop:  它是一个用于生成整数个数的值, 从0开始。 例如 range(3) == [0,1,2]

 2. range(start,stop [,step])

    start: 它是数字序列的起始值

    stop: 它指出了这个序列的上限

    step: 它是一个生成序列的增量因数

 3. 需要注意的有:

      只允许整数参数

      参数可以是正数,也可是负数

      range() 函数的索引是从0开始的

15.  python 中的 try-except 语句有哪些可选的语句?

   有 2 个可选的条件,你可以在try-except 中使用

  1 . else 

      如果你想在try-except 中,没有异常发生时执行一段代码, else 条件是有用的。

  2. finally 

      如果你想在try -except 中,无论有没有异常发生,都要执行一段代码,finally 条件是有用的。

16. python 中怎么使用三元运算符

    三元运算符是条件语句中的一个选择, 它组合了true 和 false 在一个语句中, 它的语法就像下面给出这这样

   【oneTrue】if 【Condition】 else 【onFalse】   

x, y = 35, 75
smaller = x if x < y else y
print(smaller)
17. <self> 关键字是做什么用的?

   <self> 关键字就是一个变量,它表示一个对象的实例。 几乎所有面向对象的语言中,它被作为隐藏参数传递给方法。

18. python 中有什么方法可以复制一个对象

    有2个方法

  函数   copy.copy()    

   函数 copy.deepcopy()

19.  python 中 Doc Strings 的目的是什么?

    python 中, 文档字符串被称为 doc strings,  它是用来解释函数,模块和类的


20. 哪个python 函数可以将一个数字转换为字符串 ?

      为了将数字转换为字符串, 你可以用内置的 str() 函数, 如果你想要一个八进制或十六进制, 可以用内置函数oct() 或者 hex()

21. 你怎么调试python 程序 ? 是否可以逐步调试python 代码 ?

     是的, 我们可以用python debugger(pdb) 调试python 程序, 如果我们用 pdb启动一个python 程序, 它可以让我们步进我们的代码

22. 列出一些调试python 程序的 pdb 命令 。

    添加断点  -b

    恢复执行 -c

    逐步调试 - s

    移动到下一行, -n

    显示源代码, -l

    输出表达式 , - p

23. 调试python 程序的命令是什么?
$ python -m pdb python-script.py

24. python 中如何监控程序代码流?

   我们可以用 sys 模块的 settrace() 方法 建立hooks ,并监控程序里的函数

   你需要定义一个 跟踪回调方法, 并把它传递给settrace() 方法, 这个回调函数应该说明3个参数,如下。       

import sys

def trace_calls(frame, event, arg):
    # The 'call' event occurs before a function gets executed.
    if event != 'call':
        return
    # Next, inspect the frame data and print information.
    print 'Function name=%s, line num=%s' % (frame.f_code.co_name, frame.f_lineno)
    return

def demo2():
    print 'in demo2()'

def demo1():
    print 'in demo1()'
    demo2()

sys.settrace(trace_calls)
demo1()
25. 为什么 和 什么时候使用生成器 ?

     在python 中, 生成器是一个函数, 它返回一个可迭代的对象。 我们可以用 yield 关键字在一个生成器上迭代。 但是我们只能做一次,因为他们的的值不会在内存持久化,they get the values on the fly.

生成器可以让我们保持一个函数的执行结果, 或者说只要我们想保持它。 然而, 这里是一些例子,哪里是推荐用生成器的

1. 当我们要计算一个大的数据集时, 我们可以用生成器替代循环。

2. 当我们只希望得到一个结果的部分数据时, 生成器也是很有用的。

3. 我们还可以用生成器替代回调函数, 我们可以在一个函数中,写一个循环做回调函数同样的事情,把它变成一个生成器。


26. yield 关键字是做什么用的?

yield 可以把任何函数变成生成器, 它就像一个标准返回语句。 但是它总是返回一个生成器对象。 并且,一个函数可以调用多次yield 关键字

看下面这个例子

def testgen(index):
  weekdays = ['sun','mon','tue','wed','thu','fri','sat']
  yield weekdays[index]
  yield weekdays[index+1]

day = testgen(0)
print next(day), next(day)

#output: sun mon
27. 怎么可以把一个list 转换成其它数据类型?

有些时候, 我们不需要使用list作为一个list, 所以,我们必须把它转换成其它类型。

把 list 转换成一个字符串

我们可以用  join 方法, 它可以组合所有list 元素到一个字符串,并返回这个字符串

weekdays = ['sun','mon','tue','wed','thu','fri','sat']
listAsString = ' '.join(weekdays)
print(listAsString)

#output: sun mon tue wed thu fri sat

把 list 转换成一个元组(tuple)

用  tuple() 函数 将一个list 转换成元组, 这个函数用list 作为它的参数, 

weekdays = ['sun','mon','tue','wed','thu','fri','sat']
listAsTuple = tuple(weekdays)
print(listAsTuple)

#output: ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat')

把list 转换成一个集合(set)

 你可以用set() 函数转换一个list 到 set

把 list 转换成字典

在字典里,每个元素代表一个键值对, 所以,不能直接把list 像其他类型一样直接转换成字典, 你需要给list中的元素指定一个键值

weekdays = ['sun','mon','tue','wed','thu','fri']
listAsDict = dict(zip(weekdays,weekdays))
print(listAsDict)

#output: {'sun': 'sun', 'mon': 'mon', 'tue': 'tue', 'wed': 'wed', 'thu': 'thu', 'fri': 'fri'}
28. 怎样计算一个元素在列表里出现的次数 ?

       不像 集合, 列表(list), 可以有相同的值, 在python 中, list 有一个 count() 方法, 它可以返回一个指定元素出现的次数

weekdays = ['sun','mon','tue','wed','thu','fri','sun','mon','mon']
print(weekdays.count('mon'))

#output: 3

计算每个元素在列表里出现的次数

weekdays = ['sun','mon','tue','wed','thu','fri','sun','mon','mon']
print([[x,weekdays.count(x)] for x in set(weekdays)])

#output: [['wed', 1], ['sun', 2], ['thu', 1], ['tue', 1], ['mon', 3], ['fri', 1]]

29.  NumPy 是什么 ? 在python 中它如何比list 更好

    NumPy 是一个 用于科学计算的 python 包, 它可以处理大的数据集,它包含一个强大的多维数组对象和一套高级函数。

   当然, NumPy 中的数据是优于内置的list 类型的, 有许多地方可以说明这一点。

    NumPy 数组比 list 更紧凑

    读写元素快

    NumPy 比 list 使用更方便

   Numpy 数组更有效当它作为一个list 函数的参数时


30. 有哪些方法可以创建一个空的NumPy 数组?

    有2个方法可以创建空的NumPy 数组

    第一个

import numpy
numpy.array([])
  第二个
numpy.empty(shape=(0,0))

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值