2018年最多见的Python面试题&答案(下篇)

本文为Python面试题系列的下篇,和上篇同样,既有基础知识也有进阶版知识,话题涵盖脚本撰写、Python编码和数据结构。若是错过了上篇,戳这里查看python

Q 1. Python支持什么数据类型?git

这是最基本的Python面试问题。面试

Python支持5种数据类型:shell

1. Numbers(数字)——用于保存数值express

>>> a=7.0
>>>
复制代码

2. Strings(字符串)——字符串是一个字符序列。咱们用单引号或双引号来声明字符串。编程

>>> title="Ayushi's Book"
复制代码

3. Lists(列表)——列表就是一些值的有序集合,咱们用方括号声明列表。api

>>> colors=['red','green','blue']
>>> type(colors)
 <class 'list'>
复制代码

4. Tuples(元组)——元组和列表同样,也是一些值的有序集合,区别是元组是不可变的,意味着咱们没法改变元组内的值。浏览器

>>> name=('Ayushi','Sharma')
>>> name[0]='Avery'
Traceback (most recent call last):
File "<pyshell#129>", line 1, in <module>
name[0]='Avery'
复制代码

TypeError:‘tuple’ 对象不支持数据项分配bash

5. Dictionary(字典)——字典是一种数据结构,含有键值对。咱们用大括号声明字典。数据结构

>>> squares={1:1,2:4,3:9,4:16,5:25}
>>> type(squares)
<class 'dict'>
>>> type({})
<class 'dict'>
复制代码

咱们还可使用字典引导式:

>>> squares={x:x**2 for x in range(1,6)}
>>> squares
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
复制代码

Q 2. docstring是什么?

Docstring是一种文档字符串,用于解释构造的做用。咱们在函数、类或方法中将它放在首位来描述其做用。咱们用三个单引号或双引号来声明docstring。

>>> def sayhi():
    """ 用该函数打印Hi """
  print("Hi")   
>>> sayhi()
 
Hi
复制代码

要想获取一个函数的docstring,咱们使用它的_doc_属性。

要想获取一个函数的docstring,咱们使用它的_doc_属性。
>>> sayhi.__doc__
‘\n\tThis function prints Hi\n\t’
复制代码

和注释不一样,docstring在运行时会保留下来。

Q 3. PYTHONPATH变量是什么?

PYTHONPATH是Python中一个重要的环境变量,用于在导入模块的时候搜索路径。所以它必须包含Python源库目录以及含有Python源代码的目录。你能够手动设置PYTHONPATH,但一般Python安装程序会把它呈现出来。 从Q 4到Q 20 都是Python面试基础题,是Python新手面试时常出现的问题。

Q 4. 什么是切片?

切片是Python中的一种方法,能让咱们只检索列表、元素或字符串的一部分。在切片时,咱们使用切片操做符[]。

>>> (1,2,3,4,5)[2:4]
(3, 4)
 
>>> [7,6,8,5,9][2:]
[8, 5, 9]
 
>>> 'Hello'[:-1]
‘Hell’
复制代码

Q 5. 什么是namedtuple ?

Namedtuple能让咱们用名称/标签获取一个元组的元素,这里咱们使用函数namedtuple(),将其从collections模块中导入。

>>> from collections import namedtuple
>>> result=namedtuple('result','Physics Chemistry Maths') #format
>>> Ayushi=result(Physics=86,Chemistry=95,Maths=86) #declaring the tuple
>>> Ayushi.Chemistry
 
95
复制代码

如上所示,它能让咱们用对象Ayushi的Chemistry属性获取Chemistry中的符号。 更多关于namedtuples的知识,参考这里

Q 6. 在Python中如何声明一条注释?

和C++等编程语言不一样,Python并无多行注释,只有散列字符(#)。在符号#后的内容都被视做注释,解释器会自动将其忽略。

>>> #注释行1
>>> #注释行2
复制代码

实际上你能够在代码中任何位置插入注释,用以解释代码。

Q 7. 在Python中怎样将字符串转换为整型变量?

若是字符串只含有数字字符,能够用函数int()将其转换为整数。

>>> int('227')
227
复制代码

咱们检查一下变量类型:

>>> type('227')
<class 'str'>
>>> type(int('227'))
<class 'int'>
复制代码

Q 8. 在Python中怎样获取输入?

咱们用函数input()从用户那里获取输入。在Python 2中,咱们还有另外一个函数raw_input()。 好比input()将文本获取为参数值展示出来:

>>> a=input('Enter a number')
复制代码

输入数字7

可是若是你多加注意,会发现它以字符串形式获取输入。

>>> type(a)
<class 'str'>
复制代码

将之乘以2能获得:

>>> a*=2
>>> a
’77’
复制代码

那么若是须要使用整数时呢?

咱们使用int()函数。

>>> a=int(input('Enter a number'))
复制代码

输入数字7.

如今当咱们将之乘以2就会获得:

>>> a*=2
>>> a
 
14
复制代码

Q 9. Python中的不可变集合(frozenset)是什么?

咱们举例来回答此类Python面试问题。

首先,咱们讨论一下什么是集合。集合就是一系列数据项的合集,不存在任何副本。另外,集合是无序的。

>>> myset={1,3,2,2}
>>> myset
{1, 2, 3}
复制代码

这就意味着咱们没法索引它。

>>> myset[0]
Traceback (most recent call last):
File "<pyshell#197>", line 1, in <module>
myset[0]
复制代码

TypeError:‘set’不支持索引。 不过,集合是可变的。而不可变集合却不可变,这意味着咱们没法改变它的值,从而也使其没法做为字典的键值。

>>> myset=frozenset([1,3,2,2])
>>> myset
frozenset({1, 2, 3})
>>> type(myset)
<class 'frozenset'>
复制代码

更多关于集合的内容,查看这里

Q 10. 在Python中如何生成一个随机数?

要想生成随机数,咱们能够从random模块中导入函数random()。

>>> from random import random
>>> random()
0.7931961644126482
复制代码

这里咱们调用help函数。

>>> help(random)
复制代码

关于内置函数random的help运行结果:

random(…) method of random.Random instance
random() -> x in the interval [0, 1).
复制代码

这意味着random()会返回一个大于等于0且小于1 的随机数。

咱们还可使用函数randint(),它会用两个参数表示一个区间,返回该区间内的一个随机整数。

>>> from random import randint
>>> randint(2,7)
6
 
>>> randint(2,7)
5
 
>>> randint(2,7)
7
 
>>> randint(2,7)
6
复制代码

Q 11. 怎样将字符串中第一个字母大写?

最简单的方法就是用capitalize()方法。

>>> 'ayushi'.capitalize()
‘Ayushi’
>>> type(str.capitalize)
<class 'method_descriptor'>
复制代码

不过这也会让其它字母变为大写。

>>> '@yushi'.capitalize()
‘@yushi’
复制代码

Q 12. 如何检查字符串中全部的字符都为字母数字?

对于这个问题,咱们可使用isalnum()方法。

>>> 'Ayushi123'.isalnum()
True
 
>>> 'Ayushi123!'.isalnum()
False
复制代码

咱们还能够用其它一些方法:

>>> '123.3'.isdigit()
False
 
>>> '123'.isnumeric()
True
 
>>> 'ayushi'.islower()
True
 
>>> 'Ayushi'.isupper()
False
 
>>> 'Ayushi'.istitle()
True
 
>>> ' '.isspace()
True
 
>>> '123F'.isdecimal()
False

复制代码

Q 13. 什么是Python中的链接(concatenation)?

Python中的链接就是将两个序列连在一块儿,咱们使用+运算符完成。

>>> '32'+'32'
‘3232’
 
>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
 
>>> (2,3)+(4)
Traceback (most recent call last):
File "<pyshell#256>", line 1, in <module>
(2,3)+(4)
复制代码

TypeError:只能将元组(不是“整数”)链接到元组。

这里4被看做一个整数,咱们再来一次。

>>> (2,3)+(4,)
(2, 3, 4)
复制代码

Q 14. 什么是函数?

当咱们想执行一系列语句时,咱们能够为其赋予一个名字。咱们来定义一个函数,让它取两个数返回一个更大的数。

>>> def greater(a,b):
返回 a if a>b else b
>>> greater(3,3.5)
3.5
复制代码

你能够本身建立函数,也可使用Python的不少内置函数,看这里

Q 15. 解释拉姆达表达式,何时会用到它?

若是咱们须要一个只有单一表达式的函数,咱们能够匿名定义它。拉姆达表达式一般是在须要一个函数,可是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

假如咱们想将上面Q 14中的函数定义为拉姆达表达式,能够在解释器中输入以下代码:

>>> (lambda a,b:a if a>b else b)(3,3.5)
3.5
复制代码

这里,a和b都是输入,a if a>b else b就是返回的输入,参数为3和3.5.

固然,也有可能没有任何输入。

>>> (lambda :print("Hi"))()
Hi
复制代码

更多关于拉姆达表达式的内容,参考这里

Q 16. 什么是递归?

在调用一个函数的过程当中,直接或间接地调用了函数自己这个就叫递归。但为了不出现死循环,必需要有一个结束条件,举个例子:

>>> def facto(n):
    if n==1: return 1
    return n*facto(n-1)
>>> facto(4)
24
复制代码

Q 17. 什么是生成器?

生成器会生成一系列的值用于迭代,这样看它又是一种可迭代对象。它是在for循环的过程当中不断计算出下一个元素,并在适当的条件结束for循环。

咱们定义一个能逐个“yield”值的函数,而后用一个for循环来迭代它。

>>> def squares(n):
    i=1
    while(i<=n):
        yield i**2
        i+=1
>>> for i in squares(7):
    print(i)
1
 
4
 
9
 
16
 
25
 
36
 
49
复制代码

更多关于生成器的内容,参看这里

Q 18. 什么是迭代器?

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到全部的元素被访问完结束。迭代器只能往前不会后退。咱们使用inter()函数建立迭代器。

odds=iter([1,3,5,7,9])
复制代码

每次想获取一个对象时,咱们就调用next()函数。

>>> next(odds)
1
 
>>> next(odds)
3
 
>>> next(odds)
5
 
>>> next(odds)
7
 
>>> next(odds)
9
复制代码

如今咱们再次调用它,会抛出StopIteration异常。这是由于它已经抵达须要迭代的值的尾部。

>>> next(odds)
Traceback (most recent call last):
File "<pyshell#295>", line 1, in <module>
next(odds)
StopIteration
复制代码

更多关乎迭代器的内容,参看这里

Q 19. 请说说生成器和迭代器之间的区别

  • 在使用生成器时,咱们建立一个函数;在使用迭代器时,咱们使用内置函数iter()和next()。

  • 在生成器中,咱们使用关键字‘yield’来每次生成/返回一个对象。

  • 生成器中有多少‘yield’语句,你能够自定义。

  • 每次‘yield’暂停循环时,生成器会保存本地变量的状态。而迭代器并不会使用局部变量,它只须要一个可迭代对象进行迭代。

  • 使用类能够实现你本身的迭代器,但没法实现生成器。

  • 生成器运行速度快,语法简洁,更简单。

  • 迭代器更能节约内存。

关于生成器和迭代器两者的对比,更多内容查看这里

Q 20. 咱们都知道如今Python很火,可是对于一门技术咱们不光要知道它的优势,也要知道它的缺点,请谈谈Python的不足之处。

Python有如下缺陷:

  • Python的可解释特征会拖累其运行速度。

  • 虽然Python在不少方面都性能良好,但在移动计算和浏览器方面表现不够好。

  • 因为是动态语言,Python使用鸭子类型,即duck-typing,这会增长运行时错误。

从Q 21到Q 30都是进阶版Python面试问题,不过Python新手也能够参考。

Q 21. 函数zip()的是干吗的?

Python新手可能对这个函数不是很熟悉,zip()能够返回元组的迭代器。

>>> list(zip(['a','b','c'],[1,2,3]))
[(‘a’, 1), (‘b’, 2), (‘c’, 3)]
复制代码

在这里zip()函数对两个列表中的数据项进行了配对,并用它们建立了元组。

>>> list(zip(('a','b','c'),(1,2,3)))
[(‘a’, 1), (‘b’, 2), (‘c’, 3)]
复制代码

Q 22. 若是你困在了死循环里,怎么打破它?

出现了这种问题时,咱们能够按Ctrl+C,这样能够打断执行程序。咱们建立一个死循环来解释一下。

>>> def counterfunc(n):
    while(n==7):print(n)
>>> counterfunc(7)
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
Traceback (most recent call last):
 File "<pyshell#332>", line 1, in <module>
   counterfunc(7)
 File "<pyshell#331>", line 2, in counterfunc
   while(n==7):print(n)
KeyboardInterrupt
 
>>>
复制代码

Q 23. 解释Python的参数传递机制

Python使用按引用传递(pass-by-reference)将参数传递到函数中。若是你改变一个函数内的参数,会影响到函数的调用。这是Python的默认操做。不过,若是咱们传递字面参数,好比字符串、数字或元组,它们是按值传递,这是由于它们是不可变的。

Q 24. 如何用Python找出你目前在哪一个目录?

咱们可使用函数/方法getcwd(),从模块os中将其导入。

>>> import os
>>> os.getcwd()
'C:\\Users\\lifei\\AppData\\Local\\Programs\\Python\\Python36-32'
>>> type(os.getcwd)
<class 'builtin_function_or_method'>
复制代码

咱们还能够用chdir()修改当前工做目录。

>>> os.chdir('C:\\Users\\lifei\\Desktop')
>>> os.getcwd()
'C:\\Users\\lifei\\Desktop'
复制代码

Q 25. 怎样发现字符串中与‘cake’押韵的第一个字?

咱们可使用函数search(),而后用group()获取输出。

>>> import re
>>> rhyme=re.search('.ake','I would make a cake, but I hate to bake')
>>> rhyme.group()
'make'
复制代码

咱们知道,函数search()会在第一次匹配时中止运行,这样咱们就能获得第一个与‘cake’押韵的字。

Q 26. 如何以相反顺序展现一个文件的内容?

咱们首先回到桌面,使用模块os中的chdir()函数/方法。

>>> import os
>>> os.chdir('C:\\Users\\lifei\\Desktop')
复制代码

这里咱们要使用的文件时Today.txt,它的内容以下:

OS, DBMS, DS, ADA

HTML, CSS, jQuery, JavaScript

Python, C++, Java

This sem’s subjects

Debugger

itertools

Container
复制代码

咱们将内容读取为一个列表,而后在上面调用reversed()函数:

>>> for line in reversed(list(open('Today.txt'))):
   print(line.rstrip())
container
 
itertools
 
Debugger
 
This sem’s subjects
 
Python, C++, Java
 
HTML, CSS, jQuery, JavaScript
 
OS, DBMS, DS, ADA
复制代码

若是没有rstrip(),咱们会在输出中获得空行。

Q 27. 什么是Tkinter ?

TKinter是一款很知名的Python库,用它咱们能够制做图形用户界面。其支持不一样的GUI工具和窗口构件,好比按钮、标签、文本框等等。这些工具和构件均有不一样的属性,好比维度、颜色、字体等。

咱们也能导入Tkinter模块。

>>> import tkinter
>>> top=tkinter.Tk()
复制代码

这会为你建立一个新窗口,而后能够在窗口上添加各个构件。

Q 28. 请谈谈.pyc文件和.py文件的不一样之处

虽然这两种文件均保存字节代码,但.pyc文件是Python文件的编译版本,它有平台无关的字节代码,所以咱们能够在任何支持.pyc格式文件的平台上执行它。Python会自动生成它以优化性能(加载时间,而非运行速度)。

Q 29. 如何在Python中建立本身的包?

Python中建立包是比较方便的,只须要在当前目录创建一个文件夹,文件夹中包含一个__init__.py文件和若干个模块文件,其中__init__.py能够是一个空文件,但仍是建议将包中全部须要导出的变量放到__all__中,这样能够确保包的接口清晰明了,易于使用。

Q 30. 如何计算一个字符串的长度?

这个也比较简单,在咱们想计算长度的字符串上调用函数len()便可。

>>> len('Ayushi Sharma')
13
复制代码

结语 本文咱们紧接着上篇总结了另一些常见的Python面试题,固然确定没法涵盖全部的知识点,后面若有机会再另行补充,欢迎关注。

相关文章
相关标签/搜索