P2S chapter 2 数据类型和操作

常用内置类型 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

strlisttuplesetdict将尝试用**数组 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


  • 算术:+-*@(矩阵乘法), /(浮点除), //(整除), **(幂), %(模运算), - (一元算符), + (一元算符)
  • 关系:<<=>=>==!=
  • 赋值: +=-=*=/=//=**=%=
  • 逻辑:andornot

暂时跳过按位运算符

整除 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 amodba(ab)×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


逻辑运算参照表

XYX and YX or Ynot Xnot Y
TrueTrueTrueTrueFalseFalse
TrueFalseFalseTrueFalseTrue
FalseFalseFalseFalseTrueTrue
FalseTrueFalseTrueTrueFalse

先来定义一些函数

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() 查看对应的类型
  • 常数类型的值是不可修改的
  • 除法操作默认是浮点数除法,整除操作需要使用 //
  • 运算符之间有运算优先级,运算符作用于不同对象之间的效果是不同的
  • 在进行逻辑判断时,会使用短路求值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值