常用内置类型 BUILTIN TYPES
本节中将要见到以下基本类型:
- 整数 Integer(int)
- 浮点数 Float
- 布尔值 Boolean(bool)
- 类型 Type(“类型”也是种类型)
严格来说,Type是一种类的对象,Python是一门“面向对象友好”的语言
Python默认是双精度浮点型
print(type(2)) # int
print(type(2.2)) # float
print(type(2 < 2.2)) # bool (boolean)
print(type(type(42))) # type
以后会见到更多类型:
- 字符串 String(str)
- 列表 List
- 元组 Tuple
- 集合 Set
- 字典 Dictionary(dict,或者可以叫它映射 map)
- 复数 Complex Number(complex)
- 函数 Function
- 模块 Module
str
、list
、tuple
、set
、dict
将尝试用**数组 Array
**的方式讲授
print(type("2.2")) # str (string or text)
print(type([1,2,3])) # list
print(type((1,2,3))) # tuple
print(type({1,2})) # set
print(type({1:42})) # dict (dictionary or map)
print(type(2+3j)) # complex (complex number)
print(type(f)) # function
print(type(math)) # module
常用内置常数 BUILTIN CONSTANTS
常数区别于变量,常数的值是固定的、不可改变的
Python内置了一些常量
True
,用于表示布尔真Fasle
,用于表示布尔假None
,代表空,用于空值
math
库中的一些数学常量
- pi,数学常数 π = 3.131592... \pi=3.131592... π=3.131592...,精确到可用精度
- e,数学常数 e = 2.718281... e=2.718281... e=2.718281...,精确到可用精度
- tau,数学常数 τ = 6.283185... \tau=6.283185... τ=6.283185...,精确到可用精度(其实不常用)
- inf,浮点正无穷大,等价于
float('inf')
,负无穷大使用-math.inf
常用内置运算符 BUILTIN OPERATORS
- 算术:
+
,-
,*
,@
(矩阵乘法),/
(浮点除),//
(整除),**
(幂),%
(模运算),-
(一元算符),+
(一元算符) - 关系:
<
,<=
,>=
,>
,==
,!=
- 赋值:
+=
,-=
,*=
,/=
,//=
,**=
,%=
- 逻辑:
and
,or
,not
暂时跳过按位运算符
整除 INTEGER DIVISION(//)
/
指的是浮点数除法,它的结果是一个浮点数,例如 2/1
的结果是 2.0
5/3 # 1.6666666666666667
//
指的是整除除法,它的计算结果是整数,舍弃余数
print(" 5//3 =", ( 5//3)) # 1
print(" 2//3 =", ( 2//3)) # 0
print("-1//3 =", (-1//3)) # -1
print("-4//3 =", (-4//3)) # -2
/
是 浮点数 除法操作符
模运算或余数运算符(%)
%
代表模运算(取余),结果为商的余数
例如:5
整除 2
的结果是 2
,余数为 1
,则 5 % 2
的结果为 1
模运算的本质:
a
m
o
d
b
⟺
a
−
(
a
∣
b
)
×
b
a \mod b \iff a - (a \mid b) \times b
amodb⟺a−(a∣b)×b
定义自己的模函数:
def mod(a,b):
return a - (a//b)*b
print(41%14 == mod(41,14)) # True
print(14%41 == mod(14,41)) # True
print(-32%9 == mod(-32,9)) # True
print(32%-9 == mod(32,-9)) # True
补充资料:注意 %
与 math.fmod()
的区别,详见:Modulo operation
类型影响语义 TYPES AFFECT SEMANTICS
运算符的运作方式会受到运算数据的类型的影响
print(3 * 2) # 6
print(3 * "p2s") # p2sp2sp2s
print(3 + 2) # 5
print("Data" + "whale") # Datawhale
但数字和字符串不能直接相加
运算符优先级 OPERATOR ORDER
优先顺序与结合律 PRECEDENCE AND ASSOCIATIVITY
优先顺序 Precedence
print(2+3*4) # 14(不是 20)
print(5+4%3) # 6(不是 0)
print(2**3*4) # 32(不是 4096)
结合律 Associativity
print(5-4-3) # -2(不是 4)
print(4**3**2) # 262144(不是 4096)注意:先算3**2,再算4**9
浮点数误差
print(0.1 + 0.1 == 0.2) # True
print(0.1 + 0.1 + 0.1 == 0.3) # False!
print(0.1 + 0.1 + 0.1) # 0.30000000000000004
print((0.1 + 0.1 + 0.1) - 0.3) # 特别小,5.551115123125783e-17,不是0
短路求值 SHORT-CIRCUIT EVALUATION
逻辑运算参照表
X | Y | X and Y | X or Y | not X | not Y |
---|---|---|---|---|---|
True | True | True | True | False | False |
True | False | False | True | False | True |
False | False | False | False | True | True |
False | True | False | True | True | False |
先来定义一些函数
def yes():
return True
def no():
return False
def crash():
return 1/0 # 会崩溃!
print(no() and crash()) # 成功运行! 结果为False
print(crash() and no()) # 崩溃了!
print (yes() and crash()) # 因为上一行崩溃了,所以这行不会被运行,就是运行也会因为短路求值崩溃
再举一个例子:
def isPositive(n):
result = (n > 0)
print(n, "是不是正数?", result)
return result
def isEven(n):
result = (n % 2 == 0)
print(n, "是不是偶数?", result)
return result
print(isEven(-4) and isPositive(-4)) # 调用了两个函数
'''
-4 是不是偶数? True
-4 是不是正数? False
False
'''
print(isEven(-3) and isPositive(-3)) # 只调用了一个函数
'''
-3 是不是偶数? False
False
'''
type()
vs isinstance()
print(type("p2s") == str) # True
print(isinstance("p2s", str)) # True
任务:编写代码,判断x是不是数字
def isNumber(x):
return ((type(x) == int) or
(type(x) == float))
但是这个函数不能判断所有数字,忽略了复数
print(isNumber(1), isNumber(1.1), isNumber(1+2j), isNumber("p2s"))
# True True False False
isinstance()
比type()
更具有稳健性(Robustness)
- 这种做法更加符合
面向对象编程
中继承(inheritance)
的思想
import numbers
def isNumber(x):
return isinstance(x, numbers.Number) # 可以应对任何类型的数字
print(isNumber(1), isNumber(1.1), isNumber(1+2j), isNumber("p2s"))
# True True True False
总结
- Python 的类型系统很丰富,可以使用
type()
查看对应的类型 - 常数类型的值是不可修改的
- 除法操作默认是浮点数除法,整除操作需要使用
//
- 运算符之间有运算优先级,运算符作用于不同对象之间的效果是不同的
- 在进行逻辑判断时,会使用短路求值