python基础易忘点

nonlocal

内层函数使用外层函数中定义的变量,则在使用前应加上nonlocal声明;一个函数要使用全局变量,则在使用前应在函数中加上global声明。注:如果在内层函数中只是获取外层函数中所定义变量的值、而不需要修改该变量的值,则也可以省去nonlocal声明;同样,如果在一个函数中只是获取全局变量的值、而不需要修改全局变量的值,则也可以省去global声明。

如果在内层函数中只是获取外层函数中所定义变量的值、而不需要修改该变量的值,则也可以省略nonlocal声明。为了增强程序可读性,建议无论是否需要修改外层函数中所定义变量的值,都将nonlocal声明写上。

闭包

如果内层函数使用了外层函数中定义的局部变量,并且外层函数的返回值是内层函数的引用,就构成了闭包。
定义在外层函数中但由内层函数使用的变量被称为自由变量。

def outer(x): #定义函数outer
    y=10  #定义局部变量y并赋为10
    def inner(z):#在outer函数中定义#嵌套函数inner
        nonlocal x,y #nonlocal声明
        return x+y+z #返回x+y+z的结果
    return inner #返回嵌套函数inner的引用
f=outer(5) #将返回的inner函数赋给f
g=outer(50) #将返回的inner函数赋给g
print('f(20)的值为:', f(20))
print('g(20)的值为:', g(20))
print('f(30)的值为:', f(30))
print('g(30)的值为:', g(30))

闭包的主要作用在于可以封存函数执行的上下文环境。例如,通过两次调用outer函数形成了两个闭包,这两个闭包具有相互独立的上下文环境(一个闭包中x=5、y=10,另一个闭包中x=50、y=10),且每个闭包可多次调用。

一般情况下,如果一个函数结束,则该函数中定义的局部变量就会释放。而闭包是一种特殊情况,外层函数在执行结束时发现其定义的局部变量将在内层函数中继续使用,因此这些变量不会被释放、成为自由变量。闭包实际上就是将内层函数的代码以及自由变量打包在一起形成的一个整体。

外层函数必须返回内层函数的引用,这样每调用一次外层函数才会形成一个闭包。

装饰器
一个装饰器可以为多个函数注入代码,一个函数也可以注入多个装饰器的代码。

通过装饰器,可以在不修改已有函数情况下向已有的一个或多个函数注入相同代码。如可以利用装饰器统计每个函数的运行时间,从而分析出程序执行效率的瓶颈。


类的封装性是指将一个数据相关的属性和方法封装在一起。

通过“Student.name=‘unknown’”语句为Student类增加了一个类属性name,该类属性既可以通过类名访问、也可以通过该类的对象名访问。
对象属性是每个对象所拥有的属性,只能通过该对象进行访问。同一个类的不同对象可以具有同名的属性,但其取值是相互独立的。

类中的方法分为两类:普通方法和内置方法
普通方法需要通过类的实例对象根据方法名调用
内置方法是在特定情况下由系统自动执行

类中的方法包括类方法、静态方法和普通方法。普通方法的第一个参数对应类的实例对象,通过该参数可以操作所对应对象中的属性。
类的普通方法有3个形参,则其中第1个形参对应类的实例对象,通过对象调用该普通方法时不需要额外为第1个形参传入实参,只需要为后两个形参传入2个实参即可。

对于私有属性,不能直接使用类名或对象名操作。Python中没有严格意义上的私有属性,实际上是自动将以两个下划线开头的属性的名字进行了修改,在其前面加上前缀“_类名”。如对于Student类的__id这个属性,Python会自动将其名字改为_Student__id,因此如果要通过stu操作该属性,应使用“stu._Studnet__id”。

提示:类对象销毁有如下三种情况:
(1)局部变量的作用域结束。
(2)使用del删除对象。
(3)程序结束时,程序中的所有对象都将被销毁。

如果一个类C1通过继承已有类C而创建,则将C1称作子类(或派生类),将C称作父类(或基类、超类)。
基于已有的类创建新的类是面向对象中的继承性。

封装性、继承性和多态性是面向对象的三个重要特性。封装性是指将一个数据的属性和方法封装在一起;继承性是指基于已有类创建新类,新类继承已有类中的属性和方法;多态性是指执行相同代码时,能够根据对象实际所属的类去调用相应类中定义的方法。

方法重写就是在子类中对父类继承过来的方法进行重新定义,这样通过子类对象和父类对象调用同一方法时就会执行不同的代码、表现出不同的行为。
python的多态是借助鸭子类型实现

super方法

使用super方法可以在子类中获取父类代理对象,从而可以根据该代理对象调用被重写的父类方法。

isinstance函数的作用是判断一个对象所属的类是否是指定类或指定类的子类;issubclass函数的作用是判断一个类是否是另一个类的子类;type函数用于获取一个数据的类型。

列表
len(ls)返回列表ls中的元素个数,ls.count(val)返回列表ls中值为val的元素个数。Python中不存在内置函数count,列表中也不存在len方法。
列表中没有max方法。要获取列表ls中最大元素的值应使用“max(ls)”。(内置函数)

sort方法的位置参数“key=lambda stu:stu.sno”表示将lambda函数传入对象
的sno属性作为返回值。

元组tuple
元组就是用一对小括号括起来的多个元素的有序集合,各元素之间用逗号分隔。

如果使用()创建的元组中只包含单个元素,则需要在这唯一的一个元素后面添加逗号,否则小括号会被系统认为是括号运算符、而不会被认为是在创建元组。

字典
dict(d1,**d2)返回的字典中包含了d1和d2这两个字典中的所有元素;而先通过dMerge=d1.copy()将d1的副本赋给dMerge(此时dMerge中包含了d1中的所有元素),再通过dMerge.update(d2)将d2中的元素更新到dMerge中(此时dMerge中包含了d1和d2的所有元素)。二者的执行效果完全相同。(都是浅复制)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值