Python Web工程师面试总结(二)- Python基础

py

上篇笼统地聊了整个知识框架,这一篇会重点谈谈其中的常问的 Python 基础知识部分。

题目:

  1. 谈谈 Python2 与 Python3 的差别
  2. Python 中的单下划线与双下划线分别指什么
  3. 聊聊 Python 中的可变对象与不可变对象
  4. Python 中的迭代器与生成器是什么
  5. Python 中的装饰器是什么? 有什么用
  6. Lambda 表达式是什么?
  7. 简述库包模块之间的关系
  8. 如何管理 Python 环境, 为什么要管理?
  9. Python 中的 with 关键字是什么?
  10. *args 与 **kwargs 参数分别是什么含义?
  11. is 与 == 的区别
  12. initnew 的区别

答案:

1. 谈谈 Python2 与 Python3 的差别

  • print 语句更换为 print() 函数
  • 所有字符串默认均为 Unicode, 不再区分 ASCII 与 Unicode 文本
  • 除法运算中两个整数相除可以直接得到浮点数, // 为整除符号不变
Python 2.7.15 (default, May  1 2018, 05:55:50) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/2
0
>>> 1 // 2
0
>>> 1.0 / 2
0.5
Python 3.6.5 (default, May 11 2018, 13:30:17) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 / 2
0.5
>>> 1 // 2
0
>>> 1.0 // 2
0.0
  • 合并 raw_input() 与 input() 为 input(), raw_input() 删除, 可以直接输入数字和文本, 不再区分
  • 合并 xrange() 特性到 range(), 移除 xrange()
  • dict 的 .keys() .values()函数均返回迭代器而非列表, range, zip 也将返回迭代器, 同样的还有 map(), filter()
  • 不等运算符 <> 被移除
  • 八进制表达式示例由 0777 变为 0o777

2. Python 中的单下划线与双下划线分别指什么

  • __name__:一种约定,Python内部的名字,用来与用户自定义的名字区分开,防止冲突
  • _name:一种约定,用来指定变量私有
  • __name:解释器用_classname__name来代替这个名字用以区别和其他类相同的命名
  • _用作一次性或丢弃( throw-away)的名称。按照惯例,这样做可以让阅读你代码的人知道,这是个不会被使用的特定名称。举个例子,你可能无所谓一个循环计数的值:
n = 42
for _ in range(n):
    do_something()

3. 聊聊 Python 中的可变对象与不可变对象

  • 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。(也就是说改变了就等于申请了一块新的空间)
  • 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。

最简单的例子就是看变量的 id

Python 3.6.5 (default, May 11 2018, 13:30:17) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> # string is not constant
>>> a = 'hhh'
>>> id1 = id(a)
>>> a += 'lll'
>>> a
'hhhlll'
>>> id2 = id(a)
>>> id1 == id2
False
>>> # list is inconstant
>>> b = [1,2,3]
>>> id3 = id(b)
>>> b.append(4)
>>> id4 = id(b)
>>> id3 == id4

4. Python 中的迭代器与生成器是什么

**注意是生成器不是生成式. **
生成器: 如果列表元素可以按照某种算法推算出来,那么就可以在后续循环中不断推算得出元素, 不必创建完整的list,从而节省大量的内存. 在Python中,这种一边循环一边计算的机制,称为生成器:generator. 生成器是迭代器的一种. 生成器一次只能产生一个值, 而不是整个列表返回.
创建一个generator,有很多种方法,第一种方法很简单,只有把一个列表生成式的 [] 中括号改为 () 小括号,就创建一个generator

>>> li = [x for x in range(5)]
>>> li
[0, 1, 2, 3, 4]
>>> gen = (x for x in range(5))
>>> gen
<generator object <genexpr> at 0x7f42b26b3a98>
>>> gen.__next__()
0
>>> gen.__next__()
1
>>> next(gen)
2
>>> next(gen)
3
>>> next(gen)
4
>>> next(gen)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> gen = (x for x in range(5))
>>> for i in gen:
...     print(i)
... 
0
1
2
3
4

迭代器:
迭代器与可迭代对象是被包含的关系, 可迭代对象不一定是迭代器.

  • 凡是可作用于 for 循环的对象都是 Iterable 类型;
  • 凡是可作用于 next()函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列;(惰性计算的一个例子是 if a and b 当 a 为 False, 则 b 不再计算, 结果肯定是 False, 用在迭代器则是如果你不访问该值, 则不取出该值 )
  • 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

5. Python 中的装饰器是什么? 有什么用

装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能(也就是说, 是可以继承的),装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试、事务处理、缓存、权限校验等。有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。


6. Lambda 表达式是什么?

传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
例如lambda x: x * x实际上就是:

def f(x):
    return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数, 同时匿名函数既然是一个对象, 也可以作为返回值:

>>> f = lambda x: x*x
>>> f(5)
25
>>> def test(x, y):
...     return lambda: x*x + y
... 
>>> test(5, 1)
<function test.<locals>.<lambda> at 0x7f42b26a5ae8>

7. 简述库包模块之间的关系

Python 中的库是指具有相关功能模块的集合。一个库通常由多个模块. 如 sys 是一个和系统操作相关的标准库.

包是模块文件的打包, 包(Package)下面会有一个 __init__.py 的文件. 若有子目录且子目录下也有 __init__.py 的文件, 则称子目录为子包.

模块是一个个.py文件, 里面包含函数和变量等.


8. 如何管理 Python 环境, 为什么要管理?

使用 Virtualenv, anaconda 等包管理工具进行管理. 管理的原因是为了在系统上开发多个项目时不会产生库和包的污染, 也可以让 Python 的不同版本共存. 不同项目使用不同的虚拟环境, 在项目最后导出所需的包的时候也不会产生包的并集, 所需多少就是多少.


9.Python 中的 with 关键字是什么?

with 是与异常处理相关的功能, with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭线程中锁的自动获取和释放等。
格式如下:

with context_expression [as target(s)]:
    with-body

访问语句中的 with-body 前会调用 __enter__() 结束时调用 __exit__(), 无论是否有异常, __exit__() 都会做好收尾工具, 不需要再try catch


10. *args**kwargs 参数分别是什么含义?

如果我们不确定往一个函数中传入多少参数,或者我们希望以元组(tuple)或者列表(list)的形式传参数的时候,我们可以使用*args(单星号)。如果我们不知道往函数中传递多少个关键词参数或者想传入字典的值作为关键词参数的时候我们可以使用**kwargs(双星号)


11. is 与 == 的区别

前面提到用 id 是否相等来判断变量是否可变, 我们用了 == 符号, 如果直接用 is 关键词, 那么不用获得 id 就可以判断两个是否是同一个变量.

下面给出一个例子, a 先赋值给 c, c 成为 a 的引用, 分别拼接相同的字符串, 此时二者仍相等, 但是此时 a is not c

>>> a = 'hhh'
>>> c = a
>>> a += 'lll'
>>> c += 'lll'
>>> a == c
True
>>> a is c
False

从这里可以知道 is 判断的是是否指向同一个内存空间, == 判断的是纯粹的值是否相等.


  1. __init____new__ 的区别:
  1. __init__ 方法为初始化方法, __new__方法才是真正的构造函数。
  2. __new__方法默认返回实例对象供__init__方法、实例方法使用。
  3. __init__ 方法为初始化方法,为类的实例提供一些属性或完成一些动作。
  4. __new__ 方法创建实例对象供__init__ 方法使用,__init__方法定制实例对象。(因此, __new____init__ 之前被调用)
  5. __new__是一个静态方法,而__init__是一个实例方法。

Reference:

What’s New In Python 3.0
Underscores in Python
python 生成器和迭代器有这篇就够了
The ‘with’ statement
python中模块,包,库
廖雪峰的网站


公众号: 程序员的碎碎念

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352