Python知识点实战(python简单知识点)

网友投稿 209 2022-09-01


Python知识点实战(python简单知识点)

一、Python知识点实战

1、一行代码实现1-100的和

num = sum(range(1,101))print(num)

2、如何在一个函数内部修改全局变量

a = 5def f1(): global a a = 6f1()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)

保留原来列表元素的顺序

=[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 ** 2res1 = map(f1, l1)res = [i for i in res1 if i > 10]print(res)

12、python2与python3的区别

13、列出python中可变数据类型和不可变数类型

不可变数据类型:数值型、字符串型string和元组tuple (不允许变量的值发生变化,若改变了变量的值,相当于是新建了一个对象)

可变数据类型:列表list和字典dict (允许变量的值发生变化,即若对变量进行append、+=等这种操作后,只是改变了变量的值,而不是新建一个对象变量,变量引用的地址也不会变化,不过对于相同的值得不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址)

14、列表合并的结果

两个列表相加extend

15、提高python运行效率的方法

使用生成器,因为可以节约大量内存循环代码优化,避免过多重复代码的执行核心模块用Cython PyPy等,提供效率使用多进程、多线程、协程多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率

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、简述多线程、多进程

进程:

操作系统进行资源分配和调度的基本单位,多个进程之间相互独立稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制

线程:

CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃

应用:

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 xmyclass = 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 StopIterationmyclass = 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)]改成生成器

生成是特殊的迭代器

列表表达式的[]改为()即可变成生成器函数在返回值时,出现yield就变成生成器,而不是函数了

a = (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)


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python连接各种中间件
下一篇:mybatis实现遍历Map的key和value
相关文章

 发表评论

暂时没有评论,来抢沙发吧~