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