当前位置 : 主页 > 编程语言 > python >

Python知识点实战

来源:互联网 收集:自由互联 发布时间:2022-06-15
一、Python知识点实战 1、一行代码实现1-100的和 num = sum(range(1,101)) print(num) 2、如何在一个函数内部修改全局变量 利用global在函数声明,修改全局变量 a = 5 def f1(): global a a = 6 f1() print(a)

一、Python知识点实战

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

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

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

  利用global在函数声明,修改全局变量

a = 5
def 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运行效率的方法

  • 使用生成器,因为可以节约大量内存
  • 循环代码优化,避免过多重复代码的执行
  • 核心模块用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 re

    s = "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 sys
    l1 = [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

    Python知识点实战_生成器Python知识点实战_迭代器_02

    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异常来结束迭代。

    Python知识点实战_生成器Python知识点实战_迭代器_02

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

      生成是特殊的迭代器

  • 列表表达式的[]改为()即可变成生成器
  • 函数在返回值时,出现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)





    上一篇:Python连接各种中间件
    下一篇:没有了
    网友评论