作为一个程序员,可能或多或少经历过一些技术面试,有些是编程语言本身的问题,有些是跟工程相关的问题。今天我们来总结关于Python程序员面试的时候经常被问到的5个问题。供大家参考收藏。
0
1
浅谈你对Python编码规范的认识,并写出你知道的编码规范。
Python的规范主要基于以下几个原因:
- 大多数程序员的代码可读性差。
- 不同的程序员之间的协作很重要,代码可读性必须要好。
- 在进行版本升级时,要基于源码升级。
- 不友好的代码会影响Python的执行效率,影响项目的整体进度。
目前都使用PEP 8的Python的编码风格。Python的编码规范主要有以下几点:
1.代码编排
- 缩进:4个空格实现缩进,尽量不使用Tab,禁止混用Tab和空格。
- 行:每行最大长度不超过79,换行可以使用反斜杠(\)。最好使用圆括号将换行内容括起来,不建议使用“;”。
- 空行:类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
- 空格:括号内的第一个位置,不要空格。紧靠右括号的位置也不要空格。冒号(:)、逗号(,)和分号(;)之前不要加空格。
括号:对于单元素tuple一定要加“,”和括号。
2.命名规范
- module_name。
- package_name。
- ClassName。
- method_name。
- ExceptionName。
- function_name。
- GLOBAL_CONSTANT_NAME。
- global_var_name。
- instance_var_name。
- function_parameter_name。
- local_var_name。
3.注释规范
- 块注释,在一段代码前增加的注释。在“#”后加一空格。段落之间以只有“#”的行间隔。
- 行注释,在一句代码后加注释。
- 避免无谓的注释。
4.编程建议
- 字符串拼接,尽量使用join。
- 单例对象,尽量使用is、is not,不要使用= =。
- 使用is not而不是not is。
- 使用def来定义函数,而不是将匿名函数赋给某个变量。
- 尽量使代码整齐,简洁。
- 使用isinstance()来判断instance的类型。
0
2
Python 如何定义一个函数?
用户自定义函数需要遵循以下规则:
- 函数代码块以def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号中间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串,用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- “return [表达式]”用于结束函数,选择性地返回一个值给调用者。不带表达式的return 相当于返回None。
- 默认情况下,参数值和参数名称是按函数声明中定义的顺序来匹配的。
Python 定义函数使用def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
示例:
def hello():
print("Hello World!")
hello()
运行结果:
Hello World!
0
3
什么是模块?它有什么好处?
在Python中,一个.py文件就被称之为一个模块(Module)。模块提高了代码的可维护性,同时模块还可以被其他地方引用。一个包含许多Python代码的文件夹是一个包。一个包可以包含模块和子文件夹。在Python中,模块是搭建程序的一种方式。模块一般分为以下几种:
① 内置模块:例如os、random、time和sys模块。
② 第三方模块:别人写好的模块,可以拿来使用,但是使用第三方模块前,需要首先使用pip命令(第三方包管理工具)安装。
③自定义模块:程序员自己写的模块。
0
4
谈一下Python的内存管理机制
Python内建了垃圾回收处理机制,引用计数是这个机制的一部分。
在Pyhton源码中,实际上是用 Py_INCREF(op) 和 Py_DECREF(op) 这两个宏来增加和减少引用计数。
当一个对象被创建、被赋值、被参数传递,函数返回之前的时候,它的引用计数值(ob_refcnt)都可能会被加1(INC),一直进行累加。
当对象变量失去作用域的时候,引用计数的值会减1(DEC)。
当一个对象的引用计数减少到0之后(ob_refcnt为0),Py_DECREF(op)会调用该对象 "析构函数"(__del__) 将其从内存中释放。
0
5
什么是Python的装饰器。
装饰器本质上是一个 Python 函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外
功能,提高了代码的复用性。装饰器是一个函数,它接收一个函数返回另一个函数。装饰器主要有以下
功能:
- 引入日志。
- 函数执行时间统计。
- 执行函数前预备处理。
- 执行函数后的清理功能。
- 权限校验等场景。
- 缓存。
装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数。在不改动原函数代码的情况下,为其增加新的功能。wrapper()函数的参数定义是(*args, **kw),因此, wrapper()函数可以接受任意参数的调用。在 wrapper()函数内。例如下面的例子首先打印日志,再紧接着调用原始函数。
import time
import functools
def add():
调用(add)函数时间: %s' % time.strftime('%Y-%m-%d%H:%M:%S'))
def log(func):
defwrapper():
可以获得函数名称
调用%s函数时间: %s' % (func.__name__,time.strftime('%Y-%m-%d %H:%M:%S')))
func()
returnwrapper
add_wrap = log(add)
add_wrap()
运行结果:
调用add函数时间: 2019-01-18 13:33:15
调用(add)函数时间: 2019-01-18 13:33:15