前言
课后练习
用户 - antinomies-cn - HydroOJhttps://hydro.ac/d/datawhale_p2s/user/33011以下是笔记内容来源
总结
类型
- 常用类型
- 整数 Integer(int)
- 浮点数 Float (相当于C语言中的双精度浮点型)
# 与int的主要区别不在于小数点,而是离散和连续,在人工智能有重要应用
- 布尔值 Boolean(bool)
- 类型 Type(是的,“类型”也是种类型!)
- 部分类型
print(type(2)) # int
print(type(2.2)) # float
print(type(2 < 2.2)) # bool (boolean)
print(type(type(42))) # type
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
常量
- ‘常数’区别于‘变量’(将在下节课讲授),’常数‘的值是固定的、不可改变的
# 如 x=1,y=2.5,z=True 等可以进行赋值运算的称为变量,1,e 等称为常量
Python 内置了一些常量
- True,用于表示 布尔 `真`
- False,用于表示 布尔 `假`
- None,代表 `空` ,用于空值
`math` 库中的一些数学常量
- pi,数学常数 Π = 3.141592...,精确到可用精度
- e,数学常数 e = 2.718281...,精确到可用精度
- tau,数学常数 τ = 6.283185...,精确到可用精度(其实它不常用)
- inf,浮点正无穷大,等价于 float('inf'),负无穷大使用 `-math.inf`
运算符
- 这是本节的重点,因为实际编写代码中这是应用最多相对复杂的部分(个人想法)
- 算术:`+`, `-`, `*`, `@`, `/`, `//`, `**`, `%`, `-`(负号)(一元算符), `+`(正号)(一元算符)
- 关系:`<`, `<=`, `>=`, `>`, `==`, `!=`
- 赋值: `+=`, `-=`, `*=`, `/=`, `//=`, `**=`, `%=`(简化)(如c+=1即c=c+1)
- 逻辑:`and`, `or`, `not`
赋值与等号
- 赋值,即把一个常量赋给一个变量,变量就相当于这个常量的名字,可以通过变量调取这个值
a=3
print("a")
3
# "="即赋值运算符
- "=="才是实际常说的等号,用于判断等号两边的表达式是否相等,并返回"True""False"
3==4
False
5>4==4>3
True
整除(//)
‘/’得到的结果只会是浮点数,作用与实际的除法相同,如2/1=1.0,3/2=1.5
print(" 5/3 =", (5/3))
5/3 = 1.6666666666666667
‘//’得到的结果只会是整数,作用是整除,如5//2=2
print(" 5//3 =", ( 5//3)) 5//3 = 1
print(" 2//3 =", ( 2//3)) 2//3 = 0
print("-1//3 =", (-1//3)) -1//3 = -1
print("-4//3 =", (-4//3)) -4//3 = -2
模运算(取余)(%)
- `%` 代表模运算(取余),结果为商的余数
print(" 6%3 =", ( 6%3)) 6%3=0
print(" 5%3 =", ( 5%3)) 5%3=2
print(" 2%3 =", ( 2%3)) 2%3=2
print(" 0%3 =", ( 0%3)) 0%3=0
print("-4%3 =", (-4%3)) -4%3=2
print(" 3%0 =", ( 3%0)) ZeroDivisionError
Python“%”的原理
def mod(a, b):
return a - (a//b)*b
# 注意除法的除数
Python中的除法有许多有趣的应用,学会自己探索感兴趣的内容是一个好的习惯(前提是有意义)
运算
print(3 * 2) 6
print(3 * "p2s") p2sp2sp2s
print(3 + 2) 5
print("Data" + "whale") Datawhale
print(3 + "p2s") TypeError
# 一般不同数据类型之间不允许加减或乘除,“3*’p2s'”是一个特例
运算优先度
优先度是一个比较复杂的内容,需要循序渐进
- 优先顺序
每种运算符都有一个“优先度”
(“括号乘方开方乘除加减”的顺序能解决大部分情况,再了解一些常用运算符对于新手应该够用)
print(2+3*4) # 14(不是 20)
print(5+4%3) # 6(不是 0)
print(2**3*4) # 32(不是 4096)
- 结合律
相同优先度的情况下,按从左向右的顺序
print(5-4-3) # -2(不是 4)
print(4**3**2) # 262144(不是 4096)
- 还是注意浮点误差
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
短路运算
- 逻辑运算下的特殊情况(节约算力,有时避免崩溃,你Python也不是莽夫)
def yes():
return True
def no():
return False
def crash():
return 1/0 # 会崩溃!
print(no() and crash()) # 成功运行!
print(crash() and no()) # 崩溃了!
print (yes() and crash()) # 因为上一行崩溃了,所以这行不会被运行,就是运行也会因为短路求值崩溃
- 当逻辑运算已经得到答案(如 False and()或 True or()时)运算式会提前结束
我们换成 `or`,再来试试
print(yes() or crash()) # 成功运行
print(crash() or yes()) # 崩溃了
print(no() or crash()) # 因为上一行崩溃了,所以这行不会被运行,就是运行也会因为短路求值崩溃
补充
`type()` vs `isinstance()`
type()
很明显,优势在于一般情况下好用,方便,缺点在于当数据类型变多时要一一考虑,并一一匹配
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
fmod
拓展
一元算符
Python中的一元运算符是指只需要一个操作数的运算符。一元运算符有 + (正数), - (负数), ~ (整数按位取反)和 not (布尔运算 非)。
例如,如果 a = 10,那么 +a 表示 10, -a 表示 -10, ~a 表示 -11, not a 表示 False。
一元加号和减号运算符的重要用途是什么?一元加号可以将其他类型的值转换为数字,一元减号可以将正数变为负数或反之。
math.ceil
关于浮点数
(其实第一天已经有类似链接)