Python 3 教程 在线

1043Python3 数字(Number)

文中对于 _ 提到,它代表了上一次的输出结果,"用户应该将其视为只读变量",实际情况是你也可以对于_ 赋值,_=10 是没有毛病的,但这样的结果会导致你在之后调用 _ 的时候全部变成了10,除非你 del _

对于round:

>>> round(10.5)
10
>>> round(11.5)
12
>>>

Python 所谓的奇进偶弃,因为浮点数的表示在计算机中并不准确,用的时候可能要注意一下。

还可以参考这篇文章: Python 中关于 round 函数的小坑

1042Python3 运算符

深刻理解 and、or 逻辑运算符:

print(0 and 1)      # =>0,0等同于False
print(False and 1)  # =>False
print(-1 and 1)     # =>1
print(1 or False)   # =>1,非零等同于True
print(True or False)# =>True
print(-1 or 0)      # =>-1
  • and:前面为假(0 或者 False)则表达式为假,否则表达式为后面的值;
  • or:前面为真(非 0 或者非 False)则表达式为前面的值,否则表达式为后面的值;

优先级:not>and>or

print(1 and 0 or  not False) #=>True
print( not False or 1 and 0) #=>True
print( 1 or not True and 0)  #=>1

1041Python3 运算符

纠正上面 beihangld 评论关于“整数中 1 的数量”问题:由源码分析可知,Python3 整数对象存储为无符号数加上符号位标志,所以不存在“负数”补码形式,因此,计算 “1” 的数量需要按去符号后的无符号数:

cnt=bin(n).count('1')

另外,Python3 无长整,整数长度原则上不限,所以不能以假定的 32 位处理。

1040Python3 运算符

关于 is 和 == 的标识问题

(1)只要是变量的值相同,标识都相同,没有-5~256的限制,看下面的例子:

a = 100000
b = 100000
if a is b:
    print('a 和 b 标识相同,标识为:',id(a))
else:
    print('a 和 b 标识不相同,a 标识为:',id(a),'b 标识为:',id(b))

输出结果为:

a 和 b 标识相同,标识为: 2158477874512

(2)同样的如果是负数,仍然没有上述限制:

a = -100000
b = -100000
if a is b:
    print('a 和 b 标识相同,标识为:',id(a))
else:
    print('a 和 b 标识不相同,a 标识为:',id(a),'b 标识为:',id(b))

输出结果为:

a 和 b 标识相同,标识为: 2137845175632

(3)列表也是一样的,只要是列表项数值一样,那么标识也是一样的。例子如下:

list1 = [10000,20000,30000]
list2 = [10000,12000,15000]
if list1[0] is list2[0]:
    print('list1[0] 和 list2[0] 标识相同,标识为:',id(list1[0]))
else:
    print('list1[0] 和 list2[0] 标识不相同,list1[0]标识为:',id(list1[0]),'list2[0]标识为:',id(list2[0]))

输出结果为:

list1[0] 和 list2[0] 标识相同,标识为: 1375086286224

(4)元组的标识是跟着变量名的,变量名不一样,标识也不一样,上例子:

tuple1 = (10000,20000,30000)
tuple2 = (10000,12000,15000)
if tuple1[0] is tuple2[0]:
    print('tuple1[0] 和 tuple2[0] 标识相同,标识为:',id(tuple1[0]))
else:
    print('tuple1[0] 和 tuple2[0] 标识不相同,tuple1[0] 标识为:',id(tuple1[0]),'tuple2[0]标识为:',id(tuple2[0]))

输出结果为:

tuple1[0] 和 tuple2[0] 标识不相同,tuple1[0] 标识为: 1375086286384 tuple2[0]标识为: 1375086286480

(5)字典和列表是一样的,只要是列表项数值一样,那么标识也是一样的。例子如下:

dict1 = {1:10000,2:20000,3:30000}
dict2 = {1:10000,2:12000,3:15000}
if dict1[1] is tuple2[1]:
    print('dict1[1] 和 tuple2[1] 标识相同,标识为:',id(dict1[1]))
else:
    print('dict1[1] 和 tuple2[1] 标识不相同,dict1[1] 标识为:',id(dict1[1]),'tuple2[1] 标识为:',id(dict2[1]))

输出结果为:

dict1[1] 和 tuple2[1] 标识不相同,dict1[1] 标识为: 1375086286224 tuple2[1] 标识为: 1375086286224

1039Python3 运算符

== 和 is 的区别

is 判断两个对象是否为同一对象, 是通过 id 来判断的; 当两个基本类型数据(或元组)内容相同时, id 会相同, 但并不代表 a 会随 b 的改变而改变。

== 判断两个对象的内容是否相同, 是通过调用 __eq__() 来判断的。

1、当列表,元组,字典中的值都引用 a,b 时,总是返回 True,不受 a,b 值大小的影响

a=1000
b=1000
list1=[a,3,5]
list2=[b,4,5]
print(list1[0] is list2[0])
tuple1=(a,3,5)
tuple2=(b,4,5)
print(tuple1[0] is tuple2[0])
dict1={6:a,2:3,3:5}
dict2={1:b,2:4,3:7}
print(dict1[6] is dict2[1])

输出结果为:

True
True
True

2、当不引用a,b,直接用具体值来测试时,列表,字典,不受值大小影响,返回True,元组则受 256 值范围的影响,超出范围则地址改变,返回 False。

list1=[1000,3,5]
list2=[1000,4,5]
print(list1[0] is list2[0])
tuple1=(1000,3,5)
tuple2=(1000,4,5)
print(tuple1[0] is tuple2[0])
dict1={6:1000,2:3,3:5}
dict2={1:1000,2:4,3:7}
print(dict1[6] is dict2[1])

输出结果为:

True
False
True

3、当直接用列表、元组、字典本身来测试时,刚好相反,元组返回 True,列表,字典返回 False。

list1=[1000,3,5]
list2=[1000,3,5]
print(list1 is list2)
tuple1=(1000,3,5)
tuple2=(1000,3,5)
print(tuple1 is tuple2)
dict1={1:1000,2:3,3:5}
dict2={1:1000,2:3,3:5}
print(dict1 is dict2)

输出结果为:

False
True
False