Python易错点4

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

参考:

python函数对变量的作用及遵循的原则

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第三方

原文地址:https://www.cnblogs.com/GumpYan/p/14151963.html