重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Python中的对象包含三要素:id、type、value
创新互联-专业网站定制、快速模板网站建设、高性价比温宿网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式温宿网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖温宿地区。费用合理售后完善,十载实体公司更值得信赖。
其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值
is判断的是a对象是否就是b对象,是通过id来判断的
==判断的是a对象的值是否和b对象的值相等,是通过value来判断的
如下代码或许可以帮助你理解。
a = 1
b = 1.0
a is b
False
a == b
True
id(a)
12777000
id(b)
14986000
a = 1
b = 1
a is b
True
a == b
True
id(a)
12777000
id(b)
12777000
简单来说,python中的is与is not运算符可判断两个对象是否为同一对象。
若为同一个对象,则对象1 is 对象2为True 。
反正,若非同一个对象,则对象1 is not 对象2为True
要理解Python中的is和is not运算符,首先需要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。
is和==(is not和!=)都是对对象进行比较判断作用的。
但对对象比较判断的内容并不相同。
拿is和==为例,
==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等,例如下面两个字符串间的比较:
a = 'iplaypython.com'
b = 'iplaypython.com'
a == b
True
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。通过对下面几个列表间的比较,你就会明白is同一性运算符的工作原理:
x = y = [4,5,6]
z = [4,5,6]
x == y
True
x == z
True
x is y
True
x is z
False
print id(x)
3075326572
print id(y)
3075326572
print id(z)
3075328140
可看出前三个例子都是True,而最后一个是False。
x、y和z的值是相同的,所以前两个是True没有问题。
至于最后一个为什么是False,看看三个对象的id分别是什么就会明白了。
==比较操作符:用来比较两个对象是否相等,value做为判断因素;
is同一性运算符:比较判断两个对象是否相同,id做为判断因素。
同理,
!=比较操作符:用来比较两个对象是否不等,value做为判断因素;
is not同一性运算符:比较判断两个对象是否不同,id做为判断因素。
python
def isMax(a,b,c):
a = a if ab else b
c = c if ca else a
return c
def sumNcubes(n):
return sum(range(1,n))
def isPrime():
if n = 1:
return False
i = 1
while i*i = n:
if n % i == 0:
return False
i += 1
return True
#!/usr/bin/python
# -*- coding:utf-8 -*-
# @Time : 2018/6/14 15:30
# @File : Perfect_Numbers.py
"""
完美数
"""
def is_perfect(anum):
"""判断一个数是不是完美数"""
assert anum 0, u'完美数是大于0的整数'
ll = []
num = 0
for i in range(1, anum):
if anum % i == 0:
ll.append(i)
num = sum(ll)
if num == anum:
return True
else:
return False
def perfect_numbers(a):
"""打印不大于输入参数的所有完美数"""
temp = 1 + a
alist = []
for i in range(1, temp):
# global alist
if is_perfect(i):
alist.append(i)
if len(alist) == 0:
print u'不大于{0}的时候没有完美数'.format(a)
else:
print u'不大于{0}的时候完美数有:{1}'.format(a, alist)
if __name__ == '__main__':
nums = int(raw_input(u'请输入一个正整数:'))
perfect_numbers(nums)
• 一、is和==的区别?•二、延伸问题•三、*和**区别?
为什么会这样呢?
小整数池目的:节省内存,提高执行效率。
Python中的一切东西皆为对象,那么每次给变量赋值是不是都需要新建一个对象呢?
实际编程过程中,像1、3、5这样的整数的使用频率比整数10000、11000使用更为频繁,对于低频整数每次都创建空间可能对于程序的性能影响并不大,但是对于较小的整数,由于其使用频率非常高,所以每次申请赋值都需要为其分配一个新的空间,无疑会大大降低程序的效率。
对于这个问题,Python明智地将整数分成了小整数和大整数两种类型,对于两种不同类型的数据分别采取了不同的方案:
小整数:将这部分有限的整数缓存于内存中,可共享。
大整数:将其放入使用单链表维护的对象池中,非共享,即每次创建都需要为其分配一块新的内存,即使内存中已经存在相同的整数。
需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256]。
该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。
另外创建变量的值如果相同的话,创建的时间间隔又比较短,那么他们的内存空间的值是相同的。
在Pycharm中运行Python程序时,Pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。
单个* 号:1.表示乘号;2.表示倍数;3.(1) 单个*表示接受任意多个参数并将其放在一个元组中 ;(2)函数在调用多个参数时,在列表、元组、集合、字典及其他可迭代对象作为实参,并在前面加 *
如 *(1,2,3)解释器将自动进行解包然后传递给多个单变量参数(参数个数要对应相等)。
两个*号:
用于接收类似于 关键参数 一样赋值的形式的多个实参放入字典中(即把该函数的参数转换为字典)。
1、get() 返回指定键的值,如果值不在字典中返回default值。
语法:dict.get(key,default=None)
参数:
key 字典中要查找的键。
default 如果指定键的值不存在时,返回该默认值值。
例:
dict={'Name':'alex','Age':21}
print("Name is:%s"% dict.get('Name')+"\n"+ "Age is:%d"% dict.get('Age'))
显示结果为:
Name is:alex
Age is:21
2、update() 将一个字典中的值更新到另一个字典中。
语法:dict.update(dict2)
参数:
dict2 添加到指定字典dict里的字典。
例:
dict={'Name':'alex','Age':21}
dict2={'Sex':'female'}
dict.update(dict2)
print("Value is %s" % dict)
显示结果为:
Value is {'Name': 'alex', 'Age': 21, 'Sex': 'female'}