Chap 2 数据类型和操作
常用内置类型
-
整数 Integer (int)
-
浮点数 Float
-
布尔值 Boolean (bool)
只有两种:True/False
- 类型 Type ("类型"也是一种类型)
print(type(2))
print(type(2.2))
print(type(2 < 2.2))
print(type(type(2)))
<class ‘int’>
<class 'float'>
<class 'bool'>
<class 'type'>
常用内置常数 Builtin Constants
常数区别于变量,常数的值是固定的、不可改变的
- True,表示布尔 真
- False,表示布尔假
- None,代表 空 ,用于空值
True = False
错误!!!不可以给常数赋值
math库中的数学常量
- pi,数学常数 Π = 3.1415926...,
- e,数学常数 e = 2.71828...
- tau,数学常数ε = 6.283185(是pai的两倍)
- inf,浮点正无穷大,等价于 float('inf'),负无穷大使用 -math.inf
常用内置运算符 Builtin Operators
-
算数:+,-,*,@(矩阵乘法),/(有小数),//(整除),**(乘方),%(模运算),- (一元算符,-1),+(一元算符)
-
关系:<,<=,>=,>,==,!=
-
赋值:+=,-=,*=,/=,//=,%=
-
逻辑:and,or,not
整除 Integer Division (//)
/是浮点数除法,它的结果是一个浮点数
//是整除除法,它的计算结果是整数,舍弃余数
模运算(%)
% 代表模运算,结果是商的余数
print(5%2)
1
a mod b ⟺ a - (a|b) * b
def mod(a,b) :
return a - (a//b) * b
print(mod(41,14))
True
取模运算是商靠负无穷取整,在被除数和除数符号不一致的情况下,取模倾向于用绝对值更大的商,而取余math.mod是数学概念,商向0靠近
类型影响语义 Types Affect Semantics
运算符的运作方式会受到运算数据的类型影响
print(3*2)
print(3*"p2s")
print(3+2)
print("Data" + "whale")
print(3 + "p2s")
6
p2sp2sp2s
5
Datawhale
不能运算
运算符优先级 Operator Order
优先顺序结合律
运算符 | 描述 |
---|---|
(expressions...) ,[expressions...] , {key: value...} , {expressions...} |
绑定或加圆括号的表达式,列表显示,字典显示,集合显示 |
x[index] , x[index:index] , x(arguments...) , x.attribute |
抽取,切片,调用,属性引用 |
await x |
await 表达式 |
** |
乘方 5 |
+x , -x , ~x |
正,负,按位非 NOT |
* , @ , / , // , % |
乘,矩阵乘,除,整除,取余 6 |
+ , - |
加和减 |
<< , >> |
移位 |
& |
按位与 AND |
^ |
按位异或 XOR |
` | ` |
in , not in , is , is not , < , <= , > , >= , != , == |
比较运算,包括成员检测和标识号检测 |
not x |
布尔逻辑非 NOT |
and |
布尔逻辑与 AND |
or |
布尔逻辑或 OR |
if -- else |
条件表达式 |
lambda |
lambda 表达式 |
:= |
赋值表达式 |
短路求值 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 |
type() vs isinstance()
print(type("p2s") == str)
print(isinstance("p2s",str))
True
True
type 是判断不了复数的
- isinstance()比type()更具有稳健性
- 这种做法更加符合面向对象编程中继承的思想
总结
- Python 的类型系统很丰富,可以使用
type()
查看对应的类型 - 常数类型的值是不可修改的
- 除法操作默认是浮点数除法,整除操作需要使用
//
- 运算符之间有运算优先级,运算符作用于不同对象之间的效果是不同的
- 在进行逻辑判断时,会使用短路求值
Chap 3 变量与函数 Variables and Functions
变量 Variables
- 变量是一个名字,它所指代的是一段数据
- 使用=来对这段数据的区域进行赋值
x = 5
print(x)
print(x*2)
5
10
- 新的值会覆盖掉旧的值
- 新值的数据类型不必与旧值相同。
y = 10
print(y - 2)
y = True
print(y)
8
True
变量和值的关系是什么
在python中,变量可以认为是一个标签
比如我们令a = 10,计算机会找到一个存储的空间,将10放进去,并且将10所在的“门牌号1”给到a,下一次使用a时,计算机会根据“门牌号1“给到a。下一次使用a时,计算机会根据”门牌号1“找到这个10,并返回给a。
如果是a = 10,b = a的情况呢
首先执行a=10,计算机会将10存储到"门牌号"是0x2的格子里,然后将0x2的门牌号0x2返回给a。a就代表0x2的地址里的内容,也就是10
执行b=a时,把0x2这个门牌号也对应给b,下一次调用b 时,会根据0x2找到对应地址的内容。
变量命名规则:
- 必须以字母或下划线_开头
- 命名可由字母、数字和下划线组成
- 大小写敏感
- 尽量避免使用保留字命名
保留字
['False', 'None', 'True', 'peg_parser', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
使用保留字会破坏一些python原本的功能
更新变量
x = 5
x+=2
print(x)
7
多变量赋值
a = b = c = 2
print(f"a = {a},b = {b},c = {c}")
a = 1,b = 2,c = 2
等式两边必须数量相等,不相等会报错
函数 Functions
-
函数是一个名字(标签),代表一串代码序列(流程、过程)
-
函数由两个部分组成:header 和 body
-
header
用于定义函数接口(函数 名称 与 参数) -
body
包含函数所需要执行的操作
header
header
用于定义函数的名称和参数
- 当函数被调用时,参数将会作为变量被提供给函数的
body
部分 - 可以提供多个参数(用逗号
,
分隔),也可以不提供参数(0 个) header
以冒号(:
)结尾,代表后面会跟着body
部分
body
body
包含函数执行的语句(statement
)
- 语句需要缩进(由 Code Style Guide 决定)
- 当语句不再缩进,函数部分结束
- 一般会使用
return
语句,来让函数返回其结果,但不是必须的
类似于用一个 =
来对多个变量赋值,函数的返回结果也可以不止一个(用逗号 ,
分隔)
- 我们使用函数名来调用函数
- 函数名后紧跟一对括号
- 括号中是我们设定的参数的值,一个不多,一个不少(这很重要)
- 函数会返回设定的
return
语句的值
可以用返回值进行计算
函数可以有任意多个参数,也可以一个都没有
多返回值
语句与表达式
对于表达式
- 它本身是值
- 它的计算结果是值
对于语句
- 它不是值
- 它不能打印
- 但它能执行一些操作
函数是用来执行一系列操作的,函数很多情况下是由语句组成的
pyhton只能print表达式,如果可以用print()输出它,它就是表达式
内置函数
类型转换
在 Python 中,所有非零的数字和非空的字符串、列表、元组等数据类型都被视为 True,只有 0、空字符串、空列表、空元组等被视为 False。
基本数学函数(不在math库中)
绝对值:abs()
返回最大值:max()
返回最小值:min()
次方运算:pow( , )
取最近的一个整数(不完全是四舍五入):round( , )
变量作用域
- 每个变量都有属于自己的作用范围
- 超出作用范围后,变量不可见
函数内部的变量具有局部作用域,它只存在于函数内部,与其他函数中的同名变量无关
局部的可以用全局的东西,但全局不可以使用局部的东西
在线调试:Online Python Tutor - visualize, debug, get AI help for Python, Java, C, C++, and JavaScript
在函数外部定义变量时,变量具有全局作用域,在任何地方都可以使用
我们应该尽量避免使用全局变量,但是在非常少的一些场合你会需要用到它
返回语句
只可以return
表达式。
一旦返回,函数立即结束!
def isPositive(x):
print("Hello!") # 会运行
return (x > 0)
print("Goodbye!") # 不会运行
print(isPositive(5)) # 输出 “Hello!” 然后返回 True
Hello!
True
没有返回语句的时候,函数会返回 None。
Print vs. Return
print()
和 return
是初学者比较容易出现的错误
def cubed(x):
print(x**3) # 这里的操作不太合适
cubed(2) # 但是似乎看起来也正常运行了
8
print(cubed(3)) # 应该也能有效(但是又返回一个 None,太怪了)
27
None
print(2*cubed(4)) # Error!
64
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType’
不支持整数和None相乘
如果想要得到函数的执行结果,需要使用return
。
只有有了执行结果, 才能与其他东西进行计算。
def cubed(x):
return (x**3) # 这样做更好
# 也可以写成return x**3
cubed(2) #似乎输出被忽略了,为什么?
# 交互模式下,return的结果会自动打印出来,脚本模式下则需要print函数才能显示。
# 例如课程演示中,在Jupyter中就正常运行,但在VS code里就被忽略了
print(cubed(3)) # 有效了!
print(2*cubed(4)) # 也是有效的!
return可以穿越if和循环,一旦执行了return,其他的if和循环不会再继续执行。
但是,return只可以结束自己所在的函数, 如果return外部有其他函数,还是需要继续执行
函数组合 Function Composition
对于嵌套的函数而言,应该最先运行最内层的函数
step7,在执行f(z+1),所以w=1+1=2
Helper Functions
编写函数是用来解决问题的。
我们还可以编写函数来存储那些经常被用到的一系列操作。
这种函数就叫做 Helper Function。
总结
- 变量只是个标签,物理设备上有啥才是重点
- 函数定义:
def
、header、body、缩进、return
- 函数是有作用域的,类似双层玻璃,里面可以看见外面,外面不能看见里面
- Helper Function 有时候会很有用
- 如果不理解自己的代码,一定要亲眼看你的代码是怎么跑起来的