老手都是从新手一路走过来的,新手可能会对Python中难理解的一些概念存在困难,比如变量赋值、装饰器、闭包、迭代器、对象等等。
这些概念在初学阶段似乎没一个好懂的,尤其是对零基础来说,今天就来整理一下这部分的知识点,大家传授一下经验,互相学习。
01
变量赋值的理解
这个相对后面的装饰器、生成器来说,难度算2颗星,但依旧是很多初学萌新会弄错的地方。
python和C语言不一样,变量在声明的时候并不定义它的类型,而是通过赋值的类型体现出来。
所以一般python变量在声明时需要赋初值;
在C语言中,给变量赋值时,需要先指定数据类型,同时会开辟一块内存区域,用于存储值。
例如:inta=0
当给a赋值:a=5
这时候内存地址没有变,只是该段内存中的值变了,变成了2。
这时候如果:intb=a
相当于把值拷贝了一份传递给变量b,b是新开辟的一段内存区域,此时a和b的地址并不相同。
在Python中,“变量”的严格叫法是“名字(name)”,也可以理解为标签,就像每个人的姓名一样,只是标记我们的一个标签。
这种方式和python“万物皆对象”的思想相契合的;
Python的命名规则遵循驼峰命名规则;
示例(单一赋值):
python允许同时对多个变量赋值;
方式1(统一赋值,相当于a=,b=,c=,e=):
方式2(对称赋值,相当于a=1,b=2.2,c=“字符串”):
Python中的对象分为可变类型和不可变类型,可变类型的变量赋值与我们了解的C语言机制相同。
而不可变类型的变量赋值时,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象。
当然如果没有其他变量引用原有对象时,原有对象就会被回收。
02
什么是装饰器?
装饰器理解起来很难,但使用率非常高,记得我刚学装饰器那会儿也头疼了蛮久。
我们用通俗一点的话来理解,什么叫装饰?
就是装点、提供一些额外的点缀,说白了python中的装饰器就是提供了一些额外的功能。
其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码。
使用装饰器:
使用装饰器的好处?
作为结构化工具,装饰器自然地促进了代码的封装,这就减少了冗余性并使得未来维护和扩展变得更容易。
如果大家学过Django和Flask就会知道,web框架里面大量的使用装饰器进行代码的封装。
下面看一个简单的例子:
我们有一个主题函数word()是输出一个字符串,我们有一个函数是把字符串变粗体,另外一个是变斜体。
有了装饰器之后,我们可以非常灵活的组合,扩展函数的功能:
有一点要注意的是:装饰器的顺序变了,结果是不一样的;
03
如何理解闭包?
是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。
如果在内部函数对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。
通过闭包可以访问外层非全局作用域的变量,这个作用域称为闭包作用域。
首先归纳一下,闭包必须满足的三个条件:
需要有一个内嵌函数
内嵌函数需要引用定义在外部函数中的变量(自由变量)
内嵌函数需要被返回(这一点最重要,是区别普通嵌套函数与闭包的本质)
几个典型的闭包例子:
函数闭包的概念在初学时容易迷糊,尤其涉及到闭包的作用域问题;
Python中函数的作用域由def关键字界定,函数内的代码访问变量的方式是从其所在层级由内向外的。
如上图中的第一段代码:
嵌套函数line中的代码访问了a和b变量,line本身函数体内并不存在这两个变量,所以会逐级向外查找。
往上走一层就找到了来自主函数line_conf传递的a,b,若往外直至全局作用域都查找不到的话代码会抛异常。
注意:不管主函数line_conf下面嵌套了多少个函数,这些函数都在其作用域内,都可以在line_conf作用域内被调用。
04
怎么理解迭代器?
迭代器协议:
对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退)
可迭代对象:
实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
上面这些板板正正的概念是不是看起来晕乎乎的?哈哈晕就对了!
迭代器从字面上来看就是可以迭代取值的工具,从专业的角度来说:
迭代器就是实现了__next__方法,返回序列的下一个元素,如果没有元素了,就会抛出StopIteration异常。
python中的迭代器还实现了__iter__方法,因此迭代器也是可以迭代的。
所以简单地说:在python中,内部含有__iter__方法并且含有__next__方法的对象就是迭代器。
如何判断一个对象是不是迭代器?
通过dir方法查看其是否具备iter和next方法;
如下判断str,list,tuple,dic和文件哪个是迭代器?
可以看出只有文件对象是迭代器,其他对象均是可迭代对象,到这里再去理解前面的概念就容易一点了。
05
什么是对象?
Python一切皆对象,这句话应该都不陌生。
一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象......
任何对象都有3个关键属性:标识、值、类型。
①标识:
就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变。
可以认为标识是这个对象在计算机内存中的地址,通过函数id()可以查看对象的ID标识
②对象值:
对象的第二个属性是值,值很好理解,比如i的值是10,s的值是abc,nums的值就是1,2,3。
③类型:
对象还有一个很重要的属性就是类型,任何对象都有属于自己的类型,对象就是由它的类型构造出来的。
比如上面i的类型是int类型,s类型是字符串类型,nums的类型是列表类型,dicts的类型是字典类型,它们都是由对应的类型构建出来的。
通过type()可以查看对象的类型;
对象的类型也和ID标识一样,确定好之后就不会再变化了。
好了,今天的分享就结束了,这里讲到的知识点相对偏难,新手可以在有一定的基础后,再回头来看看。
END
最后:
欢迎