《Python》3小时期末速成课笔记
《Python》3小时期末速成课笔记
基本语法
- 变量与数据类型
- 表达式
变量
指向对象的值的名称就是变量,也就是一种标识符,是对内存中的存储位置的命名。
对于不同的对象,有不同的类型,得到的内存地址也不一样,通过对得到的地址进行命名得到变量名称,我们将数据存入变量,为存储的数据设置不同的数据结构。
变量的值是在不断的动态变化的,Python的变量可以不声明直接赋值使用。由于Python采用动态类型(Dynamic Type),变量可以根据赋值类型决定变量的数据类型
==在Python中,变量使用等号赋值以后会被创建,定义完成后可以直接使用==,
变量命名规则:
名称第一字符为英文字母或者下划线
名称不能使用python的关键字或保留字符
名称第一字符后可以使用英文字母、下划线和数字
名称区分大小写,单词与单词之间使用下划线连接
数据类型
Python有可以自由的改变变量的数据类型的动态类型和变量事先说明的==静态类型==,特定类型是数值数据存入相应的数据类型的变量中,相比下,动态数据类型更加灵活。
变量的数据类型有多种类型,Python3中有六个标准的数据类型:
- Numbers(数字类型)
- Strings(字符串类型)
- Lists(列表类型)
- Tuples(元组类型)
- Dictionaries(字典类型)
- Sets(集合类型)
Python内置的数字类型有==整型(Integers)、浮点型(Floating point numbers)和复数(Complex numbers)==三种,作为可以进行算术运算等的数据类型。
可以使用type()
函数来查看数据类型
type(1) |
整型(Integers)
整数类型(int)简称为整型,表示整数,包括正负的整数,如:0110、-123123456789。Python的整型是长整型,能表达的数的范围是无限的,内存足够大,就能表示足够多的数。在使用整型的数还包括其它进制,0b开始的是二进制(binary),0o开始的是八进制(octonary),0x开始的十六进制(hexadecimal),进制之间可以使用函数进行转换,使用时需要注意数值符合进制。
布尔型(Booleans)
布尔值是整型(Integers)的子类,用于逻辑判断真(True)或假(False)用数值1和0分别代表常量True和False。
在Python语言中,False可以是数值为0、对象为None或者是序列中的空字符串空列表、空元组。
浮点型(Float)
浮点型(Float)是含有小数的数值,用于实数表示,由正负号、数字和小数点组成,正号可以省略。如:-3.0、0.13。8个字节一个浮点,范围-1.8308~+1.8308的数均可以表示。
复数型(Complex)
复数类型(Complex)由实数和虚数组成,用于复数的表示,虚数部分需加上j或J,如:-1j、0j,1.0j。Python的复数类型是其他语言一般没有的。
字符串类型(Strings)
字符串(Strings),在Python 中的字符串是一种对象类型,使用str表示,通常单引号’或者双引号””包裹起来。如果不想让反斜杠发生转义,可以在字符串前加个r表示原始字符串,加号+是字符串的连接符,星号*表示复制当前的字符串,紧跟的数字为复制的次数。
字符串是字符的序列,可以按照单个字符或字符片段进行索引
字符串包括两种序号体系:
- 正向递归序列
- 反向递归序列
算数运算符
算术运算符主要是用于数字类型的数据基本运算,Python支持直接进行计算,也就是可以将python shell当计算器来使用。
运算符 | 说明 | 表达式 | 结果 |
---|---|---|---|
+ | 加 | 10 + 24 | 34 |
- | 减 | 10 -2 | 8 |
* | 乘 | 12 * 2 | 24 |
/ | 除 | 34/10 | 3.4 |
% | 取模:余数 | 34%10 | 4 |
** | 幂 | 2 ** 4 | 16 |
// | 取整数:返回商数整数部分 | 34 // 10 | 3 |
10 + 24 |
逻辑运算符
逻辑运算符为and(与)、or(或)、not(非)用于逻辑运算判断表达式的True或者False,通常与流程控制一起使用
and
:表达式一边有False 就会返回False,当两边都是True时返True .or
:表达式一边True 就会返回 True,当两边都是False 时返回 False。not
:表达式取反,返回值与原值相反。
复合赋值运算符
复合赋值运算符时将一个变量参与运算的运算结果赋值给改变量,即a参加了该运算,运算完成后结果赋值给a
运算符 | 说明 | 表达式 | 等效表达式 |
---|---|---|---|
= | 直接赋值 | x = y + z | x = y + z |
+= | 加法赋值 | x += y | x = x + y |
-= | 减法赋值 | x -= y | x = x - y |
*= | 乘法赋值 | x *= y | x = x * y |
/= | 除法赋值 | x /= y | x = x / y |
%= | 取模赋值 | x %= y | x = x % y |
**= | 幂赋值 | x **= y | x = x ** y |
//= | 整除赋值 | x //= y | x = x // y |
算数运算符优先级
由数值、变量、运算符组合的表达式和数学上相同,是有运算符优先级的,优先级高的运算符先进行运算同级运算符,**自左向右运算,遵从小括号优先原则。等号的同级运算时例外,一般都是自右向左进行运算**。
组合数组类型
- 列表
- 元组
- 字符串
- 字典
- 集合
组合数据类型
- 序列类型
- 列表 list
- 元组 tuple
- 字符串 string
- **序列类型**是一个元素向量,元素之间存在先后关系,通过索引访问,元素之间不排他
- 集合类型:集合 set
- **集合类型**是一个元素集合,元素之间无序,相同元素在集合中唯一
- 映射类型:字典dict
- **映射类型**是“键-值”数据项的组合,每个元素是一个键值对
**组合数据类型能够将多个同类型或不同类型的数据组织起,通过单一的表示使数据操作更有序、更容易**。
序列
Python中“序列”的概念
- 在Python中,序列是最基本的数据结构;
- 序列中的每个元素都被分配一个数字,以表明它的位置,并称之为==索引==。其中,第一个索引值为0,第二个索引值为1,依此类推。
- Python中的序列都可以进行==索引、切片、加、乘、检查成员==等操作。为了使用方便Python还内建了确定序列的长度len()以及确定最大max()和最小min()元素的方法。
- Python中最常用的序列是==列表、元组和字符串==。
列表
列表的概念
- List用来存储任意大小的数据集合。
- 一个列表中可以包含任意个数据,每个数据称为元素。
- 列表是Python中使用最频繁的数据类型,它是放在方括号([])内、用逗号分隔的一系列元素。
- 列表中元素的==类型可以不同==,它支持数字、字符串甚至可以包含列表。换言之,列表允许嵌套。
list1 # 创建一个空列表 |
列表的内置函数
函数 | 说明 |
---|---|
len(listname) |
返回列表的元素数量 |
max(listname) |
返回列表中元素的最大值 |
min(listname) |
返回列表中元素的最小值 |
list(tuple) |
将元素转换为列表 |
函数 | 说明 |
---|---|
lsit.append(obj) | 在列表末尾添加新的对象 |
list.count(obj) | 统计某个元素在列表中出现的次数 |
list.extend(seq) | 在列表末尾一次性追加另一个序列的多个值 |
list.index(obj) | 从列表中找出某个值第一个匹配项的索引位置 |
list.insert(index,obj) | 将对象插入列表 |
list.pop(obj=list[-1]) | 移除列表中的一个元素(默认是最后一个),并返回该元素的值 |
list.remove(obj) | 移除列表中某个值的第一个匹配项 |
list.reverse() | 将列表中的元素反向 |
lsit.sort([func]) | 对原列表进行排序 |
list.clear() | 清空列表 |
list.copy() | 复制列表 |
元组
Python 的元组与列表相似,不同之处在于==元组的元素是不能修改的==。
当创建不同类型的数据时,推荐使用元组来创建
元组的创建
# 在括号中添加元素,并用逗号分隔元素 |
元组的访问
使用下标索引来访问元组中的值
'Google', 'Runoob', 1997, 2017) tup1 = ( |
元组的修改
元素中的元素值是**不允许修改**的,但可以对元组进行连接拼接组合
12,34.55) tup1 = ( |
元组的删除
元素中的元素值是**不允许删除**的,但可以使用del语句删除整个元组
'Google', 'Runoob', 1997, 2017) tup1 = ( |
元组的内置函数
方法 | 说明 |
---|---|
len(tuple) | 个数 |
max(tuple) | 最大值 |
min(tuple) | 最小值 |
tuple(seq) | 将列表转换为元组 |
元组和列表都属于序列
列表为==可变序列==,可以**随意修改列表汇总的元素值,增加、删除**元素;
元组为==不可变序列==,元组中的元素**一旦定义就不允许进行增、删和替换操作。元组的访问和处理速度比列表更快。如果所需要定义的序列内容不会进行修改**,那么最好使用元组。另外,使用元组也可以使元素无法被修改,从而使代码更安全。
字符串
字符串的创建
var1 = 'hello' |
字符串中值的访问
Python不支持字符类型。即使是单个字符,Python也将其视为一个字符串来使用访问子串,实际上就是用方括号来截取字符串,有的文献称之为“切片运算”
str1 = '0123456789' |
python中的转义字符
当字符串中需要使用特殊字符时,可在特殊字符前冠以反斜杠(),形成转义字符。Python的转义字符如下表所示。
转义字符 | 描述 |
---|---|
\(在行尾时) |
续行符 |
\\ |
反斜杠符号 |
\' |
单引号 |
\" |
双引号 |
\b |
退格 |
\000 |
空 |
\n |
换行 |
\r |
回车 |
字符串内置函数
方法 | 描述 |
---|---|
capitalize() |
将字符串的第一个字符转换为大写 |
center(width,fillchar) |
返回一个指定的宽度width居中的字符串,fillchar为填充的字符串,默认是空格 |
lower() |
转换字符串中所有大写字母为小写 |
upper() |
转换字符串中所有小写字母为大写 |
swapcase() |
将字符串中大写转换为小写,小写转换为大写 |
find(str, beg=0,end=len(string)) |
检测str是否包含在字符串中,如果用beg和end指定范围,则检查是否包含在指定的范围内,如果是,则返回开始的索引值,否则返回-1 |
index(str,beg=0,end=len(string)) |
跟find()方法一样,只不过如果str不在字符串中,则会报一个异常。 |
count(str,beg=0,end=len(string)) |
返回 str 在 string 里面出现的次数,如果指定 beg 或者 end,则返回指定范围内 str 出现的次数。 |
len(string) |
返回字符串长度 |
rstrip() |
删除字符串末尾的空格 |
lstrip() |
截掉字符串左边的空格 |
字典
字典的观念
允许查找与任意键相关联的信息的集合称为“映射”。Python的字典是映射。
Python的字典是一种可变容器模型,且可以存储任意类型对象。
字典的创建
字典中的每个项都是“==键/值对==”,“键”与“值”之间用冒号(==:==)分割,而每个“对”之间用逗号(==,==)分割,整个字典放在花括号({}
)中。
d = {key1: value1, key2: value2, key3: value3} |
对每个键/值对而言,==键必须是唯一的,且不可变==,如字符串、数字或元组均可作为键,但列表不可以。值可以取任何数据类型,但值可以改变。
使用dict类的构造函数dict()创造
dict1 = dict({"Tom": '123456789', 'Amy': '23456789'}) |
字典元素的访问
以“键”通过下表来返回“值”
dict2 = {'香蕉':20, '苹果':50} |
元素在字典中的排列顺序是随机的,与输入的顺序不一定相同,所以不能用位置作为下标。
访问字典元素时,如果输入的“键”不存在,也会产生错误。
字典元素的添加与修改
dict1 = {'Name': 'Taichi', 'Age': 7, 'Class': 'First'} |
字典的遍历
使用for循环可以遍历一个字典。遍历得到的是字典的==关键字==。
为遍历出整个字典对象,在for循环体中,使用==以“关键字”作为下标来返回“值”==。
dict1 = {'Name': 'Taichi', 'Age': 7, 'Class': 'First'} |
字典键的特性
字典的“**值”可以取任何Python对象,没有任何限制,它既可以是标准对象,也可以是用户自己定义的对象,但“键**”不行。
关于字典的键,有两点必须牢记:
- 同一个键不得出现两次。创建字典时如果一个值被赋值两次,则后一个值被记住
- 键必须不可变。可以用数字、字符串或元组做键,用列表则不行
字典的内置函数
len(dict)
# 计算字典元素个数,即键的总数
dict1 = {'Name': 'Taichi', 'Age': 7, 'Class': 'First'}
len(dict1) # 3str(dict)
dict2 = {'Name': 'Taichi', 'Age': 7, 'Class': 'First'}
str(dict2) # 输出字典,以可打印的字符串表示
"{'Name': 'Taichi', 'Age': 7, 'Class': 'First'}"type(variable)
# 返回输入的遍历类型,如果变量是字典就返回字典类型
dict1 = {'Name': 'Taichi', 'Age': 7, 'Class': 'First'}
type(dict1) # <class 'dict'>
函数 | 描述 |
---|---|
dict.clear() | 删除字典内所有元素 |
dict.copy() | 返回一个字典的浅复制 |
dict.fromkeys(seq[,value]) | 创建一个新字典,以序列seq中的元素作为字典的键,value为字典所有键对应的初始值 |
def.get(key, default=None) | 反之指定键的值,如果值不存在字典返回 default |
key in dict (in 操作数) | 如果键在字典dict里,则返回 True,否则返回 False |
dict.items() | 以列表返回可遍历的(键,值)元组数组 |
dict.keys() | 返回所有的键 |
dict.values() | 返回一个迭代器,可以使用list() 来转换为列表,列表为字典中的所有值 |
dict.update(dict2) | 把字典dict的键/值对 更新到dict里 |
集合
集合的概念
集合(set)是Python的基本数据类型,把==不同的元素==组合在一起便形成了集合。组成一个集合的成员称作该集合的元素(element)。
集合分为两类:**可变集合(set),不可变集合(frozenset)**。
可变集合(set)可添加和删除元素,是非可哈希的,不能用作字典的键,也不能做其他集合的元素。
不可变集合(frozenset)与之相反。
创建
可变集合的创建
set1 = {'apple', 'banana', 'orange'} |
==在一个集合中不能有相同的元素。相同的元素会被自动删除==
不可变集合创建
创建不可变集合应使用 frozenset()
函数,不能使用大括号
不可变集合不能被修改
集合的遍历
因集合是无序的,不能使用索引来访问集合中的元素。可使用for循环可以遍历一个集合。
set1 = {'apple', 'banana', 'orange'} |
- 元素访问的顺序依赖于它们在内部是如何存储的。输出中元素的顺序与创建集合时的顺序是不同的
- 无序使得可以实现高效的集合操作
增加和删除集合元素
- 如果要增加的元素**没包含在集合中,它会被增加到集合中并且集合的大小加1;**
- 如果要增加的元素**包含在集合中,则添加操作不会有效果**,集合没有被修改。
- 如果元素存在,
discard
方法会删除它,但是如果元素不是集合成员时,则不会有效果。 clear
方法删除集合中的所有元素,留下一个空集合
set1 = {'apple', 'banana', 'orange'} |
集合运算
交集操作符“&
”有一个与之等价的方法intersection()
并集操作符“|
”有一个与之等价的方法union()
差集操作符“-
”与之等价的方法是difference()
a.difference(b)
: 返回一个包含那些属于集合a但不属于集合b的元素的新集合
set([1,2,3,4]) set1 = |
内置函数
- len():返回集合元素的个数
- set()、frozenset():创建集合
- 适合所有集合的方法(见下表)
方法 | 操作 |
---|---|
s.issubset(t) | 如果s是t的子集,则返回True,否则返回False |
s.issuperset(t) | 如果s是t的超集,则返回True,否则返回False |
s.union(t) | 返回s和t的并集 |
s.intersection(t) | 返回s和t的交集 |
s.difference(t) | s - t,把s中所有的t减去 |
s.symmetric_difference(t) | s和t并集,然后删除交集 |
s.copy() | s的浅复制 |
仅适合可变集合的方法
方法名称 | 操作 |
---|---|
s.update(t) | 用t中的元素修改s,即s现在包含s或t的成员。 |
s.intersection_updata(t) | s中的成员是共同属于s和t中的元素。 |
s.difference_updata(t) | s中的成员是属于s但不包含在t中的元素。 |
s.symmetric_difference_updata(t) | s中的成员更新为那些包含在s或t中,但不是s和t共有的元素。 |
s.add(obj) | 在集合s中添加对象obj |
s.remove(obj) | 从集合s中删除对象obj,如果obj不是集合s中的元素(obj not in s)将引发KeyError错误。 |
s.discard(obj) | 如果obj是集合s中的元素,从集合s中删除对象obj。 |
s.pop() | 删除集合s中的任意一个对象,并返回它。 |
s.clear() | 删除集合s中的所有元素。 |
集合和列表都可以存储多个元素,两者不同:
- 集合**不能存储重复的元素**
- 集合中的元素是**无序的,不能通过下标**运算符来访问元素
- 集合还支持如何判断集合关系以及四种集合运算
- **列表的存储方式为顺序存储,而集合采用的存储方式更加复杂。这使得在执行查找元素和删除元素的操作时,使用集合比使用列表的效率高**。
【例】编写程序,统计文本中只出现一次的单词(不考虑文本中的特殊字符,默认英文单词均为小写)
text = input('Please input a text here:') |
控制流程
- 选择结构控制
- 循环结构控制
选择结构-if语句
单分支
if bool: |
双分支
if bool: |
多分支
if bool1: |
练习题
例:体型判断。按“体指数”对肥胖程度进行划分
体指数t=体重w/(身高h)2
(w 单位为公斤,h单位为米)
# BMI=体重÷身高的平方 |
if三元运算符
X if bool else Y
,当bool为True的时候,返回X,False 返回 Y
x,y = 4,6 |
循环结构控制
while语句
while True: |
for语句
# 1~100 累加和 |
break和continue
break 退出循环(终止循环)
continue 退出本次循环
return 函数体结束
函数与模块
- 函数的概述
- 函数的参数和返回值
- 函数的调用
- 模块
函数的定义
一个程序可以按不同功能实现拆分成不同模块,而函数就是能实现某一部分功能的代码块。
Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号内参数和冒号(:),然后在缩进块中编写函数体,函数的返回值用return语句返回。
注意:==Python是靠缩进块来标明函数的作用域范围的,缩进块内是函数体,这和其它高级编程语言是有区别的,比如:C/C++/iavaR语言大括号{}内的是函数体==。
def max(num1: int, num2: int) -> int: |
全局变量
在函数外面定义的变量称为全局变量。全局变量的作用域在整个代码段(文件、块),在整个程序代码中都能被访问到。在函数内部可以去访问全局变量。如下所示代码:
global_var = 30 |
如果要在**函数内部去修改全局变量的值**,并使之在整个程序生效,采用关键字global
即可。
局部变量
在函数内部定义的参数和变量称为局部变量,超出了这个函数的作用域局部变量是无效的,它的作用域仅在函数内部。如下所示代码:
# 定义一个全局变量 |
一个python表达式可以访问局部命名空间和全局命名空间里的变量。如果**一个局部变量和一个全局变量==重名==,则局部变量会覆盖全局变量**。
x = 1 # 全局变量 |
函数的参数和返回值
参数传递的方式
在Python中,将函数参数分为三类:位置参数、**可变参数、关键字参数**。
位置参数
直接传入**参数数据即可**,如果有多个参数,位置先后顺序不能改变
可变参数
有2种传递方式:
1是直接传入参数值;
2是先封装成列表(list)或元组(tuple),再在封装后的列表或元组前面添加一个星号“*”传入。
(3)关键字参数
有2种传递方式:
1是直接传入参数值;
2是可以先将参数封装成字典(dict),再在封装后的字典前添加2个星号“**”传入
# 位置参数和关键字参数 |
函数返回值
没有
return
指定返回值,则返回的是一个None
对象
return ['taichi', 10]
,返回一个数组
return 'taichi',10
,返回的是一个tuple
函数的调用
函数的调用方法
要调用一个函数,需要知道**函数的名称和参数**。
函数分为**自定义函数和内置函数**。
自定义函数需要先定义再调用,内置函数直接调用,有的内置函数是在特定的模块下,这时需要用import命令导入模块后再调用
调用函数的时候,如果传入的**参数数量不对,会报TypeError
的错误,同时Python会明确地告诉你参数的个数。如果传入的参数数量是对的,但参数类型不能被函数所接受**,也会报TypeError
的错误,同时给出错误信息。
函数名其实就是指向一个函数对象的引用,可以把函数名赋给一个变量。
嵌套调用
**允许在函数内部创建另一个函数,这种函数叫内嵌函数或者内部函数。**内嵌函数的作用域在其内部,如果内嵌函数的作用域超出了这个范围就不起作用。如下所示代码:
def outer_function(): |
递归调用
函数调用自身的行为是递归。
递归的2个条件:调用函数自身,设置了正确的返回条件。递归即是有进去必须有回来
Python默认递归深度100层(Python限制)。
设置递归的深度的系统函数是:sys.setrecursionlimit(stepcoun)
。参数:stepcount
设置递归的深度。
递归有危险性:消耗时间和空间,因为递归是基于弹栈和出栈操作。递归忘掉返回使程序崩溃,消耗掉所有内存。
lambda 函数(匿名函数)
lambda函数是一个只用一行就能解决问题的函数。
lambda arg1,arg2,...ageN : experssion |
- arg1、arg2等参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现。
- 匿名函数的参数规则、作用域关系与有名函数是一样的。
- 表达式该表达式必须要有一个返回值,该值直接返回,**无需return**语句
- ==表达式不能包含循环、return,可以包含if… else …==
练习
# 自定义函数1 |
lambda的特点
lambda
只是一个表达式,函数体比def简单很多。lambda
的主体是一个表达式,**而不是一个代码块,因而仅仅能在lambda表达式中封装有限的逻辑**。lambda
函数拥有自己的命名空间,且==不能访问自有参数列表之外或全局命名空间里的参数==。
map()函数
map()函数是一个内置的高阶函数。
map(function, iterable,...) |
- 参数1:传入**一个函数**,这个函数可以是内置的,也可 以是自己定义,也可以是匿名函数
- 参数2:是**可迭代对象**,如列表,字符串等等。
- 该函数返回一个map对象,是个迭代器。
- 注意:不是列表==不能直接输出,可以通过for循环或者Iist()来显示==。
map函数==将iterable中的每一个元素执行一遍 function==,结果以map对象的形式返回。注意,iterable
后面还有省略号,即可以传多个iterable ,如果有额外的iterable参数,并行的从这些参数中取元素,并调用fnction。
def square(x): |
模块
模块与程序
我们写的代码保存的以.py结尾的Python文件就是一个独立的模块,模块包含了对象定义和语句。
模块导入方法
要导入系统模块或者已经定义好的模块,有三种方法:
import 模块名
from 模块名 import 函数名
导入模块中所有的函数from 模块名 import *
import 模块名 as 别名
==注意事项==
- 不管你执行了多少次
import
,一个模块只会被导入一次 - 导入模块后,我们就可以用模块名称这个变量访问模块的函数所有功能
异常与文件操作
- Python的文件操作
- Python异常处理机制
文件操作
打开文件
Python使用内置函数open()打开文件,创建file对象。在系统中,只有存在file对象后,用户才能对文件进行相应的操作。
file object = open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) |
文件名(name)为必选参数,
模式(mode)和缓冲(buffering)参数是可选的。
该函数返回一个文件对象。
file
:要打开的文件的路径。mode
:文件打开模式,默认为读模式(‘r’)。常见模式包括:'r'
:只读模式。文件必须存在。'w'
:写入模式。如果文件不存在则创建文件,如果文件存在则**清空文件内容**。'a'
:追加模式。如果文件不存在则创建文件,如果文件存在则在文件**末尾追加内容**。'b'
:二进制模式。可以与其他模式结合使用(如'rb'
表示二进制读)。't'
:文本模式。默认模式。'+'
:读写模式。可以与其他模式结合使用(如'r+'
表示读写模式)。
异常处理
try: |
在文件读写过程中,可能会出现异常,例如文件不存在或权限错误。