zoukankan      html  css  js  c++  java
  • Python爬虫面试题170道:2019版【1】

    语言特性
    1.谈谈对 Python 和其他语言的区别

    语言特点:简洁、优雅,省略了各种大括号和分号,还有一些关键字,类型说明;
    语言类型:解释型语言,运行的时候是一行一行的解释,并运行,所以调试代码很方便,开发效率很高;
    第三方库:python是开源的,并且python的定位时任由其发展,应用领域很多比如Web,运维,自动化测试,爬虫,数据分析,人工智能。Python具有非常完备的第三方库;
    Python和Java相比
    Python比Java要简单。Python是函数为一等公民的语言,而Java是类为一等公民的语言。Python是弱类型语言,而Java是强类型语言.;
    Python和C相比
    对于使用:
    Python的类库齐全并且使用简洁,很少代码实现的功能用C可能要很复杂对于速度;
    Python的运行速度相较于C,绝对是很慢了。Python和CPython解释器都是C语言编写的
    

    2.简述解释型和编译型编程语言

    编译性和解释型语言
    解释型:就是边解释边执行;
    编译性:编译后再执行

    3.Python 的解释器种类以及相关特点?

    CPython
    c语言开发的 使用最广的解释器
    IPython
    基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样
    PyPy
    目标是执行效率 采用JIT技术 对python代码进行动态编译,提高执行效率
    JPython
    运行在Java上的解释器 直接把python代码编译成Java字节码执行
    IronPython
    运行在微软 .NET 平台上的解释器,把python编译成. NET 的字节码

    4.说说你知道的Python3 和 Python2 之间的区别?

    按照当前时间点(Python 2.7 和 Python3.6),从宏观上介绍下Python 3和Python 2的区别,并举一些对应常见的例子:
    1. 统一了字符编码支持。
    2. 增加了新的语法。print/exec等成为了函数,格式化字符串变量,类型标注,添加了nonlocal、yield fromasync/awaityield for关键词和__annotations__、__context__、__traceback__、__qualname__等dunder方法。
    3. 修改了一些语法。metaclass,raise、map、filter以及dict的items/keys/values方法返回迭代对象而不是列表,描述符协议,保存类属性定义顺序,保存关键字参数顺序
    4. 去掉了一些语法。cmp、<>(也就是!=)、xrange(其实就是range)、不再有经典类
    5. 增加一些新的模块。concurrent.futures、venv、unittest.mock、asyncio、selectors、typing等
    6. 修改了一些模块。主要是对模块添加函数/类/方法(如functools.lru_cache、threading.Barrier)或者参数。
    7. 模块改名。把一些相关的模块放进同一个包里面(如httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib放进了http里面,urllib, urllib2, urlparse, robotparse放进了urllib里面),个例如SocketServer改成了socketserver,Queue改成queue等
    8. 去掉了一些模块或者函数。gopherlib、md5、contextlib.nested、inspect.getmoduleinfo等。去掉的内容的原因主要是2点:1. 过时的技术产物,已经没什么人在用了;2. 出现了新的替代产物后者被证明存在意义不大。理论上对于开发者影响很小。
    9. 优化。重新实现了dict可以减少20%-25%的内存使用;提升pickle序列化和反序列化的效率;collections.OrderedDict改用C实现;通过os.scandir对glob模块中的glob()及iglob()进行优化,使得它们现在大概快了3-6倍等.. 这些都是喜大普奔的好消息,同样开发者不需要感知,默默的就会让结果变得更好。
    10. 其他。构建过程、C的API、安全性等方面的修改,通常对于开发者不需要关心。

    5.Python3 和 Python2 中 int 和 long 区别?

    python2中有long类型
    python3中没有long类型,只有int类型

    6.xrange 和 range 的区别?

    xrange用于返回xrange对象,而range用于返回一个数组。不管那个范围多大,xrange都使用同样的内存。
    注意:python3中没有xrange。
    
    python3中演示:
    
    >>> range(10)
    range(0, 10)
    
    >>> type(range(10))
    <class 'range'>

    编码规范

     7.什么是 PEP8?

    1. 变量
    常量:大写加下划线 USER_CONSTANT。
    私有变量 : 小写和一个前导下划线 _private_value。
    Python 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线。但这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还是可以访问到这个变量。
    内置变量 : 小写,两个前导下划线和两个后置下划线 __class__两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户定义的变量要严格避免这种风格。以免导致混乱。
    
    
    2. 函数和方法
    
    总体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,之后
    每个单词第一个字母大写,其余小写。但现在,小写和下划线已成为规范。
    私有方法 :小写和一个前导下划线,这里和私有变量一样,并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥作用)。
    特殊方法 :小写和两个前导下划线,两个后置下划线这种风格只应用于特殊函数,比如操作符重载等。
    函数参数 : 小写和下划线,缺省值等号两边无空格
    
    
    
    3. 类
    
    类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该简明,精确,并足以从中理解类所完成的工作。
    
     
    
    4. 模块和包
    
     
    
     除特殊模块 __init__ 之外,模块名称都使用不带下划线的小写字母。
    
    
    5. 关于参数
    
    5.1 不要用断言来实现静态类型检测。断言可以用于检查参数,但不应仅仅是进行静态类型检测。Python 是动态类型语言,静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无意义的调用。
    
    5.2 不要滥用 *args 和 **kwargs。*args 和 **kwargs 参数可能会破坏函数的健壮性。它们使签名变得模糊,而且代码常常开始在不应该的地方构建小的参数解析器。
    
     
    
    6. 其他
    
    
    6.1 使用 has 或 is 前缀命名布尔元素
    is_connect = True
    has_member = False
    6.2 用复数形式命名序列
    members = ['user_1', 'user_2']
    6.3 用显式名称命名字典
    person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}
    6.4 避免通用名称
    诸如 list, dict, sequence 或者 element 这样的名称应该避免。
    6.5 避免现有名称
    诸如 os, sys 这种系统已经存在的名称应该避免。
    
    
    7. 一些数字
    一行列数 : PEP 8 规定为 79 列。根据自己的情况,比如不要超过满屏时编辑器的显示列数。
    一个函数 : 不要超过 30 行代码, 即可显示在一个屏幕类,可以不使用垂直游标即可看到整个函数。
    一个类 : 不要超过 200 行代码,不要有超过 10 个方法。一个模块 不要超过 500 行。

    8.了解 Python 之禅么?

     import this
    "The Zen of Python, by Tim Peters
    Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.
    In the face of ambiguity, refuse the temptation to guess.
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.
    Now is better than never.
    Although never is often better than *right* now.
    If the implementation is hard to explain, it's a bad idea.
    If the implementation is easy to explain, it may be a good idea.
    Namespaces are one honking great idea -- let's do more of those!"

    9.了解 dosctring 么?

    就是函数方法的内置解释,随便import一个模块,比如re正则,输出re.__doc__就出现类似help(re)的文档内容,不过比help()简短多了。

    10.了解类型注解么?

    Python解释器会在运行的时候动态判断变量和参数的类型,这样的好处是编写代码速度很快,很灵活,但是坏处也很明显,不好维护,可能代码写过一段时间重新看就很难理解了,因为那些变量、参数、函数返回值的类型,全都给忘记了。
    而且当你在读别人的代码的时候,也无法一眼看出变量或者参数的类型,经常要自己推敲,这样给学习带来了很大的障碍。
    所以Python3里有了这个新特性,可以给参数、函数返回值和变量的类型加上注解,不过这个仅仅是注释而已,对代码的运行来说没有任何影响,变量的真正类型还是会有Python解释器来确定,你所做的只是在提高代码的可读性,仅此而已。
  • 相关阅读:
    Android基础
    Android基础
    Java小项目——多线程弹球
    Java小项目——抽奖系统
    Java小项目——五子棋
    Java小项目——画板
    Java基础——swing登录界面
    Java基础——类的继承
    实验室资料说明
    20180919 百信、百度面试
  • 原文地址:https://www.cnblogs.com/reseelei-despair/p/11308813.html
Copyright © 2011-2022 走看看