Python面试篇之(编码规范,项目规范,代码风格)

鳄鱼君

发表文章数:643

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Python面试篇之(编码规范,项目规范,代码风格)

编码规范

问题:
1.什么是 PEP8?
2.了解 Python 之禅么?
3.了解 docstring 么?
4.了解类型注解么?
5.例举你知道 Python 对象的命名规范,例如方法或者类等
6.Python 中的注释有几种?
7.如何优雅的给一个函数加注释?
8.如何给变量加注释?
9.Python 代码缩进中是否支持 Tab 键和空格混用。
10.是否可以在一句 import 中导入多个库?
11.在给 Py 文件命名的时候需要注意什么?18.例举几个规范 Python 代码风格的工具
参考答案:

1、PEP8是一个编程规范,内容是一些关于如何让你的程序更具可读性的建议,就是你写出来的代码必须让别人一看就知道是干什么

2、在交互式解释器中输入 import this 就会显示 Tim Peters 的 The Zen of Python大致的意思也是规范我们的代码的

Python之禅 by Tim Peters
 
优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
 
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)
 
当存在多种可能,不要尝试去猜测
而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )
 
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
 
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)

命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)

3、一般来说程序员在编写代码的时候必须要先写文档再写代码,但是叫你这么做,你会吗?显然我们都不怎么愿意,在Python中出现了docstring,字面意思就是文档字符串,就是一堆代码中的注释。Python的docstring可以通过help函数直接输出一份有格式的文档。代码写完,注释写完,一个help调用,就有文档看了。docstring可以写在三个地方:模块或包,对象,函数。或者你可以在交互模式下输入help(requests),查看一下这个包的文档

语言特性

1.谈谈对 Python 和其他语言的区别
一、语言特性
简洁 优雅 省略了各种大括号和分号,还有一些关键字,类型说明
二、第三方库
python是开源的,并且python的定位时任由其发展,应用领域很多
比如Web,运维,自动化测试,爬虫,数据分析,人工智能.Python具有非常完备的第三方库
三、执行速度
Python是一门解释型语言,所以它的速度相较于c/c++ 会慢一些.但是并不影响使用
因为现在的硬件配置都非常的高,基本没什么影响.除非是一些实时性比较强的程序可能会受到
一些影响,但是也是有解决办法的,可以嵌入c\c++代码
四、Python的GIL(Global Interpreter Lock)全局解释器锁
GIL是什么
首先明确一点GIL并不是Python的特性,而是解释器的特性.它是Python的解释器Cpython用来做多线程的控制和调度用的全局锁.保证同一个时刻只有一个线程在运行.Python还有一些别的解释器,比如Jpython就没有GIL锁.Cpython现在已经成了python的实现标准,所以我们都说python具有GIL限制.
GIL的问题总体上来说是历史遗留的问题,以前的计算机的程序运行方式是单核多任务的模式,所以为了防止多个任务对同一资源进行同时的操作,竞争资源,才有了全局的解释器锁.但是随着近年来科技的进步,出现了多核,这样的话,全局锁就会限制多线程的并行.
2.简述解释型和编译型编程语言

解释型:源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。程序不需要编译。程序在运行时才翻译成机器语言,每执行一次都要翻译一次;一般执行效率低,需要依赖解释器

编译型:首先将代码编译生成机器语言,再由机器运行机器码(二进制)。程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了;执行效率比较高

3.Python 的解释器种类以及相关特点?
CPython
由C语言开发的 使用最广的解释器,在命名行下运行python,就是启动CPython解释器.
IPython
基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样
PyPy
目标是执行效率 采用JIT技术 对python代码进行动态编译,提高执行效率
JPython
运行在Java上的解释器 直接把python代码编译成Java字节码执行
IronPython
在微软 .NET 平台上的解释器,把python编译成. NET 的字节码
说说你知道的Python3 和 Python2 之间的区别?
1、不等于<>比较运算符,python3不识别,pyhon2.7中!=和<>都能运行。
2、python3中print函数,是必须加括号d,python2中print语句,加不加都行。
3、py2 的默认编码是ASCII,py3的默认编码是UTF-8。
4、py3字符串解码后会在内存里自动转换成Unicode,而py2不会。如果在文件头指定了解码编码,py2和py3都会按指定解码,所有系统都支持Unicode,所以py3只要指定对了解码编码,在哪个系统上都可以正常显示,py2如果不是gbk编码的,解码后windous就会是乱码。
5、py2中有Unicode数据类型,py3中没有,字符串都是Unicode格式的str数据类型。
6、py2中bytes可以是二进制,也可以是str,py3中bytes只是十六进制表示的二进制。
7、py2中有long类型数据,py3中没有,py2中int最大值是-2**31~2**31-1超过在后面加L转换为long型。(直接运算会显示long型,因为2**31会先运算,是long型)
8、用户输入不同,py3中只有input()输出都是str和py2中的raw_input()一样,而py2中也有input(),输入字符串要带引号,数字输出相应的数字类型
9、Py2以前没有布尔型,0表示False,用1表示True;Python3 把 True 和 False 定义成关键字,它们的值还是 1 和 0,可以和数字运算。
10、py2中range()直接生成列表(量大占内存死机),py3中只有range()和py2中还有的xrang()都只生成一个生成器(一个计算方法,不占内存)。
11、py2的除法中不是浮点数则只返回商,py3除法返回值正常。
12、py3运行程序可以识别相同目录下普通文件夹中的模块,py2只能识别文件夹标识后的包中的模块。
13、创建类时,py2分为经典类和新式类,新式类就是继承object的类,经典类是没有继承的类,而py3中全部是新式类,默认继承object。在属性查找时,经典类查找方式为深度优先,新式类是广度优先。仅py3中有类的mro函数方法,输出继承父类的顺序列表。
14、重用父类属性的super()使用方法不同,py2中super()需要输入本身类名和自身作为参数,而py3中不用输入参数,可以直接使用替代上一级父类。
15、Python 3.x中不存在Python 2.x的xrange()。在Python 2.x中,range返回一个列表,即range(3)返回[0,1,2],而xrange返回一个xrange对象,即xrange(3)返回iterator对象,它与Java迭代器类似,并在需要时生成数字。
如果我们需要多次迭代相同的序列,我们更喜欢range(),因为range提供了一个静态列表。xrange()每次重建序列。xrange()不支持切片和其他列表方法。xrange()的优点是,当任务迭代大范围时,它可以节省内存。
在Python 3.x中,范围函数现在执行xrange在Python 2.x中的功能,因此为了保持代码的可移植性,我们可能希望坚持使用范围。所以Python 3.x的范围函数是来自Python 2.x的xrange。
16、错误处理:在python 3.x中,’as’关键字是必需的,如果不加就会报错。而在Python2.x中,在except语句后面可以不加“as”
Python3 和 Python2 中 int 和 long 区别?

xrange 和 range 的区别?

字符串

1.列举 Python 中的基本数据类型?
2.如何区别可变数据类型和不可变数据类型
3.将”hello world”转换为首字母大写”Hello World”
4.如何检测字符串中只含有数字?
5.将字符串”ilovechina”进行反转
6.Python 中的字符串格式化方式你知道哪些?
7.有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。
8.获取字符串”123456“最后的两个字符。
9.一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?
10. (1)s=”info:xiaoZhang 33 shandong”,用正则切分字符串输出[‘info’, ‘xiaoZhang’, ’33’, ‘shandong’](2) a = “你好 中国 “,去除多余空格只留一个空格。
11. (1)怎样将字符串转换为小写 (2)单引号、双引号、三引号的区别?

列表

1.已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。
2.如何实现 “1,2,3” 变成 [“1″,”2″,”3”]
3.给定两个 list,A 和 B,找出相同元素和不同元素
4.[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
5.合并列表[1,5,7,9]和[2,2,6,8]35.如何打乱一个列表的元素?

1.列出 5 个常用 Python 标准库?

 os模块  操作系统有关的函数
sys模块  命令行参数
re模块  正则匹配
math模块 数学运算模块
time模块 时间的访问和转换
datatime模块  处理日期时间
hashlib模块  加密比较哈希值
io模块 处理流的核心模块
logging模块 Python日志记录工具
threading模块 基于线程的并行
multiprocessing模块 基于进程的并行

2.Python 内建数据类型有哪些?
一、数值类型
整型(int)
浮点型(float)
复数(complex)
二、序列对象
字符串(str)
列表(list)
元组(tuple)
布尔型(bool)
三、键值对
字典(dict)
集合(set)
3.简述 with 方法打开处理文件帮我我们做了什么?

在打开文件的时候,我们要想到最坏的结果就是出现异常,那么可以使用try except finally来捕捉,并在finally语句时关闭文件,使用with语句,就可以自动关闭文件,即使忘记关闭文件也不会报错

4.列出 Python 中可变数据类型和不可变数据类型,为什么?

可变数据类型:当该数据类型对应的变量发生了改变,该内存地址不会发生改变

不可变数据类型:当该数据类型对应的变量发生了改变,该内存地址地址也会发生变化,在基本类型中不可变数据类型(数字num、字符串str、元组tuple),可变数据类型(列表list、字典dict、集合set),我们可以使用id来查看变量的内存地址,这里如果还是不太理解的话,自己尝试一下

5.Python 获取当前日期?

import datetime
today=datetime.date.today()
print(today)
#today=datetime.datetime.now()

6.统计字符串每个单词出现的次数

from collection import Counter
string='e1yu'
print(Counter(string))

#或者你可以用字典推导式和字符串自带的count统计
string='hello world e1yu'
content={a:string.count(a) for a in set(string.replace(' ',''))}
print(content)

7.用 python 删除文件和用 linux 命令删除文件方法
linux删除文件
-r 就是向下递归,不管有多少级目录,一并删除
-f 就是直接强行删除,不作任何提示的意思
rm -rf /var/log/logging #会删除所有文件,和目录
rm -f /var/log/logging #删除logging文件
Python删除文件
os模块
os.remove(path) #path是文件的路径,如果这个路径是一个文件夹,则会抛出OSError的错误,这时需用用rmdir()来删除
os.removedirs(path) # 递归地删除目录。如果子目录成功被删除,则将会成功删除父目录,子目录没成功删除,将抛异常。
os.rmdir(path) # path是文件夹路径,注意文件夹需要时空的才能被删除
os.unlink(‘F:\新建文本文档.txt’) # unlink的功能和remove一样是删除一个文件,但是删除一个删除一个正在使用的文件会报错。
shutil模块
shutil.copyfile( src, dst) #从源src复制到dst中去。 如果当前的dst已存在的话就会被覆盖掉
shutil.move( src, dst) #移动文件或重命名
shutil.copymode( src, dst) #只是会复制其权限其他的东西是不会被复制的
shutil.copystat( src, dst) #复制权限、最后访问时间、最后修改时间
shutil.copy( src, dst) #复制一个文件到一个文件或一个目录
shutil.copy2( src, dst) #在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西
shutil.copy2( src, dst) #如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作
shutil.copytree( olddir, newdir, True/Flase) #把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接
shutil.rmtree( src ) #递归删除一个目录以及目录内的所有内容
8.写一段自定义异常代码

try:
    normal excute block
  except A:
    Except A handle
  except B:
    Except B handle
  except:
    other exception handle
  else:
    if no exception,get here
  finally:
    print(hello world)

#正常执行的程序在try下面执行normal excute block执行块中执行,在执行中如果发生了异常,则中断当前normal execute block 调到异常处理中开始执行,如果没有异常则会执行else中的语句(前提是有else语句),finally语句是最后一步总会执行的语句。
9.举例说明异常模块中 try except else finally 的相关意义.
10.遇到 bug 如何处理

只要你开始写代码,那么就肯定会出错,也就是会遇到一些bug错误,通常是某个方面的错误,TypeError、IndexError、IndentationError、SyntaxError这些都是一些常见的错误,遇到了就需要积累下来,不知道是什么bug,可以去搜集相关资料。

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Python面试篇之(编码规范,项目规范,代码风格)》 发布于2019-12-30

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

4 + 5 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册