Python学到什么程度能够面试工做(解答一)

逛知乎,看到帖子Python学到什么程度能够面试工做?,在桃花岛主的回答中讲到2019年最新的Python面试题,同时还有旭东大佬已作了大部分的解答。

基础知识

  1. 列出5个经常使用Python标准库?
import os
import sys
import re
import math
import time
import datetime
import random
import threading
import multiprocessing复制代码
2. Python的内建数据类型有哪些?
int、float、complex         # 数值型
bool            # 布尔型
str             # 字符串
list            # 列表
tuple           # 元组
dict            # 字典复制代码
3. 简述with方法打开处理文件帮我咱们作了什么?
  • with语句适用于对资源进行访问的场合,确保无论使用过程当中是否发生异常都会执行必要的清理操做,释放资源,好比文件使用后自动关闭、线程中锁的自动获取和释放等;
  • with语句即上下文管理器,在程序中用来表示代码执行过程当中所处的先后环境。上下文管理器:含有__enter__和__exit__方法的对象就是上下文管理器。
  • enter():在执行with语句以前,首先执行该方法,一般返回一个实例对象,若是with语句有as目标,则将对象赋值给as目标。
  • exit():在执行with语句结束后,自动调用__exit__()方法,用户释放资源,若此方法返回布尔值True,程序会忽略异常。
  • 使用环境:文件读写、线程锁的自动释放等。
with context_expression [as target(s)]:
    with-body复制代码
这里context_expression要返回一个上下文管理器对象,该对象并不赋值给as子句中的target(s),而是会将上下文管理器的__enter__()方法的返回值赋值给target(s)。

不太清楚的能够参考连接:深刻理解 Python 中的上下文管理器。

交流群:887934385 遇到问题能够再群内交流,当中有资料分享 python

Python的可变和不可变数据类型?
  • 不可变数据类型:即数据被建立以后,数据的值将再也不发生改变,有数值、字符、元祖类型;
  • 可变数据类型:数据别建立以后,数据的值能够发生变化,有列表、字典、集合类型。
5. Python获取当前日期?
# -*- coding: UTF-8 -*-
import datetime
import time

if __name__ == "__main__":
    print(time.time())           # 时间戳
    print(time.strftime("%Y-%m-%d %H:%M:%S %w", time.localtime()))  # 年月日时分秒
    print(datetime.datetime.now())      # 年月日时分秒复制代码
6. 统计字符串每一个单词出现的次数。
def word_amount(sentence):
    split_list = sentence.split()
    dict_result = {}
    for word_name in split_list:
        if word_name not in dict_result.keys():
            dict_result[word_name] = 1
        else:
            dict_result[word_name] += 1
    return dict_result

if __name__ == '__main__':
    sentence = "I can because i think i can"
    dict_result = word_amount(sentence)
    print(dict_result)复制代码
或者:
if __name__ == '__main__':
    sentence = "I can because i think i can"
    result = {word: sentence.split().count(word) for word in set(sentence.split())}
    print(result)复制代码
或者:
from collections import Counter

if __name__ == '__main__':
    sentence = "I can because i think i can"
    counts = Counter(sentence.split())
    print(counts)复制代码
7. 用python删除文件和用linux命令删除文件方法。
import os
os.remove("demo.txt")复制代码

rm demo.txt复制代码
8. 写一段自定义异常代码?
class printException(Exception):
    pass

def testRaise():
    raise printException('printErr')

if __name__ == '__main__':
    try:
        testRaise()
    except printException, e:
        print e复制代码
9. 举例说明异常模块中try except else finally的相关意义。
# -*- coding: UTF-8 -*-

def read_filedata(file_name):
    file_obj = ""
    try:
        # 须要检测的异常代码片断
        file_obj = open(file_name, "r")
        result_data = file_obj.read()
    except IOError, e:
        # 发生“IOError”异常进行处理的代码片断
        file_obj = "文件不存在:"+ str(e)
    else:
        # 没有引起“IOError”异常执行的代码片断,返回读取到的数据
        return result_data
    finally:
        # 无论有没有引起错误都会执行的代码片断,isinstance()用于判断一个数据类型
        if isinstance(file_obj, str):
            return file_obj
        elif isinstance(file_obj, file):
            file_obj.close()
        else:
            return "未知错误,请检查您的代码..."

if __name__ == '__main__':
    result = read_filedata("abc.txt")
    print(result)复制代码
10. 遇到 bug 如何处理?
首先查看报错信息,根据报错信息找到相应代码,一般通常的数据结构或者算法错误只要找到报错代码就能够顺利解决;
若是遇到暂时不能解决的错误先不要慌,咱们可使用编译器的Debug模式或者本身在代码中加注断点进行代码排查;
若是依然不能解决bug,咱们能够拷贝报错信息,在搜索引擎中进行搜索。 没有人写代码不出bug,若是你在一个bug上耗费时间超过半小时,能够与其余同事探讨(注意节制,可能有些费同事);
另辟蹊径:方法总比困难多,在进行快速开发时,咱们应该优先实现功能而不是拘泥于运行效率,因此遇到一些暂时不能解决的BUG能够考虑另外的实现方法。

语言特性

  1. 谈谈对Python的了解和其余语言的区别?
Python是一门语法简洁优美,功能强大无比,应用领域很是普遍,具备强大完备的第三方库的一门强类型的动态,可移植,可扩展,可嵌入的解释型编程语言。
强类型语言、弱类型语言的区别:
  • 若是语言常常隐式地转换变量的类型,那这个语言就是弱类型语言,若是不多会这样作,那就是强类型语言。Python不多会隐式地转换变量的类型,因此Python是强类型的语言。
  • 强类型语言和弱类型缘由其判断的根本是是否会隐式进行语言类型转变。强类型缘由在速度上可能略逊于弱类型语言,可是强类型定义语带来的严谨性又避免了没必要要的错误。
  • 强类型语言包括:Java、.net、Python、C++等语言。其中Python是动态语言,是强类型定义语言,是类型安全的语言,Java是静态语言,是强类型定义语言,也是类型安全的语言;弱类型语言包括:VB,PHP,JavaScript等语言。其中VBScript是动态语言,是一种类型不安全的缘由。
动态语言、静态语言的区别:
  • 动态类型语言:动态性语言是指在运行期间才去作数据类型检查的语言,也就是说动态类型语言编程时,永远不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来**。Python和Ruby就是一种典型的动态类型语言,其余的各类脚本语言如VBScript也多少属于动态类型语言。
  • 静态类型语言:静态类型语言与动态类则恰好相反,它的数据类型在编译期间检查,也就是说在写程序时要声明全部变量的数据类型,C/C++是静态类型语言的典型表明,其余静态语言还有C#、Java等。
  • 对于动态语言与静态语言的区分,其根本在于数据类型是在运行期间检查仍是在编译期间检查。
编译型语言、解释型语言的区别:
  • 编译型语言:须要将一段程序直接翻译成机器码(对于C/C++这种非跨平台的语言)或者中间码(Java这种跨平台语言,须要虚拟机再将中间码印射成机器码)。通常需通过编译(compile)、连接(linker)这两个步骤。编译是把源代码编译成机器码,连接是把各个模块的机器码和依赖库串连起来生成可执行文件。
  • 解释型语言:使用解释器将源码逐行解释成机器码并当即执行,不会进行总体性的编译和连接处理,相比编译型语言省了道工序。
  • 一个像是吃饭等菜都上全了再开动,一个像是吃火锅,边涮边吃,时机不同。
  • 解释型语言的优势:跨平台容易,只需提供特定平台的解释器;缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
  1. 简述解释型和编译型编程语言?
可参考上一条的解释内容。
3. Python的解释器种类以及相关特色?
  • CPython:官方版本的解释器。这个解释器是用C语言开发的,因此叫CPython。在命令行下运行python就是启动CPython解释器。 CPython是使用最广的Python解释器。

  • IPython:IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所加强,可是执行Python代码的功能和CPython是彻底同样的。CPython用>>>做为提示符,而IPython用In [序号]:做为提示符。

  • PyPy:它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),因此能够显著提升Python代码的执行速度。绝大部分Python代码均可以在PyPy下运行,可是PyPy和CPython有一些是不一样的,这就致使相同的Python代码在两种解释器下执行可能会有不一样的结果。

  • Jython:Jython是运行在Java平台上的Python解释器,能够直接把Python代码编译成Java字节码执行。
  1. 说说你知道的Python3和Python2之间的区别?
编码:Python2的默认编码是asscii,这也是致使Python2中常常遇到编码问题的缘由之一,至因而为何会使用asscii做为默认编码,缘由在于Python这门语言诞生的时候还没出现Unicode。Python3默认采用了UTF-8做为默认编码,所以你再也不须要在文件顶部写# coding=utf-8了。
字符串:Python2中字符的类型,str:已经编码后的字节序列,unicode:编码前的文本字符;而Python3中字符的类型,str:编码过的unicode文本字符,bytes:编码前的字节序列。
能够认为字符串有两种状态,即文本状态和字节(二进制)状态。Python2和Python3中的两种字符类型都分别对应这两种状态,而后相互之间进行编解码转化。编码就是将字符串转换成字节码,涉及到字符串的内部表示;解码就是将字节码转换为字符串,将比特位显示成字符。
在Python2中,str和unicode都有encode和decode方法。可是不建议对str使用encode,对unicode使用decode, 这是Python2设计上的缺陷。Python3则进行了优化,str只有一个encode方法将字符串转化为一个字节码,并且bytes也只有一个decode方法将字节码转化为一个文本字符串。
print:Python2中的print是语句;Python3中的print是函数。例如:
# py2
>>> print("hello", "world")
('hello', 'world')

# py3
>>> print("hello", "world")
hello world复制代码
这个例子就比较明显了,在py2中,print语句后面接的是一个元组对象,而在py3中,print函数能够接收多个位置参数。若是但愿在Python2中把print当函数使用,那么能够导入future模块中的print_function。
import:python2默认是按照相对路径导入模块和包,python3默认则是按照绝对路径导入。
input:Python3:input解析输入为str字符型;Python2:input解析输入为int型,raw_input解析输入为str类型。
算法符:在Python2中,/执行传统除法,对于整数执行截断除法,浮点数执行浮点除法(保留小数部分,即便整除);//执行Floor除法,截除掉余数而且针对整数操做数返回一个整数,若是有任何一个操做数是浮点数,则返回一个浮点数。在Python3中,/老是执行真除法,无论操做数的类型,都会返回包含任何余数的浮点结果;//执行Floor除法,截除掉余数而且针对整数操做数返回一个整数,若是有任何一个操做数是浮点数,则返回一个浮点数。
int/long:Python3里,只有一种整数类型int,大多数状况下,它很像Python2里的长整型。Python2有为非浮点数准备的int和long类型。int类型的最大值不能超过sys.maxint,并且这个最大值是平台相关的。
True和False:在Python2中,True和False是两个全局变量(名字),在数值上分别对应1和0,既然是变量,那么它们就能够指向其它对象。Python3修正了这个缺陷,True和False变为两个关键字,永远指向两个固定的对象,不容许再被从新赋值。
迭代器:在Python2中不少返回列表对象的内置函数和方法在Python3都改为了返回相似于迭代器的对象,由于迭代器的惰性加载特性使得操做大数据更有效率。
例如:Python2中使用xrange()来建立一个迭代器对象,使用range()建立一个list数组(要生成很大的数字序列的时候,用xrange会比range性能优不少,由于不须要一上来就开辟一块很大的内存空间);Python3中使用range()建立迭代器对象,移除了xrange()方法。
另外,字典对象的dict.keys()、dict.values()方法都再也不返回列表,而是以一个相似迭代器的view对象返回。高阶函数map、filter、zip返回的也都不是列表对象了。Python2的迭代器必须实现next方法,而Python3改为了__iter__()、next。
nonlocal:在Python2中能够在函数里面能够用关键字global声明某个变量为全局变量,可是在嵌套函数中,想要给一个变量声明为非局部变量是无法实现的,在Pyhon3,新增了关键字nonlcoal,通常使用在闭包中的,使变量使用外层的同名变量。
LEGB做用域的理解: python3的local, global, nonlocal简析
  1. Python3和Python2中int和long区别?
可参考上一条的解释内容。
  1. xrange和range的区别?
可参考上上一条的解释内容。

交流群:887934385 遇到问题能够再群内交流,当中有资料分享 
linux

相关文章
相关标签/搜索