文章目录

  • 今天的面试题
  • 第1题:python2和python3的range(100)的区别
  • 第2题:在Python中读取大文件
  • 第3题:如何避免转义,给字符串加哪个字母表示原始字符串?
  • 第4题:python中断言方法举例?
  • 第5题:列出python中可变数据类型和不可变数据类型,并简述原理
  • 写在后面


今天的面试题

第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==1
assert 2+2==2*2
assert len(['my boy',12])<10
assert 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、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化

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

写在后面

好啦,今天的面试题分解又完毕了,是不是又学到新东西了呢