45.不可变对象与可变对象
可变对象与不可变对象的区别在于对象本身是否可变。
python内置的一些类型中
可变对象:list dict set
不可变对象:tuple string int float bool
46.PEP8规范识别
序列为空if seq/ if not seq
,不用if seq != []
变量名不能重名 items = []; items=[item for item in items]
47.__dict__与dir()区别
答案:A
python一切皆对象,并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list,此时就需要用dir()来列出对象的所有属性。
__dict__属性:
实例的__dict__仅存储与该实例相关的实例属性,
正是因为实例的__dict__属性,每个实例的实例属性才会互不影响。
类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__dict__并不包含其父类的属性。
dir()函数:
dir()是Python提供的一个API函数,dir()函数会自动寻找一个对象的所有属性(包括从父类中继承的属性)。
一个实例的__dict__
属性仅仅是那个实例的实例属性的集合,并不包含该实例的所有有效属性。所以如果想获取一个对象所有有效属性,应使用dir()。
48. list append和extend区别
ls=['2020','20.20','python'] ls.append(2020) ls.append([2020,'2020']) ls.extend([2020,'1111']) print(ls)
输出:
['2020', '20.20', 'python', 2020, [2020, '2020'], 2020, '1111']
49.字典key不能为可变对象,例如list
一个对象能不能作为字典的key,就取决于其有没有__hash__方法。所以所有python自带类型中,目前我已知的除了list、dict、set和内部带有以上三种类型的tuple之外,其余的对象都能当key。
aaa={[1,2,3]:'ggggg'} print(aaa)
输出:
TypeError: unhashable type: 'list'
50.全局变量一般没有缩进
全局变量:指在函数之外定义的变量,一般没有缩进,在程序执行的全过程有效
局部变量:指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在
例1:
n = 1 # 全局变量 def func(a, b): c = a * b # c是局部变量,a和b作为函数参数也是局部变量 return c s = func("knock~", 2) print(s) print(c)
这个例子说明,当函数执行完退出后,其内部变量将被释放。
例子:关于局部变量的作用域,如下代码的正确输出是什么
答案:D
参考:
51.第三方工具
cProfile
和 profile
的用法基本相同, 一个是 C 实现的模块, 一个是 Python 实现的模块.推荐使用 cProfile
, 因为profile
分析很慢, 开销很多~
可以借助gprof2dot生成图片
52. Pylint
pylint是一个Python代码风格的检查工具, 它依据的标准是Guido van Rossum的PEP8 页面存档备份,存于互联网档案馆。
pylint类似于PyChecker, 但提供了更多的功能, 如检查代码行的长度, 检查变量命名是否符合编码规范, 或检查声明的接口是否被真正的实现
pylint的最大优势在于其高度的可配置化和可定制化,你可以很容易地写一个小插件添加个人功能。
用法示例:
pylint.bat --reports=n --include-ids=y --disable-msg=W0122,W0702 xlsconverter.py > lint_result.txt
其中:
- --reports=n 表示不产生输出报告
- --include-ids=y 表示输出的错误信息包含错误编号
- --disable-msg=W0122,W0702 表示W0122和W0702这两个警告信息被过滤掉了
- xlsconverter.py 是被检查的脚本
- 检查的结果被输出到了lint_result.txt中。
53.排序算法
例1:当应用到已经排好序的数组上去时,哪个算法复杂度最低?(D)
A 快速 B希尔 C 归并 D 插入
例2:假设整数数组A[n]中的数都介于1到n^6之间,下述什么算法有O(n)的时间复杂度(C??)选B
A.没有任何算法 B. 基数排序 C.计数排序 D.快速排序
54. __all__方法
- 任何向后兼容性保证仅适用于公共接口。因此,用户是否能够清楚地区分公共和内部接口是很重要的。
- 为了更好地支持内省,模块应使用__all__属性在其公共API中显式声明名称。将__all__设置为空列表表示该模块没有公共API。
模块中不使用__all__属性,则导入模块内的所有公有属性,方法和类 。
模块中使用__all__属性,则表示只导入__all__中指定的属性,因此,使用__all__可以隐藏不想被import的默认值。
__all__变量是一个由string元素组成的list变量。
它定义了当我们使用 from <module> import * 导入某个模块的时候能导出的符号(这里代表变量,函数,类等)。
from <module> import * 默认的行为是从给定的命名空间导出所有的符号(当然下划线开头的变量,方法和类除外)。
需要注意的是 __all__ 只影响到了 from <module> import * 这种导入方式,
对于 from <module> import <member> 导入方式并没有影响,仍然可以从外部导入。
#kk.py __all__=('A','func') #在别的模块中,导入该模块时,只能导入__all__中的变量,方法和类 class A(): def __init__(self,name,age): self.name=name self.age=age class B(): def __init__(self,name,id): self.name=name self.id=id def func(): print 'func() is called!' def func1(): print 'func1() is called!'
#test_kk.py from kk import * #kk.py中定义了__all__属性,只能导入__all__中定义的属性,方法和类 a=A('python','24') print a.name,a.age func() #func1() #NameError: name 'func1' is not defined #b=B('python',123456) #NameError: name 'B' is not defined
55.@setter和@property
python中用”.”操作来访问和改写类的属性成员时,会调用__get__和__set__方法,模式情况下,python会查找class.__dict__字典,对对应值进行操作。比如C.x会调用C.__get__访问最终读取C.__dict__[x]元素。
如果需要读取时对输出结果进行修饰或者对输入进行合法化检查,通常做法是自己写get和set函数,并通过调get和set函数进行读写类成员属性。
在变量x前面加下划线_表示为私有变量_x,并将变量名x设为用property函数返回的对象(property object)。
property函数的声明为
def property(fget = None, fset = None, fdel = None, doc = None) -> <property object>
其中fget, fset, fdel对应变量操作的读取(get),设置(set)和删除(del)函数。
而property对象<property object>有三个类方法,即setter, getter和delete,用于之后设置相应的函数。
class Student(object): __slots__ = ('__name', '__age', '__score') def __init__(self, name, age, score=0): self.__name = name self.__age = age self.__score = score # 使用装饰器的时候,需要注意: # 1. 装饰器名 # 2. property需要先声明,再写setter,顺序不能倒过来 # 将变量名赋值为包含get和set方法的property对象 # score = property(score, score) # 获取score @property def score(self): return self.__score # 设置score value @score.setter def score(self, score): if not isinstance(score, int): raise ValueError('Score必须是int类型!') if score < 0 or score > 100: raise ValueError('Score值必须在0=<score<=100') self.__score = score stu = Student('wuli2', 28) stu.score = 88 print(stu.score)
https://www.cnblogs.com/GumpYan/p/12381705.html
56. 命名规范(除了类、异常是首字母大写,其他都是小写下划线):
(1)小写加下划线(lower_with_fun):包(data_gen);模块(lower_with.py);函数;方法;函数参数;变量;
(2)每个单词大写字母开头(CapWords):类;异常;
(3)全大写,加下划线(CAPS_WITH_UNDER):常量;
(4)下划线开头:类或对象的私有成员;
注意:
1.单下划线开头,外部仍能访问; 双下划线开头,解释器会将变量改名字,作用是避免名字冲突;不具有权限控制,外部仍能访问;
2. 变量命名要有明确含义
57.导入模块,一行只导入一个
58.公司模块import顺序
公司模块import顺序:(BCA)
A自研,B标准,C第三方