zoukankan      html  css  js  c++  java
  • 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第三方

  • 相关阅读:
    C# 线程手册 第二章 .NET 中的线程
    C# 线程手册 第一章 线程定义 .NET 和 C# 对线程的支持
    C# 线程手册 第二章 .NET 中的线程 创建一个线程
    C# 线程手册 第一章 线程定义 线程
    C# 线程手册 第二章 .NET 中的线程 时钟和回调
    C# 线程手册 第二章 .NET 中的线程 线程的生命周期
    C# 线程手册 第二章 .NET 中的线程 线程的优势
    Visual Entity 教程(一)从数据库创建模型
    Visual Entity 教程(三)添加 Attribute 到类或属性中
    Linq to Oracle 使用教程(二)创建实体类
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14151963.html
Copyright © 2011-2022 走看看