Python知识点实战

一、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的区别

类别python2python3
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运行效率的方法

  1. 使用生成器,因为可以节约大量内存
  2. 循环代码优化,避免过多重复代码的执行
  3. 核心模块用Cython PyPy等,提供效率
  4. 使用多进程、多线程、协程
  5. 多个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、简述多线程、多进程

  进程:
  • 操作系统进行资源分配和调度的基本单位,多个进程之间相互独立
  • 稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
  线程:
  1. CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
  2. 如果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

View Code

  StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__() 方法中,可以设置在完成指定循环次数后触发StopIteration异常来结束迭代。

View Code

  生成器

  在Python中,使用了yield的函数的成为生成器(generator)

  跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

  在调用生成器运行的过程中,每次遇到yield时 函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行 next() 方法时从当前位置继续运行。

  调用一个生成器函数,返回的是一个迭代器对象。

25、请将[i for i in range(5)]改成生成器

  生成是特殊的迭代器

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

28、判断下面的写法是否正确?并使用文字进行展述

a = 1_43_78
print(a)

  答

上面的写法在python3中适用,在python中数字可以使用"_"进行格式化书写;
在python2中,报语法错误

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值