一、Python知识点实战
1、一行代码实现1-100的和
num = sum(range(1,101))print(num)
2、如何在一个函数内部修改全局变量
利用global在函数声明,修改全局变量
a = 5def f1():
global a
a = 6
f1()
print(a)
3、列出8个Python标准库
os:提供与操作系统关联的函数sys:通常用于命令行参数
re:正则匹配
random:生成随机数
math:数学运算
datetime:处理日期时间
logging:日志处理模块
json:数据序列化与反序列化
4、func(*args,**kwargs)中的*args,**kwargs什么意思?
*args与**kwargs用于函数定义,可以将不确定数量的参数传递给一个函数。*args:用来发送一个非键值对的可变数量的参数列表给一个函数
**kwargs:允许将不定长度的键值对,作为参数传递给一个函数
5、用自己的话解释下什么样的语言能够使用装饰器?
函数作为参数传递的语言,可以使用装饰器
6、Python内建数据类型有哪些?
- 整型:int
- 布尔型:bool
- 字符串:string
- 列表:list
- 元组:tuple
- 字典:dict
- 集合:set
7、简述面向对象中的__new__和__init__区别
__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数
- __new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
- __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例
- __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
- 如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。
8、with打开文件帮助我们做了什么
打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件
with方法帮我们实现了finally中f.close
9、Python实现列表去重的方法
打乱列表元素的顺序:可以使用set去重
l1 = [1, 4, 9, 11, 19, 5, 9, 11]a = set(l1)
l1 = list(a)
print(l1)
保留原来列表元素的顺序
https://www.jianshu.com/p/dfba1e03e50f
l1 =[1, 4, 9, 11, 19, 5, 9, 11]l1 = sorted(set(l1), key=l1.index) print(l1)
10、Python2和Python3的range(100) 的区别
Python2返回列表;Python3返回迭代器,节约内存
11、列表[1,2,3,4,5],请用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
l1 = [1, 2, 3, 4, 5]def f1(x):
return x ** 2
res1 = map(f1, l1)
res = [i for i in res1 if i > 10]
print(res)
12、python2与python3的区别
类别
python2
python3
print函数
既可以使用带小括号的方式,也可以使用一个空格分隔打印内容
比如:print "hello world!"
必须要以小括号包裹打印内容
比如:print("hello world!")
range函数
range(1,10) 返回列表
range(1,10) 返回迭代器,节约内存
编码
ascii编码
utf-8编码
序列
Unicode表示字符串序列,str表示字节序列
str表示字符串序列,byte表示字节序列
中文显示
正常显示中文,需引入coding声明
不需要,中文可以正常显示
input函数
raw_input() 函数
input()函数
13、列出python中可变数据类型和不可变数类型
不可变数据类型:数值型、字符串型string和元组tuple (不允许变量的值发生变化,若改变了变量的值,相当于是新建了一个对象)
可变数据类型:列表list和字典dict (允许变量的值发生变化,即若对变量进行append、+=等这种操作后,只是改变了变量的值,而不是新建一个对象变量,变量引用的地址也不会变化,不过对于相同的值得不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址)
14、列表合并的结果
- 两个列表相加
- extend
15、提高python运行效率的方法
16、简述cookie和session的区别
- session 在服务器端,cookie 在客户端(浏览器)
- session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效,存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置
- cookie安全性比session差
17、谈下python的GIL
GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
18、简述多线程、多进程
进程:
- 操作系统进行资源分配和调度的基本单位,多个进程之间相互独立
- 稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
线程:
应用:
- IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间
- CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势
19、IOError、AttributeError、ImportError、IndentationError、IndexError、KeyError、SyntaxError、NameError分别代表什么异常
- IOError:输入输出异常
- AttributeError:试图访问一个对象没有的属性
- ImportError:无法引入模块或包,基本是路径问题
- IndentationError:语法错误,代码没有正确的对齐
- IndexError:下标索引超出序列边界
- KeyError:试图访问你字典里不存在的键
- SyntaxError:Python代码逻辑语法出错,不能执行
- NameError:使用一个还未赋予对象的变量
20、python中copy和deepcopy区别
复制不可变数据类型
不管copy还是deepcopy,都是同一个地址当浅复制的值是不可变对象(数值,字符串,元组)时和=“赋值”的情况一样,对象的id值与浅复制原来的值相同
复制的值是可变对象(列表和字典)
浅拷贝copy有两种情况:
- 第一种情况:复制的 对象中无 复杂 子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
- 第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表), 改变原来的值 中的复杂子对象的值 ,会影响浅复制的值。
深拷贝deepcopy:完全复制独立,包括内层列表和字典
21、列出几种魔法方法并简要介绍用途
- __init__:对象初始化方法
- __new__:创建对象时候执行的方法,单列模式会用到
- __str__:当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
- __del__:删除对象执行的方法
22、字符串s = "not 404 found 11.1 张三 12 在 99 上海",每个词中间是空格,用正则过滤掉英文和数字,最后输出“张三在上海”
import res = "not 404 found 11.1 张三 12 在 99 上海"
l = re.split("[\d+.\d+|(a-zA-Z)+]", s)
p = [x.strip() for x in l if x.strip() != '']
print("".join(p))
23、列表推导式求列表所有奇数并构造新列表,a = [1, 3, 5, 7, 9, 10, 11, 12]
a = [1, 3, 5, 7, 9, 10, 11, 12]res = [i for i in a if i%2==1]
print(res)
24、迭代器与生成器
迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本方法:iter()和next()
迭代器对象可以使用常规for语句进行遍历;也可以使用next()函数
for语句实现
l1 = [1,2,3,4]it = iter(l1)
for i in it:
print(i, end="\n")
使用next()函数实现
import sysl1 = [1,2,3,4]
it = iter(l1)
while True:
try:
print(next(it))
except StopIteration:
sys.exit()
把一个类作为迭代器使用需要再类中实现两个方法: __inter__()与__next__()
__inter__() 方法返回一个特殊的迭代对象,这个迭代对象实现了__next__()方法并通过与StopIteration异常标识迭代的完成
__next__() 会返回一个迭代对象
创建一个返回数字的迭代器,初始值为1,逐步递增1
class MyNumbers():def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a +=1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
View Code
StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__() 方法中,可以设置在完成指定循环次数后触发StopIteration异常来结束迭代。
class MyNumbers():def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a +=1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for i in myiter:
print(i)
View Code
生成器
在Python中,使用了yield的函数的成为生成器(generator)
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到yield时 函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
25、请将[i for i in range(5)]改成生成器
生成是特殊的迭代器
print(type(a))
26、info = [-5,8,0,4,9,-4,-20,-2,8,2,-4]使用lambda函数排序
从小到大排序
info = [-5,8,0,4,9,-4,-20,-2,8,2,-4]a = sorted(info, key=lambda x:x)
print(a)
正数从小到大,负数从大到小
info = [-5,8,0,4,9,-4,-20,-2,8,2,-4]a = sorted(info, key=lambda x:(x<0,abs(x)))
print(a)
27、有许多层的列表,要取出所有元素——设置结束条件使用递归
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
isinstance() 与 type() 区别:type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
l =[1, 2,'list' ,[3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15,[16,[17,]],19]]]]]]]
l =[1, 2,'list' ,[3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15,[16,[17,]],19]]]]]]]def search(l):
for item in l:
# if type(item) is list:
if isinstance(item,list): ##判断数据类型是否是列表
search(item)
else:
print(item)
search(l)