Class 2¶
课前预习¶
预习思考题
- 计算机系统由哪五部分组成?
- CPU, 内存, 外部设备, 系统软件, 应用软件
- 计算机的存储模式和存储容量是怎样表示的?它们的关系如何?(信息最小单位为位、处理和存储信息的最小单位为字节)
- 存储模式:大端序和小端序
- bit和byte
- 地址编号从A至B,它占C个字节。告知A、B、C中任意二个,如何计算第三个?
- 对于一个64位系统\(C = B - A + 1\)
- 十进制和二进制、八进制、十六进制怎样相互转换?
- 十进制转成后面等进制都是先转成二进制,对于八进制是每三位二进制对应八进制的一位,每四位二进制对应十六进制的一位
- 反之,它们转成十进制就很简单,每一位\(\times\)进制数的\(k-1\)次方
- 原码、反码、补码的定义及它们如何相互转换?
- 正数:符号位为0,三种都一样
- 负数:符号位是1,原码和正数一样,反码是除了符号位0变1,1变0,补码是反码+1
1. 数字类型¶
- 计算机内部用位序列表示数据,类型为这些位序列赋予了意义。同时,类型限制了数据的范围意义。
- 整数
- 浮点数
- 复数
整数¶
二进制,八进制和十六进制¶
- 0b或0B 代表二进制
- 0o或0O 代表八进制
- 0x或0X 代表十六进制
整数可以表示很大的数¶
运算符¶
- 与之前学过的C相比,注意几个特殊运算符:
- 浮点数除法:/
- 整除:// (永远往小了取)
- 幂:**
浮点数¶
- 浮点数也是小数:
- 1.23, 3.14, -9.01
- 科学计数法:
- \(1.23\times 10^9\)就是\(1.23e9\)
- 0.000012可以写成\(1.2e-5\)
- "e"的前后都不能空,"e"的后面要整数
浮点数运算注意事项
- 浮点数运算有误差
py >>>2.1-2.0==0.1 False >>>3.8/0.7 5.428571428571429- 浮点数的整除还是浮点数(整浮点数)
py >>>3.8//0.7 5.0 >>>3.8%0.7 0.30000000000000004
复数¶
- 所谓复数,就是由实部和虚部两部分组成的数,虚部用\(j\)表示
- real方法取实部,imag方法取虚部,complex()函数用于创建一个值为real + imag*j的复数
数学库(math)¶
- math库是一个数学库,包含了很多的数学常数和数学函数
- 要使用math库,要先用"import math"语句引入math库
py >>>import math >>>math.pi 3.141592653589793 >>>math.sqrt(9) 3.0
函数和方法¶
- 方法是与数据对象关联的函数,是在相对应数据对象名字空间中定义的函数
- 用”.”记法调用的函数也称方法
- math.cos(5)
- cos()是函数,cos()也称为math对象的方法
2. 字符串¶
- 字符串是以''或""括起来的任意文本,比如'abc',"xyz"等等。请注意,''或""本身只是一种表示方式,不是字符串的一部分
多行字符串¶
- 可以用""内的'\n'来表示多行注解
转义字符¶
| 转义字符 | 描述 |
|---|---|
| \ | \ |
| \' | ' |
| \" | " |
| \a | 响铃 |
| \b | 退格 |
| \n | 换行 |
| \t | 横向制表符 |
| \r | 回车 |
| \f | 换页 |
| \ooo | 最多三位八进制数 |
| \xyy | 两位十六进制数 |
转义字符举例
字符串运算符: +, *¶
3. 布尔类型、空类型和列表¶
- 布尔类型的变量只有True、False两种值,要么是True,要么是False(请注意大小写)
- 布尔值可通过逻辑运算符和关系运算符计算出来。关系运算符是 <、 <=、 >、 >=、==和!=, 逻辑运算符是and、or和not。
逻辑运算规则¶
- 逻辑运算的对象可以是任意类型
- False、None、整数0、浮点数0.0、空字符串(“”) 以及空的容器类型等对象都作为假,其它都作为真。
- not exp 【exp代表一个表达式】
- 若exp值为真,则结果为False;否则结果为True。
- exp1 and exp2
- 若exp1值为真,则结果为exp2的值;
- 若exp1值为假,则结果为exp1的值,且不计算exp2。
- exp1 or exp2
- 若exp1值为真,则结果为exp1的值,且不计算exp2;
- 若exp1值为假,则结果为exp2的值。
注意
- 注意一种会报错的情况,
>>>'Hello'>3- 此时结果会显示
TypeError: unorderable types: str()>int()
- 此时结果会显示
空类型¶
-
如把类型用集合表示表示:
- datatype = {整数, 浮点数,复数,字符, ...}
- datatype的幂集: {{}, {}, {}, ...}
- 幂集的空集合代表: 原集合里面一个元素也不选
-
空类型只有一个值,空值。空值是Python里一个特殊的值,用None表示。None不能理解为0
py >>>bool(None) False >>>None == 0 False
运算符的优先级和结合性¶
| 优先级(1最高,8最低) | 运算符 | 描述 | 结合性 |
|---|---|---|---|
| 1 | x**y | 幂 | 从右向左 |
| 2 | +x,-x | 正,负 | |
| 3 | x*y, x/y, x%y | 乘,除,取模 | 从左向右 |
| 4 | x+y, x-y | 加,减 | 从左向右 |
| 5 | x<y, x<=y, x==y, x!=y, x>=y, x>y | 比较 | 从左向右 |
| 6 | not x | 逻辑否 | 从左向右 |
| 7 | x and y | 逻辑与 | 从左向右 |
| 8 | x or y | 逻辑或 | 从左向右 |
列表¶
- 列表可以由零个或多个元素组成,元素之间用逗号分开,整个列表被方括号所包裹
>>>empty_list = [ ] #空列列表>>>weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']>>>weekdays[2] #下标从0开始 'Wednesday'
列表运算实例¶
4. 内置转换函数¶
| 函数名 | 含义 |
|---|---|
| bool | 根据传入的参数的逻辑值创建一个新的布尔值 |
| int | 根据传入的参数创建一个新的整数 |
| float | 根据传入的参数创建一个新的浮点数 |
| complex | 根据传入参数创建一个新的复数 |
| str | 创建一个字符串 |
| ord | 返回Unicode字符对应的整数 |
| chr | 返回整数所对应的Unicode字符 |
| bin | 将整数转换成2进制字符串 |
| oct | 将整数转化成8进制数字符串 |
| hex | 将整数转换成16进制字符串 |
| list | 根据传入的参数创建一个新的列表 |
内置转换函数实例¶
int函数用法¶
ord与chr¶
bin, oct和hex¶
str函数和list函数¶
表达式¶
- 表达式是可以计算的代码片段,由常量、变量和运算符或函数按规则构成,返回运算结果
- 条件表达式实现简单分支逻辑:
条件表达式表示短路运算
a or b等价于a if a为真 else ba and b等价于b if a为真 else a
5. 语句¶
Python语言常用的有赋值、if语句和for语句。语句通常是一行一条语句。如一行中有多条语句,则用分号(;)分开,如语句太长要跨行时,可以用续行符(\)跨行表示一个语句。
赋值语句¶
赋值语句用于将名称绑定到特定对象(值),基本形式是变量=值的形式。
【例 2-1】 基本赋值语句¶
程序输出:多变量赋值¶
【例 2-2】 交换a,b值¶
链式赋值¶
赋值和运算符组合¶
赋值可与+、-、*、/等运算符组合,简化代码书写:
if语句¶
基本二分支if-else语句¶
格式:
实例:判断奇偶数【例】计算水费¶
为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5,小数部分保留2位。
条件语句的三种格式¶
| 基本的条件语句 | 有分支的条件语句 | 连缀的if-elif-else |
|---|---|---|
| if 条件: 语句块1 (书写时必须缩进) | if 条件: 语句块1 else: 语句块2 | if 条件1: 语句块1 elif 条件2: 语句块2 … elif 条件n: 语句块n else: 语句块 n+1 (if/elif/else需同一列对齐) |
基本的条件语句¶
格式:
执行逻辑:条件为True时执行语句块1,为False则跳过,继续执行后续代码。 实例:二分支的条件语句¶
执行逻辑:条件成立执行语句块1,不成立执行语句块2。 实例:比较两个数的大小
嵌套的条件语句¶
- 分支语句(块)中包含另一个if语句,称为条件语句的嵌套,书写时严格遵循缩进规则。
- else匹配规则:else总是根据它自己所处的缩进和同列的最近的那个if匹配。
实例1:
实例2:求三个数的最大值
连缀的if-elif-else¶
- 用于实现程序多分支结构,按顺序判断条件,满足某一条件则执行对应语句块,后续条件不再判断。
- 适用于分段函数、多条件互斥判断等场景。
【例】分段函数计算 \(f(x) = -1; x<0\) \(f(x) = 0; x=0\) \(f(x) = 2x; x>0\)
【练习】温度判断(条件互斥) 1. 输入温度 2. 大于5度且小于30度,输出“舒适”;大于等于30度,输出“热”;小于等于5度,输出“冷”
for语句¶
基本格式¶
执行逻辑:for后面的变量依次被赋值为列表的每个元素,每赋值一次执行一次语句块,直至穷尽列表。【例 2-5】遍历列表¶
输出:range函数¶
用于生成整数序列,常与for语句配合实现循环,格式:range(start,stop,step) - start:计数从start开始,默认是0。例如range(5)等价于range(0,5) - stop:计数到stop结束,不包括 stop。例如:list(range(0,5))是[0, 1, 2, 3, 4](无5) - step:步长,默认为1。步长可为负数,实现倒序序列。
range函数实例:
sum函数¶
用于求列表中所有元素的和,常与range函数配合实现连续整数求和。 实例:求1+2+3+...+10的和
55 【例 2-6】输入n(n>=10),求 1+2+...+n之和¶
【例 2-7】输入n(n>=5)求n!(n的阶乘)¶
列表和for的结合运用¶
- 列表元素可通过变量计算生成:
- for循环遍历range生成的序列:
列表推导式¶
- 是从一个或者多个列表快速简洁地创建列表的一种方法,又称列表解析;可将循环和条件判断结合,避免语法冗长,提高程序性能。
- 核心优势:代码简洁、执行效率高于普通for循环+列表追加。
基本格式¶
带条件的列表解析¶
在基本格式基础上增加条件判断,仅保留满足条件的元素,格式:
列表推导式的实际应用(级数求和)¶
【例】求1+1/2+...+1/20之和¶
【例】求 1-1/2+1/3-1/4+...前n项和(n>=10)¶
利用条件表达式实现符号交替:
【例 2-10】求 1-1/3+1/5-1/7+...-1/47+1/49¶
条件表达式+条件判断结合,先筛选奇数,再实现符号交替:
【例】求 6+66+666+...+666...666(n个6)¶
利用字符串拼接+类型转换生成每一项:
6. 格式化输出¶
- 输出计算结果时,常需要控制显示形式(如保留小数位数、指定宽度、进制转换等)。
format()函数是Python的内置函数,用来设置输出格式,返回值为字符串。
基本形式¶
{:xxx},描述参数的显示方式; - 普通字符串原样输出,格式限定符会被format的参数按规则替换。 实例:
格式限定符详解¶
| 格式限定符 | 输出 | 说明 |
|---|---|---|
"{:d}".format(24) | 24 | 格式化十进制整数,d代表十进制 |
"{:b}".format(45) | 101101 | 格式化二进制整数,b代表二进制 |
"{:o}".format(24) | 30 | 格式化八进制整数,o代表八进制 |
"{:x}".format(24) | 18 | 格式化十六进制整数,x代表十六进制 |
"{:5d}".format(24) | 24 | 指定宽度5,不足左侧补空格 |
"{:4d}".format(24879) | 24879 | 参数长度超过指定宽度,按实际长度输出 |
"{:.2f}".format(1.2449) | 1.24 | 保留2位小数,f代表浮点数(四舍五入) |
"{:.2e}".format(53.2453) | 5.32e+01 | 科学计数法,保留2位小数,e代表科学计数法 |
"{:6.2f}".format(1.2449) | 1.24 | 总宽度6,保留2位小数,不足左侧补空格 |
"{:9s}".format("hello") | hello | 格式化字符串,s代表字符串,默认左对齐,总宽度9 |
"{:>9s}".format("hello") | hello | 格式化字符串,>表示右对齐,总宽度9 |
多个参数格式化输出¶
- 格式限定符中可通过数字索引指定format的参数(0表示第一个参数,1表示第二个,依此类推);
- 索引可省略,按参数顺序依次匹配。
实例:
字符串的对齐格式化¶
【例】华氏-摄氏温度转换表¶
输入2个正整数lower和upper(lower<upper<100),输出取值范围为[lower,upper)、每次增加2华氏度的转换表,小数部分保留一位。 转换公式:\(C=5×(F−32)/9\)(C:摄氏温度,F:华氏温度)
*7. 位运算¶
- 位运算符用于按二进制位进行逻辑运算,操作数必须是整数;
- 运算时先将整数转换为二进制补码形式,按位运算后再转换回十进制。
位运算符详解¶
| 运算符 | 说明 | 示例(a=5=0b0101,b=17=0b10001) | 运算结果 |
|---|---|---|---|
| & | 按位与:两个相应位都为1,结果为1,否则为0(类似二进制乘法) | a & b | 1(0b00001) |
| | | 按位或:两个相应位有一个为1,结果为1,否则为0(类似二进制加法) | a | b | 21(0b10101) |
| ^ | 按位异或:两个相应位相异(一个1一个0),结果为1,否则为0 | a ^ b | 20(0b10100) |
| ~ | 按位取反:对每个二进制位取反(1变0,0变1),结果为原数取反加-1 | ~a | -6 |
| << | 左移动:各二进位全部左移若干位,高位丢弃,低位补0 | a <<2 | 20(0b10100) |
| >> | 右移动:各二进位全部右移若干位,正数高位补0,负数高位补1 | a >>2 | 1(0b0001) |
【例2-13】a & b运算的二进制表示¶
*8. 数据表示¶
基本概念¶
- 数据:数字、文字、图形图像和声音等所有计算机可处理的信息;
- 对象:Python中用对象表示所有数据,一切皆对象;
- 对象三要素:
id:对象的唯一标识,代表对象在内存中的存储位置;type:对象的类型,决定对象的取值范围和可执行的操作;value:对象的值,即对象存储的具体数据。
实例:对象数字“1”的三要素为 (id(1), type(1), 1)。
对象的可变性¶
根据对象的值是否可修改,将Python对象分为可变对象和不可变对象。 1. 可变对象:对象的值可以修改,修改值后对象的id不变(内存地址不变); 2. 不可变对象:对象的值不可修改,修改值会创建一个新的对象,原对象id不变,新对象有新的id。
实例验证:
Python常用对象的可变性: - 不可变对象:数字(int/float/complex)、字符串(str)、元组(tuple)等; - 可变对象:列表(list)、字典(dict)、集合(set)等。
作业易错题¶
Q1¶
这种写法是不对的,'a'并不能把它转化成字符串,应用str(a)
Q2¶
python中没有自增自减,故++i会被识别成两个正