1.hasattr(object, name)函数

判断一个对象里面是否有name属性或者name方法,返回bool值,有name属性(方法)返回True,否则返回False。
注意:name要使用引号括起来。
示例:


class function_demo(object):
     name = 'demo'
     def run(self):
         return "hello function"
functiondemo = function_demo()
res1 = hasattr(functiondemo, 'name')  #判断对象是否有name 属性
print(res1) # True
res2 = hasattr(functiondemo, "run") #判断对象是否有run方法
print(res2) # True
res3 = hasattr(functiondemo, "age") #判断对象是否有age属性
print(res3) # False

2.getattr(object, name) 函数

获取对象object的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。
注意:如果返回的是对象的方法,则打印结果是:方法的内存地址,如果需要运行这个方法,可以在后面添加括号()。
程序示例:

class function_demo(object):
    name = 'demo'

    def run(self):
        return "hello function"


functiondemo = function_demo()
ress1 = getattr(functiondemo, 'name') #获取name属性,存在就打印出来
print(ress1)  # demo
ress2 = getattr(functiondemo, "run") #获取run方法,存在打印出 方法的内存地址
print(ress2)  # <bound method function_demo.run of <__main__.function_demo object at 0x000002230D4A3908>>
print(ress2())  #  hello function
ress3 = getattr(functiondemo, "age") #获取不存在的属性,报错如下:
print(ress3) # AttributeError: 'function_demo' object has no attribute 'age'

3.setattr(object,name,values)函数

给对象的属性赋值,若属性不存在,先创建再赋值

class function_demo(object):
    name = 'demo'

    def run(self):
        return "hello function"


functiondemo = function_demo()
res = hasattr(functiondemo, 'age')  # 判断age属性是否存在,False
print(res) # False
setattr(functiondemo, 'age', 18 )  #对age属性进行赋值,无返回值
res1 = hasattr(functiondemo, 'age') #再次判断属性是否存在
print(res1) # True
res2 = getattr(functiondemo,'age')
print(res2) # 18

4. 简述多线程、多进程

进程

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

线程:

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

应用:

IO密集的用多线程,在用户输入,sleep时候,可以切换到其他线程执行,减少等待的时间
CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势

5. 简述any()和all()方法

any():只要迭代器中有一个元素为真就为真
all():迭代器中所有的判断项返回都是真,结果才为真
测试如下:
在这里插入图片描述
在这里插入图片描述

6. python中copy和deepcopy区别

1、复制不可变数据类型,不管copy还是deepcopy,都是同一个地址,当浅复制的值是不可变对象(数值,字符串,元组)时和="赋值"的情况一样,对象的id值与浅复制原来的值相同。

from copy import copy,deepcopy
a= 'hello'
b=a
c= copy(a)
d=deepcopy(a)
print(a,id(a))
print(b,id(b))
print(c,id(c))
print(d,id(d))

'''
执行结果:
hello 2115269581264
hello 2115269581264
hello 2115269581264
hello 2115269581264
'''

2、复制的值是可变对象(列表和字典)浅拷贝copy有两种情况:
第一种情况:复制的对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
第二种情况︰复制的对象中有复杂子对象(例如列表中的一个子元素是一个列表),改变原来的值中的复杂子对象的值,会影响浅复制的值。
深拷贝deepcopy:完全复制独立,包括内层列表和字典
在这里插入图片描述
在这里插入图片描述

7. 说说python中装饰器、迭代器的用法;描述下dict的items()方法与iteritems()方法的不同

装饰器是指对函数执行过程,做一些扩展,甚至可以更改本身函数的执行;迭代器是指遵循迭代器协议的对象,这类对象在被for循环时,每次迭代生成下一个项,不用一开始就生成整个列表;在python3中不存在iteritems,items方法返回可迭代对象,在python2中items()返回[(key,value)]的列表对象,iteritems()返回迭代器对象,iteritems()循环时不可以增删dict的内容。

8. 如何判断一个值是函数还是方法

用MethodType,FunctionType诊断:


from types import MethodType,FunctionType

def a():
    pass
    
class B():
    def b(self):
        pass
ob = B()

print(isinstance('1', FunctionType))  # False
print(isinstance(lambda x:x, FunctionType))  # True
print(isinstance(a,MethodType)) # False
print(isinstance(a,FunctionType)) # True

print(isinstance(ob.b,MethodType)) # True
print(isinstance(ob.b,FunctionType)) False

知识便利贴:
方法与函数的区别:
1、定义位置
函数:Python的函数是直接写在Python模块中的,即在.py文件中直接定义。
方法:只能定义在class类中
2、定义方式
函数:函数定义的方式 def关键字 然后接函数名 再是括号 括号里面写形参也可以省略不写形参
方法:方法定义的方式, 首先方法是定义在类中的,其他大体和函数定义差不多,这里需要注意的一点就是方法必须带一个默认参数self(静态方法除外)
3、调用方式
(1)函数:通过“函数名()”的方式进行调用。
(2)方法:通过“对象.方法名”的方式进行调用。
注意:静态方法除外,可以不传递第一个self参数

9. 输入日期, 判断这一天是这一年的第几天?

import datetime
def dayofyear():
    year = input("请输入年份: ")
    month = input("请输入月份: ")
    day = input("请输入天: ")
    date1 = datetime.date(year=int(year),month=int(month),day=int(day))
    date2 = datetime.date(year=int(year),month=1,day=1)
    return (date1-date2).days+1
a = dayofyear()
print(a)

'''
测试结果:

请输入年份: 2021
请输入月份: 1
请输入天: 10
10
'''

10. 将字符串 “k:1 |k1:2|k2:3|k3:4”,处理成字典 {k:1,k1:2,…}


str1 = "k:1|k1:2|k2:3|k3:4"
# 法一:
def str2dict(str1):
    dict1 = {}
    for iterms in str1.split('|'):
        key,value = iterms.split(':')
        dict1[key] = int(value)
    return dict1

res = str2dict(str1)
print(res) # {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}
#法二:字典推导式
d = {k:int(v) for t in str1.split("|") for k, v in (t.split(":"), )}
print(d) # {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐