day2

发布时间 2023-11-25 18:20:37作者: Rahull

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

  • 函数是一个名字(标签),代表一串代码序列(流程、过程)

  • 函数由两个部分组成:headerbody

  • header 用于定义函数接口(函数 名称参数

  • body 包含函数所需要执行的操作

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()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 有时候会很有用
  • 如果不理解自己的代码,一定要亲眼看你的代码是怎么跑起来的