python总结五
1.is和==的区别:
官方文档解释:is表示的是对象标识符,而==表示的是相等equal,is的作用是用来检查对象的标识符是否一致,也就是两个对象在内存中的地址是否一样
而==是用来检查两个对象是否相等
而我们在检查a is b的时候,相当于是检查id(a)=id(b),er检查a==b的时候,实际上是调用了对象的a的__eq()__方法,a==b相当于是a.eq()__(b)
一般情况下,如果a is b返回的是True的话,那么a和b指向同一个内存的话,a==b也是会返回True的,所以a和b的值也相等,只要a和b的值相等,那么a==b就会返回True,er只有id(a)==id(b)的时候,a is b才会返回True
这里还有一个问题,为什么 a 和 b 都是 "hello" 的时候,a is b 返回True,而 a 和 b都是 "hello world" 的时候,a is b 返回False呢?
这是因为前一种情况下Python的字符串驻留机制起了作用。对于较小的字符串,为了提高系统性能Python会保留其值的一个副本,当创建新的字符串的时候直接指向该副本即可。所以 "hello" 在内存中只有一个副本,a 和 b 的 id 值相同,而 "hello world" 是长字符串,不驻留内存,Python中各自创建了对象来表示 a 和 b,所以他们的值相同但 id 值不同。
总结一下:is 是检查两个对象是否指向同一块内存空间,而 == 是检查他们的值是否相等。可以看出,is 是比 == 更严格的检查,is 返回True表明这两个对象指向同一块内存,值也一定相同。
那我们深入一步来思考一下下面这个问题:
Python里和None比较时,为什么是 is None 而不是 == None 呢?
上一个面试题:Python面试之 is 和 == 的区别的最后留了一个问题:
Python里和None比较时,为什么是 is None 而不是 == None 呢?
这是因为None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。而 == None背后调用的是__eq__,而__eq__可以被重载,下面是一个 is not None但 == None的例子

2.可变对象和不可变对象:
可变对象创建之后可以改变但是地址不会改变,即变量指向的还是原来的变量,id值还是一样。不可变对象创建之后便办呢个改变,
如果改变则指向新的对象,就是会指向一个新的内存地址,id值不同
python中dict,list是可变对象,str,int,tuple,float都是不可变对象
再来看下工厂模式的实现

打印输出的结果:

3.
with与上下文管理器With基本语法
Python老司机应该对下面的语法不陌生

上面的代码往output文件写入了Hello world字符串,with语句会在执行完代码块后自动关闭文件。这里无论写文件的操作成功与否,是否有异常抛出,with语句都会保证文件被关闭。
如果不用with,我们可能要用下面的代码实现类似的功能

可以看到使用了with的代码比上面的代码简洁许多。
上面的with代码背后发生了些什么?我们来看下它的执行流程
首先执行open('output', 'w'),返回一个文件对象
调用这个文件对象的__enter__方法,并将__enter__方法的返回值赋值给变量f
执行with语句体,即with语句包裹起来的代码块
不管执行过程中是否发生了异常,执行文件对象的__exit__方法,在__exit__方法中关闭文件。
这里的关键在于open返回的文件对象实现了__enter__和__exit__方法。一个实现了__enter__和__exit__方法的对象就称之为上下文管理器。
上下文管理器
上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。__enter__方法在语句体执行之前进入运行时上下文,__exit__在语句体执行完后从运行时上下文退出。
在实际应用中,__enter__一般用于资源分配,如打开文件、连接数据库、获取线程锁;__exit__一般用于资源释放,如关闭文件、关闭数据库连接、释放线程锁。
自定义上下文管理器
既然上下文管理器就是实现了__enter__和__exit__方法的对象,我们能不能定义自己的上下文管理器呢?答案是肯定的。
我们先来看下__enter__和__exit__方法的定义:
__enter__() - 进入上下文管理器的运行时上下文,在语句体执行前调用。如果有as子句,with语句将该方法的返回值赋值给 as 子句中的 target。
__exit__(exception_type, exception_value, traceback) - 退出与上下文管理器相关的运行时上下文,返回一个布尔值表示是否对发生的异常进行处理。如果with语句体中没有异常发生,则__exit__的3个参数都为None,即调用 __exit__(None, None, None),并且__exit__的返回值直接被忽略。如果有发生异常,则使用 sys.exc_info 得到的异常信息为参数调用__exit__(exception_type, exception_value, traceback)。出现异常时,如果__exit__(exception_type, exception_value, traceback)返回 False,则会重新抛出异常,让with之外的语句逻辑来处理异常;如果返回 True,则忽略异常,不再对异常进行处理。
理解了__enter__和__exit__方法后,我们来自己定义一个简单的上下文管理器。这里不做实际的资源分配和释放,而用打印语句来表明当前的操作。

运行上面的代码,会得到如下的输出

我们在with语句体中人为地抛出一个异常

会得到如下的输出

如我们所期待,with语句体中抛出异常,__exit__方法中exception_type不为None,__exit__方法返回False,异常被重新抛出。
以上,我们通过实现__enter__和__exit__方法来实现了一个自定义的上下文管理器。
4.python中传递参数是传值还是传地址
首先说python中参数传递的问题,python中有可变对象和不可变对象,比如list(列表)可变对象,不可变对象(字符串),在参数传递的时候
对于不可变对象作为函数参数,相当于是c系语言的值传递
对于可变对象作为函数参数,相当于是c系语言的引用传递
对于不可变对象的话,调用自身的任意方法,并不会改变对象自身的内容,这些方法会创建新的对象并返回,保证了不可变对象本身是永远不可以变的
另一个解释:对于不可变对象的函数传参,依然是传的引用(地址)。对于简单类型,在函数内对其操作之所以不会影响函数范围外的值,是因为运算中的赋值操作产生了新的对象,而不是对原有对象的改变。而对于一些复杂类型,就可以比较清晰的看出,函数内参数的改变同样会影响函数外的变量。
python中的函数通过引用传参
python总结五的更多相关文章
- Python第五章__模块介绍,常用内置模块
Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群 群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...
- Python(五)编程小实例
Python(五)编程小实例 抓取网页信息,并生成txt文件内容! Python抓取网页技能--Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些 ...
- 初学Python(五)——元组
初学Python(五)——元组 初学Python,主要整理一些学习到的知识点,这次是元组. #-*- coding:utf-8 -*- #定义元素 t = (1,2,3) #添加元素 #删除元素 #更 ...
- Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块
Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块 目录 Pycharm使用技巧( ...
- 简学Python第五章__模块介绍,常用内置模块
Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群 群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...
- 孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务
孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第五天.今天的感觉是,mongoDB数 ...
- 孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库
孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第四天.今天的感觉是,mongoDB数据 ...
- 孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库
孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第三天.感觉这个东西学习起来还是那么困 ...
- 孤荷凌寒自学python第五十六天通过compass客户端和mongodb shell 命令来连接远端MongoDb数据库
孤荷凌寒自学python第五十六天通过compass客户端和mongodb shell 命令来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第二 ...
- 孤荷凌寒自学python第五十五天初识MongoDb数据库
孤荷凌寒自学python第五十五天第一天初识MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 大家好,2019年新年快乐! 本来我想的是借新年第一天开始,正式尝试学习爬虫,结果今天偶然发现 ...
随机推荐
- freemarker模板文件的4个组成部分
FreeMarker模板文件主要由以下4个部分组成:1.文本,直接输出的部分.2.注释,即<#–…–>格式不会输出.3.插值(Interpolation):即${..}或者#{..}格式的 ...
- 【Luogu5349】幂(分治FFT)
[Luogu5349]幂(分治FFT) 题面 洛谷 题解 把多项式每一项拆出来考虑,于是等价于要求的只有\(\sum_{i=0}^\infty i^kr^i\). 令\(f(r)=\sum_{i=0} ...
- windows10下录屏
windows10自带了录屏功能.运行win+G即可打开.如果出现错误,可以运行如下PS脚本. https://files.cnblogs.com/files/mqingqing123/reinsta ...
- FrameworkCubeMX.gpdsc missing的问题
(1)上图红框内容均不要勾选 (2)工程中自己添加相应的启动文件,形如: startup_stm32f030x6.s system_stm32f0xx.c
- 25个特殊操作符(special operator)
1. CLHS (Common-Lisp-Hyper-Spec) http://www.lispworks.com/documentation/HyperSpec/Body/03_ababa.htm ...
- Linux实用指令(5)
指定运行级别(系统的制定级别配置文件/etc/inittab): 0:关机 1:单用户(单用户级别root登录不需要密码,进入之后重新设置密码) 2:多用户无网络服务 3:多用户有网络服务 4:系统未 ...
- 并发编程-线程,JMM,JVM,volatile
1.线程 相信大家对线程这个名词已经很不陌生了,从刚开始学习java就接触到线程,先说说进程吧,进程就是系统分配资源的基本单位,线程是调度cpu的基本单位,进程由线程组成,一个进程至少又一个线程组成, ...
- ES6的常见语法!!
let : 声明变量 不存在变量提前 拥有局部作用域 (只要有{}出现 则只在该{}范围内生效) (而var只在函数内会产生作用域范围) 不能重复声明 const : 声明常量(常量名从规范上来将 最 ...
- 如何才能通俗易懂的解释js里面的‘闭包’?
1. "闭包就是跨作用域访问变量." [示例一] var name = 'wangxi' function user () { // var name = 'wangxi' fun ...
- iOS批量添加SDK自动打包GUI工具
背景 1.之前在给游戏开发商做SDK接入技术支持的时候,很多cp对iOS开发技术并不是很了解,对接SDK和打包都很迷糊,虽然我们根据他们的开发环境输出了不同的插件解决方案,这一步已经把接入SDK的复杂 ...