写点什么

Python 面试快问快答,理论要的就是速度与精准,Python 面试题 No2

发布于: 刚刚

今天的面试题

第 1 题:python2 和 python3 的 range(100)的区别

range()函数的含义


range 函数是一个用来创建算数级数序列的通用函数,返回一个[start, start + step, start + 2 * step, ...]结构的整数序列


range()函数的特性


  1. 如果 step 参数缺省,默认 1;如果 start 参数缺省,默认 0。

  2. 如果 step 是正整数,则最后一个元素(start + i * step)小于 stop。

  3. 如果 step 是负整数,则最后一个元素(start + i * step)大于 stop。

  4. step 参数必须是非零整数,否则抛出 VauleError 异常。


注意:range 函数返回一个左闭右开([left,right))的序列数


  • python2 中的 range 返回一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表


>>> list=range(10)>>> print list[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
复制代码


  • python3 中的 range 返回的是一个迭代器


>>> range(10)range(0, 10)>>> type(range(10))<class 'range'>>>> list(range(10))[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> type(list(range(10)))<class 'list'>
复制代码


for i in range(1,10)在 python2 和 python3 中都可以使用,但是要生成 1-10 的列表,就需要用 list(range(1,10))

第 2 题:在 Python 中读取大文件

  • 利用生成器 generator


def read_in_block(file_path):    BLOCK_SIZE = 1024    with open(file_path, "r") as f:        while True:            block = f.read(BLOCK_SIZE)  # 每次读取固定长度到内存缓冲区            if block:                yield block            else:                return  # 如果读取到文件末尾,则退出  def test3():    file_path = "/tmp/test.log"    for block in read_in_block(file_path):        print block
复制代码


  • 迭代器进行迭代遍历:for line in file


def test4():    with open("/tmp/test.log") as f:        for line in f:            print line 
复制代码


for line in f 这种用法是把文件对象f当作迭代对象, 系统将自动处理 IO 缓冲和内存管理, 这种方法是更加pythonic的方法。 比较简洁。


Pythonic 追求的是对 Python 语法的充分发挥,写出的代码带 Python 味儿,而不是看着向 C 或 JAVA

第 3 题:如何避免转义,给字符串加哪个字母表示原始字符串?

这个就面试题的要点是几个特殊 Python3 字符串前缀 u、b、r


  • 无前缀 & u 前缀


字符串默认创建即以 Unicode 编码存储,可以存储中文。


string = 'a'  等效于  string = u'a'Unicode中通常每个字符由2个字节表示u'a' 即    u'\u0061'   实际内存中为  [0000 0000] [0110 0001]
复制代码


  • b 前缀


字符串存储为 Ascll 码,无法存储中文。


  • r 前缀


与上述两种不是一样的东西了。r 前缀就相当于三引号,主要解决的是 转义字符,特殊字符 的问题,其中所有字符均视为普通字符。


所以这道题的正确答案是r前缀

第 4 题:python 中断言方法举例?

assert 语句,在需要确保程序中的某个条件一定为真才能让程序运行的话就非常有用


下面做一些 assert 用法的语句供参考:


assert 1==1assert 2+2==2*2assert len(['my boy',12])<10assert range(4)==[0,1,2,3]
复制代码


这里介绍几个常用断言的使用方法,可以一定程度上帮助大家对预期结果进行判断。


  • assertEqual

  • assertNotEqual

  • assertTrue

  • assertFalse

  • assertIsNone

  • assertIsNotNone


assertEqual 和 assertNotEqual


  1. assertEqual:如两个值相等,则 pass

  2. assertNotEqual:如两个值不相等,则 pass


使用方法:


assertEqual(first,second,msg)其中firstsecond进行比较,如果相等则通过;msg 为失败时打印的信息,选填;断言 assertNotEqual 反着用就可以了。


assertTrue 和 assertFalse


  1. assertTrue:判断 bool 值为 True,则 pass

  2. assertFalse:判断 bool 值为 False,则 Pass


使用方法:


assertTrue(expr,msg)其中 express 输入相应表达式,如果表达式为真,则 pass;msg 选填;断言 assertFalse 如果表达式为假,则 pass


assertIsNone 和 assertIsNotNone


  1. assertIsNone:不存在,则 pass

  2. assertIsNotNone:存在,则 pass


使用方法:assertIsNone(obj,msg)检查某个元素是否存在

第 5 题:列出 python 中可变数据类型和不可变数据类型,并简述原理

不可变数据类型:


数值型、字符串型 string 和元组 tuple


不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址),如下图用 id()方法可以打印对象的 id.


可变数据类型:


列表 list 和字典 dict


允许变量的值发生变化,即如果对变量进行 append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化


相同的值在内存中可能会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

写在后面

好啦,今天的面试题分解又完毕了,是不是又学到新东西了呢,希望在你升职加薪的路上为你“点火”

发布于: 刚刚阅读数: 2
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
Python面试快问快答,理论要的就是速度与精准,Python面试题No2