python
第一章:概述
1. 概述
Python是一门跨平台、开源、免费的解释型高级动态编程语言。
① 编译:笔译,用理解原文本
② 解释:口译,逐字逐句解释,不产生新文本
Python中的可迭代对象有:列表、元组、字典、字符串;常结合for循环使用
2. 规范
(1)缩进
1、类定义、函数定义、选择结构、循环结构、with块,行尾的冒号表缩进开始。
2、python靠代码块缩进体现代码间的逻辑关系,缩进结束就表示一个代码块结束。
3、同一个级别的代码块的缩进量必须相同。
4、一般而言,以4个空格为基本缩进单位
(2)每个import语句只导入一个模块,并且按标准库、扩展库、自定义库的顺序依次导入。
(3)最好在每个类、函数定义和一段完整的功能代码之后增加一个空行,在运算符两侧各增加一个空格,逗号后面增加一个空格。
(4)尽量不要写过长的语句。
(5)虽然Python运算符有明确的优先级,但对于复杂的表达式建议在适当的
位置使用括号使得各种运算的隶属关系和顺序更加明确、清晰。
(6)注释
1、以符号#开始,表示本行#之后的内容为注释。
2、包含在一对三引号'''...'''或"""..."""之间且不属于任何语句的内容将被解释器
认为是注释。
(7)一行写多条语句可用分号做分隔符
3 导入方法
1、import模块名 [as 别名]
2、from模块名 import 对象名[ as 别名]
3、from模块名 import *
第二章:运算符、表达式与内置对象
2.1 Python常用内置对象
注意:python内置对象可直接使用,如数字、字符串、列表、sum()、map()等。
标准库对象需要导入模块才能使用,如正弦函数sin(x),随机数产生函数random( )等。
扩展库对象需要先正确安装扩展库,然后再导入使用。
2.1.1 常量与变量
1、在Python中,不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量。这一点适用于Python任意类型的对象。(字母不是常量)
2、变量需要定义(不需要事先声明变量名及其类型,直接赋值即可)
在定义变量名的时候,需要注意以下问题:
1、变量名 必须以字母或下划线开头,但以下划线开头的变量在Python中有特殊含义;
2、变量名中 不能有空格以及标点符号(括号、引号、逗号、斜线、反斜线、冒号、句问号等等);
3、能使用关键字作变量名,可以导入keyword模块后使用print(keyword.kwlist)查看所有Python关键字;
4、变量名对英文字母的 大小写敏感,例如student和Student是不同的变量。
5、不建议使用系统内置的模块名、类型名或函数名以及已导入的模块名及其成员名作变量名,这将会改变其类型和含义,可以通过dir(__builtins__)查看所有内置模块、类型和函数;
2.1.2 数字
1、Python支持任意大的数字。
2、由于精度的问题,对于实数运算可能会有一定的误差,应尽量避免在实数之间直接进行相等性测试,而应该测试两个实数是否足够接近。(eg:0.4-0.1=0.300004)
3、内置支持复数类型及其运算
4、计算机可以精确表示一个整数,但无法精确表示一个浮点数
2.1.3 字符串与字节串
1、在Python中,没有字符常量和变量的概念,只有字符串类型的常量和变量,单个字符也是字符串。使用单引号、双引号、三单引号、三双引号作为定界符(delimiter)来表示字符串,并且不同的定界符之间可以互相嵌套
2、可以使用中文作为变量名。
3、支持使用加号运算符连接字符串,还提供格式化、查找、替换、排版等
4、对str类型的字符串调用其encode()方法进行编码得到bytes字节串,对bytes字节串调用其decode()方法并指定正确的编码格式则得到str字符串
2.1.4 列表、元组、字典、集合
2.2 Python运算符与表达式
1、在Python中,单个常量或变量可以看作最简单的表达式,使用除赋值运算符之外的其他任意运算符和函数调用连接的式子也属于表达式
2、运算符优先级遵循的规则为:算术运算符优先级最高,其次是位运算符、成员测试运算符、关系运算符、逻辑运算符等,算术运算符遵循“先乘除,后加减”的基本运算原则。
3、建议编写复杂表达式时使用圆括号来明确说明其中的逻辑来提高代码可读性
2.2.1 算术运算符
(1)+运算符除了用于算术加法以外,还可以用于列表、元组、字符串的连
接,但不支持不同类型的对象之间相加或连接
(2)*运算符除了表示算术乘法,还可用于列表、元组、字符串与整数的乘
法,表示序列元素的重复,生成新的序列对象。
(3)运算符/和//在Python中分别表示算术除法和算术求整商(floor division)
(4)%运算符可以用于整数或实数的求余数运算,还可以用于字符串格式化
(5)**运算符表示幂乘:
备注:4.5//2=2.0;5//2=2(除整整运算外,都要加小数点)
2.2.2 关系运算符
注意:”Python关系运算符可以连用,操作数之间必须可比较大小
2.2.3 成员测试运算符in
成员测试运算符in用于成员测试,即测试一个对象是否为另一个对象的元素
2.2.4 集合运算符
2.2.5 逻辑运算符
1、逻辑运算符and、or、not常用来连接条件表达式构成更加复杂的条件表达式,
并且and和or具有惰性求值或逻辑短路的特点,当连接多个表达式时只计算必须
要计算的值。
2、另外要注意的是,运算符and和or并不一定会返回True或False,而是得到最后一
个被计算的表达式的值,但是运算符not一定会返回True或False
注意:逻辑运算符的结果是最后一次运行的表达式的值
3<5and5>4为true此外,非零、非空都当做true(但输出是原值)
但5or5<4因为短路特性为5
2.2.6 补充说明
1、Python不支持++和--运算符
2、Python关键字只允许用来表达特定的语义,不允许通过任何方式改变它们的含义,也不能用来做变量名、函数名或类名等
2.4、 Python常用内置函数用法精要
1、 内置函数(BIF,built-in functions)是Python内置对象类型之一,不需要额外导入任何模块即可直接使用,这些内置对象都封装在内置模块__builtins__之中,用C语言实现并且进行了大量优化,具有非常快的运行速度,推荐优先使用。
2、 使用内置函数dir()可以查看所有内置函数和内置对象:
>>> dir(__builtins__)
3、使用help(函数名)可以查看某个函数的用法。
>>> help(sum)
4.速度:内置函数>拓展库>标准库
Range函数讲解
Range(5)已经产生1,2,3,4,5但是好像放在一个容器内,使用时才可取出遍历,它返回的是range型可迭代对象,具有惰性求值的特征
2.4.1 类型转换与类型判断
1、内置函数bin()、oct()、hex()用来将整数转换为二进制、八进制和十六进制形
式,这三个函数都要求参数必须为整数。
2、内置函数int()用来将其他形式的数字转换为整数,参数可以为整数、实数、分数或合法的数字字符串。当参数为数字字符串时,还允许指定第二个参数base用来说明数字字符串的进制,base的取值应为0或2-36之间的整数,其中0表示按数字字符串隐含的进制进行转换。
3、 内置函数float()用来将其他类型数据转换为实数,complex()可以用来生成复数
3、ord()用来返回单个字符的Unicode码;chr()则用来返回Unicode编码对应的字符;str()则直接将其任意类型参数转换为字符串。
4、 list()、tuple()、dict()、set()用来把其他类型的数据转换成为列表、元组、字典、可变集合和不可变集合,或者创建空列表、空元组、空字典和空集合
2.4.2 最值与求和
1、max()、min()、sum()这三个内置函数分别用于计算列表、元组或其他包含有限个元素的可迭代对象中所有元素最大值、最小值以及所有元素之和。
2函数max()和min()支持key参数,用来指定比较大小的依据或规则,可以是函数或lambda表达式
2.4.3 基本输入输出
1、input()和print()是Python的基本输入输出函数,前者用来接收用户的键盘输入,后者用来把数据以指定的格式输出到标准控制台或指定的文件对象。不论用户输入什么内容,input()一律返回字符串对待,必要的时候可以使用内置函数int()、float()或eval()对用户输入的内容进行类型转换
2、内置函数print()用于输出信息到标准控制台或指定文件,语法格式为:print(value1, value2, ..., sep=' ', end='n', file=sys.stdout, flush=False)
2.4.4 排序与逆序
1、sorted()对列表、元组、字典、集合或其他可迭代对象进行排序并返回新列表,reversed()对可迭代对象(生成器对象和具有惰性求值特性的zip、map、filter、enumerate等类似对象除外)进行翻转(首尾交换)并返回可迭代的reversed对象
2.4.5 枚举与迭代
1、enumerate()函数用来枚举可迭代对象中的元素,返回可迭代的enumerate对象,其中每个元素都是包含索引和值的元组
2.4.6 map()、reduce()、filter()
1、内置函数map()把一个函数func依次映射到序列或迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果,map对象中每个元素是原序列中元素经过函数func处理后的结果
2、标准库functools中的函数reduce()可以将一个接收2个参数的函数以迭代累积的方式从左到右依次作用到一个序列或迭代器对象的所有元素上,并且允许指定。
3内置函数filter()将一个单参数函数作用到一个序列上,返回该序列中使得该函数返回值为True的那些元素组成的filter对象,如果指定函数为None,则返回序列中等价于True的元素。
2.4.7 range()
range()有range(stop)、range(start, stop)和range(start, stop, step)三种用法。该函
数返回具有惰性求值特点的range对象,其中包含左闭右开区间[start,end)内以step为步长的整数。参数start默认为0,step默认为1
2.4.8 zip()
zip()函数用来把多个可迭代对象中的元素压缩到一起,返回一个可迭代的
zip对象,其中每个元素都是包含原来的多个可迭代对象对应位置上元素的
元组,如同拉拉链一样
第三章:python序列结构
3.1 列表
1、列表(list)是包含若干元素的有序连续内存空间。当列表增加或删除元素时,列表对象自动进行内存的扩展或收缩,从而保证相邻元素之间没有缝隙。
2、在非尾部位置插入和删除元素时会改变该位置后面的元素在列表中的索引,这对于某些操作可能会导致意外的错误结果。除非确实有必要,否则应尽量从列表尾部进行元素的追加与删除操作。
3、在形式上,列表的所有元素放在一对方括号[]中,相邻元素之间使用逗号分隔。
4、在Python中,同一个列表中元素的数据类型可以各不相同,可以同时包含整数、实数、字符串等基本类型的元素,也可以包含列表、元组、字典、集合、函数以及其他任意对象。
3.1.1 列表创建与删除
1、使用“=”直接将一个列表赋值给变量即可创建列表对象 alist=[]
2、可以使用list()函数把元组、range对象、字符串、字典、集合或其他可迭代对象转换为列表
3、当一个列表不再使用时,可以使用del命令将其删除
3.1.2 列表元素访问
创建列表之后,可以使用整数作为下标来访问其中的元素,其中0表示第1个元素,-1表最后一个元素,支持双向索引。
3.1.3 列表常用方法
3.1.4 列表对象支持的运算符
①加号运算符:x=x+[4]
②乘号运算符:x=x*2表示列表的重复
③成员测试运算符in可用于测试列表中是否包含某个元素,查询时间随着列表长度的增加而线性增加(值in列表)
3.1.5 内置函数对列表的操作
3.1.6 列表推导式语法与应用案例(pass)
3.1.7 切片操作的强大功能
在形式上,切片使用2个冒号分隔的3个数字来完成。[start:end:step]
(1) 使用切片获取列表部分元素
与使用索引作为下标访问
列表元素的方法不同,切片操作不会因为下标越界而抛出异常,而是简单地在列表尾部截断或者返回一个空列表,代码具有更强的健壮性。
(2) 使用切片为列表增加元素
(3) 使用切片替换和修改列表中的元素
(4)使用切片删除列表中的元素
最后,x=[1,2,3];y=x;x,append(5)#无论x,y都变成[1,2,3,5]因为他们都指向[1,2,3]但x=[1,2,3];y=[1,2,3];x.append(4)则不会对y产生影响;以及x=[1,2,3],y=x,x=[4,5,6]y依然为[1,2,3]
3.2 元组:轻量级列表
从形式上,元组的所有元素放在一对圆括号中,元素之间使用逗号分隔,如果元组中只有一个元素则必须在最后增加一个逗号
3.2.1 元组创建与元素访问
3.2.2 元组与列表的异同点
①列表和元组都属于有序序列,都支持使用双向索引访问其中的元素,以及使用count()方法统计指定元素的出现次数和index()方法获取指定元素的索引,len()、map()、filter()等大量内置函数和+、in等运算符也都可以作用于列表和元组。
②元组属于不可变(immutable)序列,不可以直接修改元组中元素的值,也无法为元组增加或删除元素。
③元组没有提供append()、extend()和insert()等方法,无法向元组中添加元素;同样,元组也没有remove()和pop()方法,也不支持对元组元素进行del操作,不能从元组中删除元素。
④元组也支持切片操作,但是只能通过切片来访问元组中的元素,而不允许使用切片来修改元组中元素的值,也不支持使用切片操作来为元组增加或删除元素。
⑤Python的内部实现对元组做了大量优化,访问速度比列表更快。元组在内部实现上不允许修改其元素值,从而使得代码更加安全
3.2.3 生成器推导式(pass)
3.3 字典:反映对应关系的映射类型
①字典(dictionary)是包含若干“键:值”元素的无序可变序列,字典中的每个元素包含用冒号分隔开的“键”和“值”两部分,表示一种映射或对应关系,也称关联数组。定义字典时,每个元素的“键”和“值”之间用冒号分隔,不同元素之间用逗号分隔,所有的元素放在一对大括号“{}”中。
②字典中元素的“键”可以是Python中任意不可变数据,例如整数、实数、复数、字符串、元组等类型等可哈希数据。另外,字典中的“键”不允许重复,而“值”是可以重复的。
3.3.1 字典创建与删除
3.3.2 字典元素的访问
字典中的每个元素表示一种映射关系或对应关系,根据提供的“键”作为下标就可以访问对应的“值”,如果字典中不存在这个“键”会抛出异常。
假设counter是一个字典,用来进行词频统计,键为词,值为该词出现的次数。
如果变量a用来表示我们遍历到的每个单词,那么统计过程中可能会出现两种情况:
(1)第一种情况就是这个单词以前被统计过,也就是说在字典中有这个键,那么我们只需要用counter[a] = counter[a]+1就可以把他出现的词频加一了;
(2)但是,如果这个词以前从来没有出现过,那么通过counter[a]来访问就会出错,那么怎么办呢?
我们可以使用get方法,get()方法当中有两个参数,第一个参数表示键,第二个参数就是如果这个键没有出现的话,该返回什么值。get(a,0)有两层意思,如果a出现过,则取出a的值,如果a没出现过,则值为第二个参数0。
所以我们可以用counter[a] = counter.get(a,0)+1来进行词频统计
3.3.2 字典元素的访问
3.3.3 元素添加、修改与删除
当以指定“键”为下标为字典元素赋值时,有两种含义:
(1)若该“键”存在,则表示修改该“键”对应的值;
(2)若不存在,则表示添加一个新的“键:值”对,也就是添加一个新元素
(3)如果需要删除字典中指定的元素,可以使用del命令 del aDict['age']
3.4 集合
①集合(set)属于Python无序可变序列,使用一对大括号作为定界符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复。
②集合中只能包含数字、字符串、元组等不可变类型(或者说可哈希)的数据,而不能包含列表、字典、集合等可变类型的
3.4.1 集合对象的创建与删除
3.4.2 集合操作与运算
(1)集合元素增加与删除
①add()方法可以增加新元素,如果该元素已存在则忽略该操作。s.add(3)
②pop()方法用于随机删除并返回集合中的一个元素,如果集合为空则抛出异常;s.pop()
③remove()方法用于删除集合中的元素,如果指定元素不存在则抛出异常;s.remove(5)
④discard()用于从集合中删除一个特定元素,如果元素不在集合中则忽略该操作;s.discard(5)
(2)集合运算
3.5 序列解包
可以使用序列解包功能对多个变量同时进行赋值
第4章 程序控制结构
4.1 条件表达式
在选择和循环结构中,条件表达式的值只要不是False、0(或0.0、0j等)、空值None、空列表、空元组、空集合、空字典、空字符串、空range对象或其他空迭代对象,Python解释器均认为与True等价
(1)关系运算符
Python中的关系运算符可以连续使用,这样不仅可以减少代码量,也比较符合人类的思维方式。(print(1<2<3) 等价于1<2 and 2<3)在Python语法中,条件表达式中不允许使用赋值运算符“=”
(2)逻辑运算符
逻辑运算符and和or具有短路求值或惰性求值的特点,可能不会对所有表达式
进行求值,而是只计算必须计算的表达式的值
4.2 选择结构
①单分支选择结构
②双分支选择结构
③多分支选择结构
④嵌套的分支结构
4.2.1选择结构的嵌套
4.3 循环结构
4.3.1 for循环与while循环
①.3.2 break与continue语句
② 一旦break语句被执行,将使得break语句所属层次的循环提前结束;
② continue语句的作用是提前结束本次循环,忽略continue之后的所有语句,提前进入下一次循环