难点解析——传说中Python难以理解的概念整理

老手都是从新手一路走过来的,新手可能会对Python中难理解的一些概念存在困难,比如变量赋值、装饰器、闭包、迭代器、对象等等。

这些概念在初学阶段似乎没一个好懂的,尤其是对零基础来说,今天就来整理一下这部分的知识点,大家传授一下经验,互相学习。

01 变量赋值的理解 

这个相对后面的装饰器、生成器来说,难度算2颗星,但依旧是很多初学萌新会弄错的地方。

Python和C语言不一样,变量在声明的时候并不定义它的类型,而是通过赋值的类型体现出来。

所以一般Python变量在声明时需要赋初值;

在C语言中, 给变量赋值时,需要先指定数据类型,同时会开辟一块内存区域,用于存储值。

例如:int a =0

当给a赋值: a=5

这时候内存地址没有变,只是该段内存中的值变了,变成了2。

这时候如果: int b=a

相当于把值拷贝了一份传递给变量b,b是新开辟的一段内存区域,此时a和b的地址并不相同。

在Python中,“变量”的严格叫法是“名字(name)”,也可以理解为标签,就像每个人的姓名一样,只是标记我们的一个标签。

这种方式和Python“万物皆对象”的思想相契合的;

Python的命名规则遵循驼峰命名规则;

示例(单一赋值):

Python允许同时对多个变量赋值;

方式1(统一赋值,相当于a = 100, b = 100, c = 100, e = 100):

方式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和文件哪个是迭代器?

可以看出只有文件对象是迭代器,其他对象均是可迭代对象,到这里再去理解前面的概念就容易一点了。

0 5 什么是对象?

Python 一切皆对象,这句话应该都不陌生。

一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象......

任何对象都有3个关键属性:标识、值、类型。

① 标识:

就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变。

可以认为标识是这个对象在计算机内存中的地址,通过函数 id() 可以查看对象的ID标识

② 对象值:

对象的第二个属性是值,值很好理解,比如 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。

③ 类型:

对象还有一个很重要的属性就是类型,任何对象都有属于自己的类型,对象就是由它的类型构造出来的。

比如上面 i 的类型是 int 类型,s 类型是字符串类型,nums 的类型是列表类型,dicts 的类型是字典类型,它们都是由对应的类型构建出来的。

通过 type() 可以查看对象的类型;

对象的类型也和ID标识一样,确定好之后就不会再变化了。

好了,今天的分享就结束了,这里讲到的知识点相对偏难,新手可以在有一定的基础后,再回头来看看。对Python感兴趣的同学可以前往gzh【Python编程学习圈】了解更多技术干货内容,还有大量学习资料可以免费领取,欢迎前往了解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值