知识内容:
1.python基础概念及基础语法
2.python基础数据类型
3.python模块相关
4.python函数相关
5.python面向对象相关
6.python文件处理相关
注:本节内容全部都是问答题,无编程题!
一、python基础概念及基础语法
1.python是一门什么样的语言,有何优缺点,有哪些应用领域?
(1)python是一门解释型的高级动态编程语言,支持命令行式编程、函数式编程,完全支持面向对象程序设计,语法简洁优美,并且拥有大量的几乎支持所有领域应用开发的成熟拓展库,又俗称胶水语言,可以把多种不同语言编写的程序融合到一起实现无缝拼接,更好地发挥不同语言和工具的优势,满足不同应用领域的需求。
(2)python的优缺点:
python的优点有:python的定位是“优雅”、“明确”、“简单”;开发效率非常高,Python有非常强大的第三方库;无需考虑诸如如何管理你的程序使用的内存一类的底层细节;可移植性好;可扩展性强
python的缺点有:速度慢;代码不能加密;线程不能利用多CPU问题
(3)python的应用领域:
WEB开发、网络编程、爬虫、云计算、人工智能、自动化运维、金融分析、科学运算开发、游戏开发、图像界面开发
2.python中的变量有何作用,该如何合理地命名?
(1)python中变量的作用是用来存储信息或数据
(2)如何合理命名:
- 变量命名只能使用字母、数字或下划线的任意组合,另外变量名的第一个字符不能是数字,只能以字母或下划线开头
- 命名变量时不要以下划线开头,因为以下划线开头的变量在Python中有特殊含义,不要以python关键字来命名
- 不建议使用系统内置的模块名、类型名或函数名以及已经导入的模块名和其中的成员名来作为变量名,这样可能会导致一些错误
- 官方建议使用下划线分割法命名变量,变量不要以中文或拼音命名,变量名不要过长,变量名要有含义
3.python是如何进行内存管理的?
Python的内存管理是由Python的解释器负责的,开发人员可以从内存管理事务中解放出来,致力于应用程序的开发,这样就使得开发的程序错误更少,程序更健壮,开发周期更短
http://developer.51cto.com/art/201007/213585.htm
Python引用了一个内存池(memory pool)机制,即Pymalloc机制(malloc:n.分配内存),用于管理对小块内存的申请和释放内存池(memory pool)的概念:
当 创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的概念就是预先在内存中申请一定数量的,大小相等 的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。
内存池的实现方式有很多,性能和适用范围也不一样。
python中的内存管理机制——Pymalloc:
python中的内存管理机制都有两套实现,一套是针对小对象,就是大小小于256bits时,pymalloc会在内存池中申请内存空间;当大于256bits,则会直接执行new/malloc的行为来申请内存空间。
关于释放内存方面,当一个对象的引用计数变为0时,python就会调用它的析构函数。在析构时,也采用了内存池机制,从内存池来的内存会被归还到内存池中,以避免频繁地释放动作。
4.python中变量作用域有哪些?如何查看作用域?
(1)python中变量的作用域有两种:全局作用域、局部作用域;
(2)查看作用域:
- globals方法:查看全局作用域的名字 -> print(globals())
- locals方法:查看局部作用域的名字 -> print(locals())
5.Python中pass语句的作用是什么?
pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作
6.如何知道一个python对象的类型?
使用内置函数中的type()
7.python中变量的本质是什么?def的本质是什么?
python中变量的本质就是一个引用,def是定义一个函数,本质是在内存中将函数名和函数体关联起来,函数名中储存的是函数体的地址
8.简述python中的循环语句与分支语句
python中的循环语句有while和for两种
python中的分支语句有if单分支,if-else双分支,多分支这三种
9.简述三元运算书写格式
python的三元运算格式: result=value1 if 条件 else value2
如果条件成立result赋值为value1否则赋值为value2
10.有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
有
PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
pylint是另外一个工具可以进行coding standard检查
pylint详情:https://www.jianshu.com/p/c0bd637f706d
11.python3中/和//有何区别,*和**有何区别
在python3中/是真除法,和数学中的普通除法一样,而//是整除。eg:5/2=2.5, 5//2=2
*是乘法,**是乘方,另外*还可以作用于字符串、列表等数据类型表示倍数,eg:“python”*3=“pythonpythonpython”
二、python基础数据类型
1.python基础数据类型中哪些可变数据类型,哪些是不可变数据类型,两者之间有何区别
(1)python中的数据类型可以分为可变数据类型和不可变数据类型:
- 可变数据类型: 列表、字典、集合(set)
- 不可变数据类型: 数字、字符串、元组
(2)可变与不可变
可变数据类型:value值改变,id值不变;不可变数据类型:value值改变,id值也随之改变
2.python字符串有哪两种拼接方式?
+或join
3.python字符串如何分割?
使用字符串的split方法即可
4.python字符串如何去掉开头或结尾的某些字符
使用字符串的strip方法即可
5.python字符串格式化有哪两种方法?
传统格式化(%)和字符串的format方法
6.python列表如何进行增删改查?
1 列表增删改查: 2 增: append() insert() extend() 3 删: remove() pop() del 4 改: 赋值 5 查: 索引
7.python如何得到两个列表的交集与差集
将这两个列表转化成集合,通过集合之间的关系运算来求交集和差集
8.如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
如果是一个list, 最快的解决方案是:
1 s = [1, 5, 6, 8] 2 s.reverse() 3 print(s)
如果不是list, 最通用但是稍慢的解决方案是:
1 s = (1, 2, 3) 2 for i in range(len(s)-1, -1, -1): 3 print(s[i], end=" ")
9.Python面试题:请写出一段Python代码实现删除一个list里面的重复元素
先把list重新排序,然后从list的最后开始扫描,代码如下:
1 if List: 2 List.sort() 3 last = List[-1] 4 for i in range(len(List)-2, -1, -1): 5 if last==List[i]: 6 del List[i] 7 else: 8 last=List[i]
10.python中元组和列表有何区别
(1)可变与不可变:
列表是可变序列,可以对元素进行赋值修改,也可以随意添加删除元素,而元组是不可变序列,不能对元素进行赋值修改,更不能随意添加删除元素
(2)访问处理速度:
元组的访问处理速度比列表更快,如果需要定义常量,只是对它们进行遍历或其他类似用途,而不需对其元素进行任何修改,那么一般建议使用元组
11.python中字典有何特性
- 字典是无序可变的序列
- 字典中每个元素包括两部分: 键(key)和值(value)
- key必须可hash也就是必须为不可变的数据类型(数字、字符串),并且必须是唯一的
- 可存放任意多个值、可修改、可以不唯一
- 无序
12.python中字典如何增删改查
1 字典增删改查 2 增:直接赋值 3 删:pop() del 4 改:直接赋值 5 查:直接取值 get()
13.python集合有何特性
- 确定性: 元素必须可hash,必须为不可变元素
- 互异性(去重)
- 无序性: 元素没有先后之分,{1,2,3}和{3,2,1}算做同一个集合
14.如何生成可变集合,如何生成不可变集合?
set()生成可变集合,frozenset()生成不可变集合
15.python集合的两大作用是什么?
- 去重,把一个列表变成一个集合便会自动去重(集合中的元素是无序的,不可以有重复的对象,所以可以通过集合把重复的数据去除)
- 关系测试,测试两组数据之间的交集、差集、并集等关系
16.Python是如何进行类型转换的?
Python提供了将变量或值从一种类型转换成另一种类型的内置函数。int函数能够将符合数学格式数字型字符串转换成整数。否则,返回错误信息。
1 >>> int(”34″) 2 34 3 >>> int(”1234ab”) #不能转换成整数 4 ValueError: invalid literal for int(): 1234ab
函数int也能够把浮点数转换成整数,但浮点数的小数部分被截去。
1 >>> int(34.1234) 2 34 3 >>> int(-2.46) 4 -2
函数float将整数和字符串转换成浮点数:
1 >>> float(”12″) 2 12.0 3 >>> float(”1.111111″) 4 1.111111
函数str将数字转换成字符:
1 >>> str(98) 2 ‘98′ 3 >>> str(”76.765″) 4 ‘76.765′
注:整数1和浮点数1.0在python中是不同的。虽然它们的值相等的,但却属于不同的类型。这两个数在计算机的存储形式也是不一样。
17.Python里面如何实现tuple和list的转换?
通过内置函数list()和内置函数tuple()可以实现
18.序列解包是什么?具体实现原理大概是怎样?
(1)在实际开发中,序列解包是非常重要和常用的一个语法,可以使用非常简洁的形式完成复杂的功能,大幅度提高了代码的可读性,并且减少了程序员的代码输入量。序列解包是一次给多个变量赋值的方法
1 >>> x,y,z = 1,2,3
2 >>> print(x,y,z)
3 1 2 3
(2)序列解包的本质就是把一个序列或可迭代对象中的元素同时赋值给多个变量,如果等号右侧含有表达式,会把所有表达式的值先计算出来,然后再进行赋值
19.Python里面如何拷贝一个对象?
标准库中的copy模块提供了两个方法来实现拷贝,一个方法是copy,它返回和参数包含内容一样的对象,使用deepcopy方法,对象中的属性也被复制
20.python中切片作用对象可以是什么,如何进行?
(1)切片对象:列表、元组、字符串、range对象
(2)语法: start:stop:step 第一个数字表示切片开始位置(默认为0),第二个参数表示切片停止位置(默认为列表长度且不包括),第三个数字表示切片的步长,当步长省略时可以顺便省略最后一个冒号与使用下标访问列表元素的方法不同,切片操作不会因为下标越界而抛出异常,而是简单地在列表尾部截断或返回一个空列表,代码具有更强的健壮性
21.列表推导式是什么,请举例说明
列表推导式使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性,例如:
1 a = [x*x for x in range(10)]
22.python字符串如何进行大小写的转换?
使用字符串的upper方法和lower方法
23.介绍一下Python下range()函数的用法?
range(start, stop[, step])
range函数根据给定的参数产生一系列整数,返回一个range对象,range对象类似于生成器,生成器利用了堕性计算的机制,不会一次性计算出所有的值,而是用多少就算多少。range函数一般都是与for循环连用。
start->起始值(包括,缺省时默认为0)
end->终止值(不包括,必须有的参数)
step->步长(默认为1)
三、python模块相关
1.如何用Python来进行查询和替换一个文本字符串?
可以使用python正则表达式模块(re)中的sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, string[, count=0])
replacement是被替换成的文本
string是需要被替换的文本
count是一个可选参数,指最大被替换的数量
2.如何用Python来发送邮件?
可以使用smtplib标准库。以下代码可以在支持SMTP监听器的服务器上执行:
1 import sys, smtplib 2 3 fromaddr = raw_input(”From: “) 4 toaddrs = raw_input(”To: “).split(’,') 5 print “Enter message, end with ^D:” 6 msg = ” 7 while 1: 8 line = sys.stdin.readline() 9 if not line: 10 break 11 msg = msg + line 12 13 # 发送邮件部分 14 server = smtplib.SMTP(’localhost’) 15 server.sendmail(fromaddr, toaddrs, msg) 16 server.quit()
3.python中模块如何导入?
- import 模块名
- from 模块名 import 对象名
- 导入一个模块中的所有对象: from 模块名 import *
4.atm目录下有两个目录a和b,a下有fun1.py b下有fun2.py,如何从fun1.py中导入fun2.py?请写出具有通用性的代码来解决此问题
1 # 将以下代码写在fun1.py中 2 import os 3 import sys 4 # 获取atm文件夹所在目录(包括atm)并动态添加到系统环境变量中 5 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 6 from b import fun2 7 fun2.func()
5.Python re模块中search()和match()的区别?
match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配, 也就是说match()只有在0位置(开始位置)匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none
6.如何为模块起别名
- import 模块名 as 别名
- from 模块名 import 对象名 as 别名
7.简述re.findall()
re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
语法是re.findall(pattern, string, flags=0),pattern是匹配目标,string是待匹配的字符串
8.python如何获取命令行参数
可以使用sys模块或者getopt模块,详情见:http://www.cnblogs.com/wyb666/p/8877989.html
9.简述序列化和反序列化
1 序列化:把python对象转换成Json字符串 2 反序列化:把json格式字符串解码为python对象
10.简述json模块和pickle模块
- json,用于字符串 和 python数据类型间进行转换
- pickle,用于python特有的类型 和 python的数据类型间进行转换
(1)json
- json.dumps方法对数据进行序列化操作
- json.dump方法把字典、列表等数据类型序列化进入一个文件中,等待别的程序进行调用
- json.loads进行反序列化
- json.load方法对文件进行反序列化操作,读取文件中的内容
(2)pickle
- pickle.dumps对数据进行序列化操作
- pickle.loads对数据进行反序列化操作
- pickle.dump把列表,元组或字典序列化进一个文件中以实现永久保存
- pickle.load对文件进行反序列化,得到文件里保存的数据
11.简述shelve模块
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
12.shutil模块的作用是什么?
shutil是高级的文件、文件夹、压缩包 处理模块
13.简述configparser模块和logging模块
configparser作用:用于对特定的配置进行操作,用于处理特定格式的文件(一般是配置文件),本质是利用open来操作文件
logging作用:用于便捷记录日志且线程安全的模块
14.用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别?
前者是贪婪匹配,会从头到尾匹配 <a>xyz</a>,而后者是非贪婪匹配,只匹配到第一个 >
15.Python里面如何生成随机数?
使用random模块的下列函数即可:
- randrange(): 生成指定范围内(包含左边界不包含右边界)随机数(整数)的函数
- randint(): 生成指定范围内(左右边界都包含)随机数(整数)的函数
- random(): 返回随机生成的一个实数,它在[0,1)范围内
- uniform(): 生成指定范围内(左边界右边界均不包含)随机数(浮点数)的函数
四、python函数相关
1.简述一下python2和python3中输入输出函数有何不同
- python3中print是一个内置函数,有多个参数,而python2中print是一个语法结构;
- Python2打印时可以不加括号:print 'hello world', Python3则需要加括号: print("hello world")
- Python2中的input要求输入的字符串必须要加引号,python2中raw_input()不论输入是什么格式都当成字符串处理
- python3中只有input函数没有raw_input,且input函数不论输入是什么格式都当成字符串处理
2.简述内置函数globals()和locals()的作用
globals():查看全局作用域的名字 -> print(globals())
locals():查看局部作用域的名字 -> print(locals())
3.请简述函数的作用
- 可以复用代码
- 提高代码的可读性
- 增强代码的可拓展性
4.请简述python中的嵌套函数
python中的函数还可以嵌套定义,即一个函数的定义里还有另一个函数的定义
5.Python如何定义一个函数?
函数的定义形式如下:
def <name>(arg1, arg2,… argN):
<statements>
函数的名字也必须以字母开头,可以包括下划线“ ”,但不能把Python的关键字定义成函数的名字。函数内的语句数量是任意的,每个语句至少有
一个空格的缩进,以表示此语句属于这个函数的。缩进结束的地方,函数自然结束。
下面定义了一个两个数相加的函数:
1 >>> def add(p1, p2): 2 print p1, “+”, p2, “=”, p1+p2 3 >>> add(1, 2) 4 1 + 2 = 3
函数的目的是把一些复杂的操作隐藏,来简化程序的结构,使其容易阅读。函数在调用前,必须先定义。也可以在一个函数内部定义函数,内
部函数只有在外部函数调用时才能够被执行。程序调用函数时,转到函数内部执行函数内部的语句,函数执行完毕后,返回到它离开程序的地方,
执行程序的下一条语句。
6.简述enumerate、zip
enumerate():
- enumerate在字典上是枚举、列举的意思
- 对于一个可迭代的(iterable)或可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
- enumerate多用在for循环中
zip():
- zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
- 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表
7.简述iter
iter():
根据传入的参数创建生成一个迭代器
详细看此:https://www.cnblogs.com/yitouniu/p/5243136.html
8.python内置函数中有哪些函数是针对序列进行操作的?
len(): 返回列表、元组、字典、集合、字符串、range对象等各种可迭代对象的元素个数
max(), min(): 返回列表、元组、字符串、集合、range对象、字典等的最大或最小元素,要求所有元素之间可以进行大小比较,另外对字典进行操作时默认是对字典的键进行计算,要对字典值进行计算,则需要使用字典对象的values()方法明确说明
sum(): 对数值型列表、数值型元组、集合、range对象、字典等进行计算求和
zip(列表1, 列表2, 、、、): 将多个列表或元组对应位置的元素组合为元组,并返回包含这些元组的列表(python2)或zip对象(python3)
enumerate(): 枚举列表、元组、字符串、字典或其他可迭代对象的元素,返回枚举对象,枚举对象中每个元素是包含下标和元素值的元组
sorted(): 对列表、元组、字典进行排序,并借助其key参数来实现更复杂的排序
详细内容看我的这篇博客:http://www.cnblogs.com/wyb666/p/8515686.html
9.sorted()和sort()有何区别
Python list内置sort()方法用来排序,也可以用python内置函数sorted来对可迭代的序列排序生成新的序列。
- sorted(iterable,key=None,reverse=False),返回新的列表,对所有可迭代的对象均有效
- sort(key=None,reverse=False) 就地改变列表 reverse:True反序;False 正序
10.type()和isinstance()有何区别
isinstance() 与 type() 区别:
-
type() 不会认为子类是一种父类类型,不考虑继承关系。
-
isinstance() 会认为子类是一种父类类型,考虑继承关系。
11.简述hash函数
hash函数是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
特征: hash值的计算过程是依据值的特征来计算,这就要求被hash的值必须固定,也就是说被hash的值必须是不可变的,也就是说可变类型不可hash,不可变类型可hash
应用: 文件签名、MD5加密、密码验证
12.len()可作用于哪些对象
列表、元组、字典、集合、字符串、range对象等各种可迭代对象
13.请简述迭代器、生成器以及两者之间有何关系
对于序列类型我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器;内部实现了__iter__,__next__方法,可以被next函数调用并不断返回下一个值的对象称为迭代器对象,迭代器对象也可以使用for循环
在Python中,这种一边循环一边计算的机制,称为生成器:generator
生成器从本质上讲也是一个迭代器
详情看此:http://www.cnblogs.com/linhaifeng/articles/7580428.html
14.yield、return、next有何区别
- return: 返回并终止函数
- yield: 返回数据并冻结当前的执行过程
- next: 唤醒冻结的函数执行过程,继续执行,直到遇到下一个yield
另外,函数有了yield之后:
- 函数名加上()就得到了一个生成器
- return在生成器里,代表生成器的中止,直接报错
15.可迭代对象和迭代器之间的相同和不同
- 相同点: 都可以用for循环
- 不同点: 就是迭代器对象内部多实现了一个__next__方法
注:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
16.如何判断可迭代对象和迭代器
- 只要是迭代器对象都是Iterator对象
- 凡是可作用于
for
循环的对象都是Iterable
类型 - 凡是可作用于
next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列 - 集合数据类型,如list、dict、str等是
Iterable但不是
Iterator,不过可以通过iter函数来转换成
Iterator对象
17.如何创建生成器
可通过生成器生成式或生成器函数
18.如何遍历生成器
可以直接使用for循环或使用while循环遍历(结合异常处理)
详细看我的这篇博客:http://www.cnblogs.com/wyb666/p/8920060.html
19.如何在一个function里面设置一个全局的变量?
使用global即可
20.有两个序列a,b,大小都为n,序列元素的值任意为整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 分别计算a,b序列的和;
- 求a序列和与b序列和的差值的一半,记为half;
- 在和值大的序列中找出一个与和值小的序列中的元素max的差值最接近half的元素,记为min;
- 将max与min互换即可
大致证明:
21.简述lambda表达式
Python允许定义一种单行的小函数。定义lambda函数的形式如下:labmda 参数:表达式lambda函数默认返回表达式的值。你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个:
1 >>> g = lambda x, y: x*y 2 >>> g(3,4) 3 12 4 >>> g = lambda x, y=0, z=0: x+y+z 5 >>> g(1) 6 1 7 >>> g(3, 4, 7) 8 14
也能够直接使用lambda函数,不把它赋值给变量:
1 >>> (lambda x,y=0,z=0:x+y+z)(3,5,6) 2 14
如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda函数。否则,你还是定义函数才对,毕竟函数没有这么多限制。
22.什么是递归函数?递归函数有何特性?编写递归函数的要领是什么?
(1)在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数,所谓递归就是在函数内部调用自身
(2)递归函数的特性:
- 必须有一个明确的结束条件
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 递归效率不高,递归层次过多会导致栈溢出
(3)编写递归函数的要领:
- 找相似性 -> 寻找问题在不同大小规模下的相似性,抽象出共同特征,根据共同特征写出递归的核心方程式或者递推公式
- 找出口 -> 问题不可能一直递归下去,总要有一个出口,结束递归从而结束循环
23.简述函数式编程以及函数式编程的优点
(2)函数式编程的优点
- 代码简洁,开发快速
- 接近自然语言,易于理解
- 更方便的代码管理
- 易于"并发编程"
24.简述高阶函数与闭包
(1)高阶函数
变量可以指向函数,函数的参数能接收变量,当然一个函数就可以接收另一个函数作为参数或者返回值中包含函数名,这种函数就称之为高阶函数。
满足以下两个条件之一的函数可称为高阶函数:
- 把一个函数名作为实参传给另一个函数 -> 可以在不修改函数源代码的情况下为函数添加功能
- 返回值中包含函数名 -> 不修改函数的调用方式
(2)闭包
闭包就是能够读取其他函数内部变量的函数。例如在javascript、python中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁
简单说: 如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数,那么闭包就是在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的函数名(引用)。这样就构成了一个闭包
25.如何用Python输出一个Fibonacci数列
1 a,b = 0, 1 2 while b<100: 3 print (b), 4 a, b = b, a+b
26.函数的默认返回值是什么?
None
27.函数传递参数时传递的是引用还是复制值?
int,float,str是传值,list,dict,类的实例,自定义对象都是传引用
28.简述函数的位置参数、关键字参数、默认参数、可变长参数的特点以及注意事项
按照位置传参数 -> 实参和形参位置一一对应 -> 位置参数
按照关键字传参数 -> 位置无需固定 -> 关键字参数
注意位置参数必须在关键参数的前面,对于一个参数只能赋值一次
默认参数即在定义函数时为形参设置默认值,在调用带有默认值参数的函数时,可以不用传值
注: 参数里既有默认参数也有普通参数时应该把普通参数放在默认参数左边,也就是说默认参数必须出现在函数形参列表的最右端且任何一个,默认参数右边都不能出现非默认参数(普通参数)
可变长参数,也有人称之为动态参数,分别由*args和**kwargs接收参数,前者接收任意多个实参并将其放在一个元组中,后者接受类似于关键参数一样显式赋值形式的多个实参并将其放入字典中
29.简述python3中的range函数与python2.7中的range函数有何区别
python3中range函数返回一个range对象(本质上是生成器),而python2.7中的range函数返回的是列表
30.内置函数any和all有何区别
all:判断可迭代对象的每个元素是否都为True值
any:判断可迭代对象的元素是否有为True值的元素
all只要有一个元素为False就返回False,any只要有一个元素为True就返回True
31.简述break、continue、return的区别
- break -> 提前结束整个循环
- continue -> 终止本次循环忽略continue语句之后的所有语句直接回到循环的顶端,开始新的一次循环
- return -> 退出函数,并返回值(不指定就返回None)
32.请简述装饰器并简述装饰器的应用场景
装饰器是一个函数,可以在运行时动态增加功能,但又不改动函数本身的代码和调用方式
应用场景:在不修改原函数及其调用方式的情况下对原函数功能进行拓展
五、python面向对象相关
1.什么是开放-封闭原则
开放封闭原则是开发中的一个重要概念,主要内容如下:
- 对扩展是开放的
- 对修改是封闭的
2.面向对象与面向过程有什么区别
- 面向过程:根据业务逻辑从上到下写代码,将代码分成各功能块
- 面向对象:对函数进行分类和封装,用类来包装函数,使开发更快速、便捷
3.面向对象3大特性是什么
封装、继承、多态
4.python是否是一门完全的面向对象语言,为什么?
是,Python从设计之初就已经是一门面向对象的语言,python的内置函数及内置模块就是通过面向对象的思想设计及编写出来的,并且python对面向对象有很好的支持
5.python面向对象中的静态方法和类方法有何区别
静态方法和类方法都可以通过类名和对象名调用,但静态方法不能访问类或实例中任何属性,类方法不能直接访问实例属性,只能访问类属性;
另外类方法的第一个参数为cls,并且在调用类方法时不需要为该参数传递值
静态方法: 在函数名上加@staticmethod
类方法: 在函数名上级加@classmethod
6.简述python面向对象中的属性
属性的定义有两种方式:
- 装饰器 即:在方法上应用装饰器
- 静态字段 即:在类中定义值为property对象的静态字段
静态字段方法定义:
- 定义时,在普通方法的基础上添加 @property 装饰器;
- 定义时,属性仅有一个self参数
- 调用时,无需括号
方法:obj.func()
属性:obj.prop
属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象,属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能
属性具体看这里: http://www.cnblogs.com/wupeiqi/p/4766801.html
7.python面向对象中的新式类和旧式类有何区别?
- 新式类都从object继承,经典类不需要
- 新式类的基类搜索顺序采用广度优先搜索,而旧式类采用深度优先搜索
- 新式类相同父类只执行一次构造函数,经典类重复执行多次
- Python 2.x中默认都是经典类,只有显式继承了object才是新式类
- Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object
- 新式类使用super来调用父类方法
8.简述python中的异常处理
为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,这就是异常处理
python中的异常处理结构是try-except结构、try-except-else结构以及try-except-finally结构
9.简述python中的断言与上下文管理
断言与上下文管理是特殊的异常处理方式,在形式上比异常结构要简单一点,能够满足简单的异常处理或条件确认,并可以和标准的异常处理结构结合使用
断言语法: assert expression [, reason]
当expression为真时,什么都不做,为假时则抛出异常(reason)
使用上下文管理语句with可以自动管理资源,在代码块执行完毕后自动还原进入该代码块之前的现场或上下文
另外不管以何种原因跳出with语句,也不论是否发生异常,总能保证资源被正常释放,大大简化了工作
上下文管理语法:
with context_expr [as var]:
代码块
10.简述python中的self参数
self代表类的实例即对象本身,在类的实例方法中都必须有self参数,并且必须是方法的第一个参数,在类的实例方法中访问实例属性时需要通过以self为前缀,但在外部通过对象名调用这些方法时不需要传递这个参数
11.异常和错误的区别
- 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)
- 错误分为语法错误和逻辑错误,语法错误程序根本无法运行,逻辑错误在程序运行中出现引发异常
12.介绍一下except的用法和作用?
Python的except用来捕获所有异常,因为Python里面的每次错误都会抛出一个异常,所以每个程序的错误都被当作一个运行时错误
六、python文件处理相关
1.python如何打开一个文件,打开后如何读取文件内容?
open打开文件。read方法、readline方法以及readlines方法读取内容
2.python中如何在源文件后面添加内容?
使用a模式打开文件,然后写入内容即可
3.python中如何修改文件?
在源文件里修改会覆盖源文件里的内容因此为了保存源文件要把修改后的行写入新的文件
1 f = open('yesterday2.txt', 'r', encoding='utf-8') 2 f_new = open('yesterday2.bak', 'w', encoding='utf-8') 3 4 for line in f: 5 if "我" in line: 6 line = line.replace("我", "我我我我") 7 f_new.write(line) 8 9 f.close() 10 f_new.close()
4.简述python2和python3的字符编码
ASCII一个字符占1个字节且只支持英文不支持中文;Unicode俗称万国码,一个字符占两个字节
UTF-8对字符和符号进行分类,是可变长编码: ASCII中的字符用1个字节存,欧洲的字符占两个字节,而东亚的字符占三个字节
GBK|GB2312是中国自己的编码,一个字符占两个字节
Windows系统中的中文默认编码是GBK;Linux\Mac系统中的编码默认是UTF-8
在python2默认编码是ASCII, python3里默认编码是unicode,因为python2的默认编码为ASCII无法支持中文,所以需在文件开头(第一行)声明使用的编码改为UTF-8,然后就可以支持中文了
5.简述文件打开模式r和rb有何区别
r是打开文本文件,rb是打开二进制文件
6.如何用Python删除一个文件?
使用os.remove(filename)或者os.unlink(filename)
7.Python如何copy一个文件?
shutil模块有一个copyfile函数可以实现文件拷贝