小计:
在python中,通过缩进将不同层级的语句进行划分,相比于C语言,python用:来替换();
目录
一、变量和字符串
1.变量:
定义后可直接调用,中文也可以作为变量;
不能数字开头去定义如520baby,这是语法错误。
2.字符串:(部分)
字符串的值固定,不可修改
字符串中可以用'abc'也可以用"abc",设定两种是为了避免英文单词中的符号冲突
同时也可以用转义字符\n等:
3.原始字符:
在字符串符号前面加小写的r,那么字符串中的所有符号都当作普通符号处理,转义字符失效,一个\用来连接上下两段。
但是当有大量的换行,那么就可以用到长字符,用一对"""或者一对''',前后呼应即可:
4.字符串的加法和乘法:
520不等于‘520’,字符串其实就是文本,文本与文本之间的加法是两个相拼接。而字符串的乘法就是本文本的复制。
x='520';y='1314'
print(x+y) x和y拼接
print(x*3) 将x输出3次(复制)输出:
5201314
520520520
5.比较运算符:
6.循环体
在C语言中:
for(i=0;i<5;i++)
{
printf("%d",i);
}
while(i)
{
}
而在python中:
for i in range(5):
print(i) ---->输出0~ 4
while i<n:
操作...
break:跳出一层循环体
continue:结束本次循环,继续下次循环
二、字符类型及操作
1.整型int
在python中,字符显示的位数是没有限制的
2.浮点型
不是很精确,需要引入 decimol 去实例化一个数
3.复数
x=1+2j
x.real=1.0
x.imag=2.0
4.字符操作
1.取整
3/2=1
-3/2=-2
因为整除是向下取整,取小于结果的最大整数
2.取余
7%2=1
0%2=0
2%3=2
x%y=z x=(x/y)*y+(x%y)
3.模块 divmod(x,y)
out:(x/y,x%y)
pow函数和x**y差不多,但是pow支持第三个参数
pow(x,y,z)=z**y%z
5.布尔类型
只输出True或者Flase
Fraction(0,1)表示分子为0,分母为1的分数
6.逻辑运算符
python中只有三种:
短路逻辑:和C语言的一样,为节省算力,当左边的数已经能确定结果,就不会运算右边的
优先级:
重点:not > and > or
三、流程图、思维导图--编写程序之前的准备工作
四、分支和循环
1.if else elif
第一种:
if x:
操作1
else :
操作2
第二种:
if x:
操作1
elif y :
操作2
第三种:
if x:
操作1
elif y :
操作2
else :
操作3
#这种是x,y都不成立时执行操作3
第四种:
条件成立时执行表达式 if 的判断条件 else 不成立时执行的条件
想法: 这里有点儿像C语言中的 max = a > b ? a : b;
实例:
2.if else 的嵌套
无限制
3.循环体
if x :
y
while x:
y
for
常和range()搭配,其作用是生成一个数字序列
for (i=0;i<100;i++) ==> for i in range(100):
五、列表
1.定义:
不同于C语言的数组,更像c的结构体,列表仅用一对中括号可以包括所有类型的数据
[1,2,3."AlienABJ"] -->这是一个匿名的列表
0 1 2 3 <---从左往右数的下标
-4 -3 -2 -1 <----从右往左数的下标!
a=[1,2,3."AlienABJ"]
print(a)
print( a[0] ) -->下标索引法 ==》print( a[-4] )
2.切片
就是一次性提取一段数据出来
接上:
print(a[1:3] )---->在python中,前面的一个下标为索引,输出包含索引;后一个为末下标,不包含
print( a[0:3:2] )---->第二个冒号后的数为设置的列表步进的跨度值,为负时为倒着输出
问题:
a=[1,2,3,4,'alienabj',6,7,8,9] print(a[8:-1:-1]) print(a[0:12]) 那为什么end等于12就可以打印而等于-1就不能
答案:
在 Python 中,对于切片操作
a[start:end:step]
,当 end 被设置为负数时,表示从列表的末尾位置倒数计数,而且不包括 end 位置。整个区间的范围是[start, length+end)
,其中 length 表示原序列的长度。在这个例子中,
a[8:-1:-1]
表示从下标 8 开始往下标 -1 方向逆序打印,但是由于 end 的值为负数,表示从列表末尾第一项开始往前推了一位,即最后一位,因此切片操作等价于a[8:8:-1]
,也就是无法得到任何元素,因此结果为空列表。而对于
a[0:12]
,由于 end 的值等于 12,超过了列表的最大下标 9,Python 会自动将其调整为列表的长度 10,因此实际上是在取[0, 10)
的区间,包含整个列表,因此输出结果为完整的列表。需要注意的是,对于
a[-1:]
这样的切片操作,如果 end 的值为负数且超过了列表最小下标的负数值,那么就可以取到列表的最后一个元素。例如,a[-1:]
就等价于a[9:10]
,表示取下标为 9 的元素(最后一个元素)到列表尾部的所有元素。
3.列表的操作(增、删、改、查、加、乘、嵌套)
1.增加:
append() 在列表的末尾添加元素---------缺点:一次只能添加一个元素
extend() 允许添加一个可迭代对象(序列)(必须是),新的内容也是添加在列表的末尾
insert(x,y) x-->指定待插入的下标 y-->待插入的数
remove() 删除指定的元素(如果列表中有多个待删除的元素,则删除最靠前的那一个)
2.删除: 如果列表中不存在该元素,则报错
pop() 删除指定下标的元素
clear() 直接清空整个列表
3.修改:
直接下标去改 a[5]=[9]
切片法去改一整段 a[4:]=[6,5]
4.查找:
count(x) 查找列表中x元素的个数
index(x) 查找列表中x元素的下标(如果存在多个,则输出第一个的)
index(x,start,end) 设置查找范围
以下有short()自动排序和copy()
拓展:
short()函数实现自动排序(会改变原列表)
shorted模块可以将排序赋值给新的变量
reverse()函数实现逆序,Flase为不执行
下图是short()的深层用法,key可以按照指定的规则去排序(要用到Lambal函数)
x=copy() 完整复制该列表到x
图上的两种拷贝方式都称为浅拷贝
5.加法和乘法:
与字符串的操作一样,加法拼接,乘法复制
6.嵌套:
列表就相当于数组,a[0]既表示一维列表,a[1][1]表示第二行第二列的二维数组
****二维列表的创建
方法一:
a=[[1,2,3],[4,5,6]] 二行三列
方法二:
a=[1,2,3]
for i in rang(3):
a[i]=a
is又称同一性运算符,用于检验两个变量是否指向同一个对象的运算符
****二维列表的复制(深拷贝)
a=b这样去复制一个列表并不是真正的copy,a只是得到了b的列表的索引
浅拷贝只适用于拷贝一维列表,而用此方法拷贝二维的,那么只有最外层的列表被拷贝,最里面的值拷贝了索引。
要实现深拷贝就要引入copy()函数模块。
4.列表推导式
既相当于一种更简略更直观的表达:
看图就懂
形式一:
形式二:
形式三:
形式四:
六、元组
1.定义
和列表很相似;
既能像列表容纳多种类型的变量,也拥有字符串不可变的特性;
用()来表示;
因为不能修改,所以像列表有的增删改查而元组只支持查,只能用count、index函数;
+、*和列表的一样;
2.元组的加法、乘法
同列表
3.元组的打包和解包
x,y=10,20这种同时赋值的原理就是用到了临时变量打包
七、字符串
1.46种字符串的操作函数
2.操作函数的细分
1.大小写转换
2.左中右对齐
3.查找
4.替换
5.判断
6.截取
7.拆分&拼接
拼接是join
3.格式化字符串
1. format() 的基本符号操作
2. aligen参数
3.适用于浮点和字符串
下面提到的 f\F字符串是最新的python3.6更新的,所以老版本会不兼容
八.序列
1.定义
元组、列表、字符串这些统称为序列;
根据序列的可变与否,分为可变序列和不可变序列;
可变序列:列表[ ]
不可变序列:元组()、字符串“”
在python中,每一个对象都有三个基本属性:唯一标志、类型、值;
id()函数可以查询唯一标识;
is和not is是判断关系属性是否相同;
in和not in是判断是否包含;
del函数:可删除整个列表,也可删除列表中的特定字符;
2.与序列相关的一些函数
1.列表、元组和字符串相互转换的函数
九、字典
1.定义
字典实验--摩尔密码
第一种列表法:
第二种列表法:
第三种字典法:
在映射类型的获取上,字典的效率要远远高于列表的;
2.创建一个字典
字典里的映射关系是键和值之间映射;
字典的特征就是{ }以及里面键和值之间的冒号;
不存在重复的键;
3.字典的操作(增、删、改、查、嵌套、字典推导式)
1.增
2.删
3.改
4.查
5.嵌套
6.字典推导式
十、集合
1.定义
集合中所有元素都是独一无二的;
集合是无序的;
2.创建一个集合(3种方法)
方法一:
直接花括号;
方法二:
用集合推导式;
方法三:
类型构造器set();
3.集合的交集、并集等
也可写成这种形式:
4.集合元素的添加与删除
集合分为以下:
5.可哈希
如果一个对象是可哈希的,那么要求它的哈希值在其程序的整个生命周期中保持不变;
python中,大部分可变的都是不可哈希的,而可变的相反;
集合的元素、字典的键,都要求是可哈希的(不可变对象);
列表变成集合后,速度确实快了,但是是以牺牲了存储空间为代价;
十一、函数
1.定义
好处:
1.最大程度的实现代码重用,减少代码冗余;
2.不同功能的代码进行封装、分解,从而降低结构的复杂度,提高代码的可读性;
2.创建和调用函数
def 函数名:
实现代码
和C语言规则差不多,也分实参和形参,也有return(没有加就返回一个None);
3.参数
1.位置参数
2.关键字参数
3.默认参数
python允许函数的参数在定义时被允许设置默认值,这样在调用时没有传入实参,那么将采用默认的值来代替;
4.'/'和'*'号
如上节,
/ 是限制前面的必须输入 位置参数,后面的无限制;
* 是前面无限制,后面的限制只能是 关键参数;
5.收集参数
对形参用是打包,对实参用是解包;
形如print函数,可以随意传入任意数量的参数;
**只需要在参数前加一个 * 号即可实现(相当于*将所有元素打包到元组中了);
**收集参数还可以将元素打包成字典,用 ** 就可以了;
format函数同时用了 * 和 **;
*、** 对形参用是打包,对实参用是解包;
6.参数作用域
全局作用域,局部作用域;
类似于C语言的全局变量和局部变量;
1.全局变量整个函数都可以去调用;
2.外部的不能调用内部的;
3.当内部有变量与一个全局变量重名,那么内部的优先;
4.全局变量可以在内部被访问到,但是内部不能修改它的值,除非使用 globe()语句;
4.嵌套函数
嵌套函数是闭包和装饰器的基础;
1.定义
就是def()里面再写def()。。。;
如果想要内部函数能够改变内部函数的值,那么就得使用 nonlocal;
最外层函数不能直接调用内置函数,但是可以用下面的闭包法;
2.LEGB规则
python中,变量重复或者覆盖时,都是遵循LEGB规则;
L>E>G>B;
L:局部作用域;
E:嵌套函数的外层作用域;
G:全局作用域;
B:内置作用域
3.闭包(工厂函数)
就是调用一次外层函数实现初始化,然后将内层的函数的引用赋值给外部参数,实现跨函数的调用,而初始化时外层函数的默认值用来静默存储变化后的值,这一过程就像C语言中的Staic静态变量一样;
两个关键点:
用闭包来做的小游戏:
4.装饰器
这里涉及到 语法糖,例如上面讲到的 format 可以用 f 来替换实现简化代码;
1. 这是一个简单的单纯的闭包:
2.这是不用装饰器实现同样操作:(步骤剖析)
3.这是单层装饰器:
4.这是一个函数有多个装饰器:(从下往上调用)
5.如何向装饰器里传入参数:
实现原理很简单,多加一层def()
5.lambda表达式
1.定义
lambda表达式也称为 匿名表达式,其存在意义是为了简单的表达式计算,避免麻烦的再去为变量命名。
2.代码
6.生成器
1.定义
除了使用闭包、全局变量,
但是过多的使用全局变量会污染空间,而闭包的定义相对复杂,
那么就是使用生成器;
生成器相当于一个工厂,只有调用一次才从yield处生成一次数据(调用一次执行一次)
2.原理代码
这是生成器的实现的一个实例:(斐波那契数列)
7.递归
1.定义
函数自己调用自己的过程;
2.例子
斐波那契列表--兔子繁殖问题
3.递归的应用(汉诺塔)
游戏规则:
每次只能移动一个;
只能小的在上面,大的在下面;
视频:
汉诺塔 -- 函数
8.函数文档、类型注释、内省
1.函数文档
用来说明解释该函数的文档;
help(函数名)显示的部分;
创建方法:
2.类型注释
只是在形参后面(要用:)注明期望的数据类型,但是不是强制要求,因为这只是给人看的,python不会执行任何操作;
如果想要python帮你检测输入是否否和期望,可以import Mypy第三方模块;
3.内省
python自我检测
9.高阶函数
1.定义
前面讲过 函数可以当作变量,那么当一个函数接收一个函数并将它当作参数,那么该接收函数被称为高阶函数;
前面学的map()、fitter()等只要形参里有Key的;
python中将这类函数放在了functools模块;包含了很多实用的高阶函数和装饰器;
2.functools里的reduce函数
reduce函数以前是IBF内置函数,和map和fitter一样,后来被移出;只能在functools模块调用了;
3.偏函数
偏函数模块叫做partial();
偏函数是指对指定的函数进行二次包装,通常是将现有的函数部分参数预先绑定,从而得到一个新函数,那么该函数被称为偏函数;
说白了,偏函数的作用就是将一个函数的多个参数拆分,多次进行传递;
类似于前面讲到的 闭包;
4.@wraps装饰器
之前讲的装饰器有一个副作用,当用到函数的自省的时候,会出现名字错误;如下:
十二、文件存储(操作)
1.定义
储存在硬盘中的文件;
2.文件操作函数
open()、read()、write()
3.路径处理
对路径的一些操作函数:
这一节学的不是很好,视频地址:
符号 | 作用 |
---|---|
cwd() | 获取当前目录的路径 |
is_dir() | 判断一个路径是否为文件 |
is_file() | 判断一个路径是否为文件夹 |
exists() | 检测一个路径是否存在 |
name | 获取路径的最后一个部分 |
stem | 获取文件名 |
suffix | 获取文件后缀 |
parent | 获取父级目录 |
parts | 将路径的各个部分拆分成元组 |
stat() | 查询文件或文件夹的信息 |
resolve() | 将相对路径转化为绝对路径 |
iterdir() | 获取当前路径下所有子文件和子文件夹 |
mkdir() | 创建文件夹 |
rename() | 文件或文件夹的名字 |
replace() | 替换指定的文件或文件夹 |
rmdir()、unlink() | 删除文件夹、删除文件 |
glob() | 功能强大的查找函数 |
4.with语句和上下文管理器
为文件操作提供了更优雅的实现方式;
简化了传统的open打开文件、猜哦文件、关闭文件三步骤,它会自动关闭文件;
使用with上下文的好处就是可以确保文件能够被正确释放,假如文件中途有报错,传统的方式会直接结束程序从而文件关闭失败;
5.pickle函数
用于解决永久存储python的问题;
允许将字符串、列表、字典这些以文件的形式保存;
将python对象序列化,既将其以二进制形式存储;
1.dump()写入文件
2.load()读出文件
十三、异常
1.定义
一种机制;
有异常直接跳出程序;
异常可以反映出具体问题;
2.处理异常
在代码中去捕获并且处理异常,而不是出错之后再改代码;
1.try-except
2.try-except -else
不满足异常条件就会执行else语句的内容;
3.try-except-finally
不管满不满足异常条件,最终都会执行finally的语句;
4.两种形式
或者
3.异常的嵌套
4.raise语句
5.assert语句
与raise语句一样,都是主动异常,但是
可以用它替换if判断语句哦;
6.用异常来实现C语言的goto
python中并没有C语言的goto语句,但是可以
十四、类和对象
1.定义
一个对象的静态特征称之为 属性;
一个对象所能做的事情称为 方法;
2.对象的创建
第一步:
然后如下图:
(定义的类名一般开头字母大写)