了解到人想要与计算机交流需要用到编程语言,为什么不直接用自然语言呢?因为自然语言非常复杂。但是因为计算机只懂01010机器语言,所以直接用编程语言同计算机交流,计算机不懂。人与计算机之间就需要有一个翻译官,即编译器(解释器),它可以将编程语言翻译成机器语言。通过这样一个过程人就可以让计算机去做一些事情。
字面量(被写在代码中的固定值):Python的6种数据类型
PS: 问题输出整数、浮点数和字符串时,print("666"),这种写法是错误的,输出的是字符串了, 应写为print(666);
注释
单行注释 # ***
多行注释 一对三引号"""***""""
变量
变量的定义格式:变量名=变量值;
print格式:print(输出值,输出值,输出值,end=" '');
数据类型
如何查看数据类型:type();既可以查看变量也可以查看字面量类型;
数据类型转换
为什么需要转换,举例:1、从文件读取的数字默认为是字符串,如果需要数字类型则要转换
2、input()语句默认输出是字符串类型
3、将数字转换成字符串用以输出到外部系统;
PS:字符串必须是数字才能转化为整数;浮点数转化为整数导致去精度;
标识符命名规则
数字字母下划线(数字不能写在开头)
运算符(算术运算符和赋值运算符)
算术运算符:加减乘除,%取余;/除;//整除;**平方
赋值运算符:+=;*=;/=;%=;//=;**=;
字符串扩展
字符串的三种定义方法
单引号、双引号、三引号(类似多行注释,支持换行)
引号的嵌套:单引号内可以写双引号字符串;双引号内可以写单引号字符串;使用\进行转义
字符串的拼接
1.使用“+”完成字符串的拼接;
2.注意,拼接操作只适用于字符串字面量,不适合别的字面量;
字符串格式化
语法:“%占位符”,%变量
PS:可以理解为用百分号去占了一个位置,后面的%内容放在占位的地方
常用的占位符有三个:字符串%s;整数:%d;浮点数:%f;
举例:print("%s的年龄是%d岁,现在有%f元钱"%(s,d,f))
格式化的精度控制
使用m.n的方法,其中m控制数字宽度(包括小数点和小数部分);.n控制小数部分位数(会四舍五入)
例:对5.13%7.3f:[][][]5.130
字符串格式化二
语法:f''{变量}{变量}"
特点:1.不理会类型;2.不做精度控制;
表达式的格式化
在无需用变量储存数据时,可以直接输出表达式,如:print("花费了%d元钱"%(a*b))
数据输入(input语句)
input()函数,用一个变量接受,然后输出这个变量;input(“这里可以写提示信息”)
PS:input()函数默认从键盘接收字符串,如果不希望输出字符串类型可以考虑类型转换
Python判断语句
布尔类型和比较运算符
布尔类型字面量True表示真,False表示假;除了可以定义布尔类型外,还可以通过比较运算得到布尔类型
PS:!=和=可以用于字符串的比较
If语句的基本格式
- if 要判断的条件:
条件成立时要做的事情
- if 要判断的条件:
条件成立时要做的事情
else:
不满足条件时需要做的事情
if-elif-else
- elif可以有多个的
- 判断是互斥且有序的,上一个满足后面的就不需要判断了
- 可以在条件判断中,直接写input语句,这样会节省代码量
判断语句嵌套
- 生成随机数字:导入包import random num=random.randint(1,10)PS:包含1和10
- PS:选中(取消)多行注释快捷键:ctrl+/
Python循环语句
基础语法:
while 条件:
条件满足时执行的操作
PS:一定要设置循环终止条件
while循环的嵌套应用
语法:while 条件1:
条件1满足需要做的事情
while 条件2:
条件2满足需要做的事情
案例:99乘法表
PS:每一个print语句都是自动换行的,制表符 \t 等价于Tab键,可以让多行字符串进行对齐
for循环的基础语法
- while与for之间的区别:while循环条件是自定义的,程序员自行控制循环条件
for循环是一种轮询机制,是对一批内容进行“逐个处理”
- 语法:
for 临时变量 in 待处理数据集:
满足循环条件是执行的代码
ps(把待处理数据集中数据放到临时变量中,for循环能循环多少次只取决于待处理数据集中有多少份数据供你处理)
for循环练习案例:数一数有多少个a name="itheima is a brand of itcast"
for循环的range语句(range语句可以生成数字序列)
for 临时变量 in 待处理数据集(ps:待处理数据严格来称之为序列类型,序列:内容可以一个一个依次取出的一种类型,如:字符串、列表、元组等):
- 语法1:range(num) 作用:获取一个从0开始到num结束(不包含num)的数字序列
- eg range(5)可取 【0,1,2,3,4】
- 语法2: range(num1,num2) 作用:获取一个从num1开始到num2(不包括num2)的数字序列
- 语法3: range(num1,num2,step)
- eg: range(5,10,2)=【5,7,9】
range练习:定义一个数字变量num,并使用range()语句,获取从1到num的序列,使用for循环遍历它,在遍历过程中统计有多 少 偶数出现
循环中断continue 和break关键字控制循环
- continue 暂时跳过某次循环,直接进行下一次
- break退出循环,不再继续
函数
函数定义
- 语法:def 函数名(传入参数):
函数体
return 返回值
PS:传入参数和返回值是可以省略的,换行符\n
函数的参数
传入参数功能:在函数进行计算时,接受外部(调用时)提供的数据
函数的返回值
- 返回值需要有一个参数去接收
PS:函数体遇到return后,后面的代码就不再执行了
- 函数的返回值none类型:无返回值的函数,实际上返回的是none
- none作用:函数返回值;用在if判断中,none等价于false;用于声明无内容的变量
函数的说明文档
在函数体内写三行注释
变量在函数中的作用域
- 局部变量
在局部变量前面加上global变量名,则该局部变量变成了全局变量(PS:这个知识点看似不重要其实非常重要eg:银行账户)
并且必须严格是global变量名,不能为了省事global表达式
- 全局变量
数据容器
数据容器是什么
- 类似数组,容纳多份数据
- 一种可以容纳多份数据的数据类型,容纳的每一份数据称为1个元素,每一个元素,可以是任意类型的数据,如:字符串、数字、布尔类型
- 数据容器根据特点的不同,如:
- 是否支持重复元素
- 是否支持修改
- 是否有序等分为了列表、元组、字符串、集合、字典
数据容器(List)
基本语法
- [元素1,元素2,...]
- 变量名称=[元素1,元素2,......]
- 定义空列表
- 变量名称=[]
- 变量名称=list()
PS:列表可以存储不同的数据类型,且支持列表嵌套
列表的下标索引
- 语法:列表名[下标] 作用:从0开始,从左到右
- 或者反向索引,从-1开始从右向左
- 嵌套列表的下标索引:列表名[1层下标][2层下标]
列表的常用操作(方法)
- 列表的查询功能
- 查找某元素的下标 语法:列表.index(元素) ,如果查找的元素不存在,系统报错
- 修改特定位置(索引)的元素值 语法:列表[下标]=想要修改成的值
- 插入元素 语法:列表.insert(下标,待插入元素值) ,在指定位置上插入指定元素
- 追加元素(将新元素加入到列表的尾部) 语法:列表.append(元素)
- 列表尾部加入一批元素 语法:list.extend(其它数据容器)
- 删除列表元素 语法1:del 列表名[下标] 语法2:列表.pop(下标)
- 删除某元素在列表中的第一个匹配项 语法:列表.remove(元素)
- 清空列表内容 语法:列表.clear()
- 统计某元素在列表的数量 语法:列表.count(元素)
- 统计列表内有多少元素 语法:len(列表)
- 列表的遍历
- while循环遍历 语法 index=0 while index<len(列表): 元素=列表[index] 对元素进行的处理 index+=1
- for循环遍历 语法: for 临时变量 in 数据容器:对临时变量的处理
数据容器(元组)
- 为什么使用元组?因为列表可以修改元组不可以修改
- 元组定义
- (元素,元素,...,元素)
- 变量名称=(元素1,元素2,...)
- 定义空元组:变量名称=();变量名=tuple()
- 元组也可以嵌套
- 元组的相关操作
- 下标索引取出内容
- index(元素)查找元素索引
- count(元素)统计元素出现次数
- len(元组名)统计元组元素数量
数据容器(字符串)
- 同元组一样,字符串是无法修改的数据容器;只可以存储字符串类型数据
- index()方法
- str=" "
字符串的替换
- 语法:字符串.replace(字符串1,字符串2)
- 功能:将字符串内全部字符串1替换成字符串2,注意:不是修改字符串本身,而是得到一个新的字符串
字符串的分割
- 语法:字符串.split(分割字符串)
- 功能:按照指定的分割字符串,将字符串划分为多个字符串,并存入到列表对象;注意:字符串本身不变化,只是得到一个列表对象
字符串的规整操作
- 去前后空格以及回车符
- 语法:字符串.strip() ; 字符串.strip(字符串)
统计字符串中某字符串的出现次数
- 语法:字符串.count(某字符串)
数据容器(序列)的切片
- 序列:内容连续,有序,可使用下标索引的数据容器,如:列表,元组,字符串
- 切片:从一个序列中,取出一个子序列
- 语法:序列[起始下标(可省略):(冒号不可省略)结束下标(不包含,可省略):(可省略)步长(可省略)]
- PS:当步数用负数表示,意味着反向取(注意起始、结束下标也要反向标记);此操作不影响原序列
- PS:str[::-1] 作用:将str字符串逆转
集合的定义和操作
- 为什么用到集合?因为列表、元组、字符串支持元素重复、有序;而集合最主要的特点是不支持元素重复(自带去重功能),并且内容无序
- 语法:{元素,元素,......};变量名称={元素,元素,......};空集合:变量名称=set()
- PS:集合是无序的,所以不支持下标索引,但是和列表一样,是允许修改的
- 添加新元素 语法:集合.add(元素)
- 移除元素 语法:集合.remove(元素)
- 从集合中随机取出元素 语法:集合.pop()
- 清空集合 语法:集合.clear()
- 取出两个集合的差集 语法:集合1.difference(集合2)
- 消除两个集合的差集 语法:集合1.difference_update(集合2) 结果:集合1和集合2相同的元素被删除
- 2个集合合并 语法:集合1.union(集合2) 结果:得到新集合
- 统计集合元素数量 语法:len(集合名)
- 集合的遍历:因为不支持下标索引,所以不能使用while循环
数据容器(dict字典)
- 定义: {key:value,key:value,......} 变量名={key:value,....} 空字典 变量名={ } 或 变量名=dict()
- PS:字典和集合一样无法使用下标索引,但是可以通过key值取得相应的value 字典名[key值]
- 字典的嵌套 字典的key和value可以是任意值,但是key不能是字典类型 嵌套取值时需要用两层,每层都只能用key,不能用下标哦
- 字典的常用操作
- 新增元素 语法:字典名[key]=value ps:如果key是重复的,该操作等同于更新
- 删除元素 语法:字典名.pop(key) 结果:获得指定key值的value,同时字典被修改
- 清空元素 语法: 字典名.clear()
- 获取全部的key 语法:字典名.keys()
- 统计字典内元素数量 语法:len(字典名)
数据容器的通用操作
- 带参函数
- len(容器):统计容器中元素个数
- min(容器):找出容器最小元素,对应max
- 容器类型转换
- 容器转列表:字符串转列表,则每个元素都是字符串类型;字典转列表,最后只剩下key值
- 容器转元组:同上
- 容器转字符串
- 容器转集合:重复的数值被去重;字典只剩key值
- 容器通用排序功能
sorted(容器名,[reverse=TRUE]) PS:排序结果为列表对象,如果想要反向排序,只需要后面是true即可
函数进阶
- 函数多返回值:如果函数有两个return,则一般先执行前一个,yinweireturn以后的语句不会执行,解决方案:
return 返回值1,返回值2 然后有多个变量接收返回值,如:x,y=函数()
- 函数的多种传参方式
- 位置参数:调用参数时,根据函数定义的参数位置来传递参数PS:传递的参数和定义的参数顺序及个数必须一致
- 关键字参数:函数调用时通过”键=值”的形式传递参数
- eg:def user(name,age,gender) 调用时:user(name="小米",age=20,gender="女")、
- ps:函数调用时如果有位置参数和关键字参数,位置参数一定要放在关键字参数的后面,关键字参数顺序无要求
- 缺省参数(默认参数)
- eg:def user=(name,age,render="男") 调用时 user("mike",18)默认性别是男;user("Amy",10,"女")则修改了默认参数
- PS:默认值必须是放在后面的参数位置
- 不定长参数(可变参数) 作用:当调用函数时不确定参数个数时,可使用不定长参数传参,又分为两类
- 位置传参def user(*args):传进的所有参数都会被args变量收集
- 关键字传递:def user(**kways) 传入的参数是“键=值”形式传入的
- 匿名函数
- 函数作为参数传递:其实就是传入函数的运算逻辑
- lambda匿名函数:函数定义中用def可以定义有名称的函数,这个函数在后面可以可以通过名字多次调用;而用lambda可以定义匿名函数(只能调用1次),语法:lambad 传入参数:函数体(PS:函数体只能是一行代码)
文件操作
文件编码概念
- 编码技术:翻译的规则,记录了如何将内容翻译成二进制,以及将二进制翻译回可识别内容
文件读取
- 文件操作步骤:打开文件-->读写文件---->关闭文件
- open():打开一个已经存在的文件或者创建一个新文件
- 语法:open(name,mode,encoding)
- name:要打开的目标文件的名称
- mode:设置打开文件的模式:只读,写入、追加等
- encoding:编码格式
- eg:f=open("python.txt",'r',encoding='utf-8'),则此时f算是一个文件对象,拥有属性和方法,可以使用对象.属性;对象.方法对其进行访问
- mode常用的三种基础访问模式
- r:只读方式打开文件,指针在文件开头
- w:打开文件用于写入。如果文件已经存在从头开始编辑,原有内容会被删除。如果文件不存在,创建文件
- a:打开文件用于追加内容
- 语法:open(name,mode,encoding)
- 读操作相关方法
- read方法: 文件对象.read(num) Num表示要从文件读取的数据长度,如果没有传入num,那么就表示读取文件中所有的数据
- readlines()方法 : 按照行的方式将整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素
- PS:如果在程序中多次调用read()方法,那下一次调用read()方法会在上一次调用read()方法的结尾处;readlines()方法会把换行符也读到(意思是会输出\n)
- readline()方法:一次读取一行内容
- for循环:for line in f:line就表示这个文件的每一行
- close()方法:关闭文件对象
- with open(“文件名”,“读写方式”)asf : f.readlines() 作用:在读操作结束后自动关闭文件
- 文件的写操作
- 打开文件: f.open("","","")
- 文件写入: f.write("写入的内容")
- 文件内容刷新:f.flush()
- PS:直接调用write只是把内容写在内存的缓冲区中,当调用flush的时候,内容会真正写入文件(好处:避免频繁的操作硬盘)
- 注意:f.close()内置了flush()方法
- 实践发现:写操作会从头开始写,这样会把原内容覆盖掉
- 文件的追加操作
- 语法和写入一样,只不过需要将文件读写方式改为'a'
Python异常、模块与包
异常
- 异常的捕获语法: try:可能发生错误的代码 except:如果出现异常执行的代码
- 捕获指定异常方法:try:可能发生错误的代码 except 异常类型 as 变量:print(变量)
- 异常类型:NameError、ZeroDivisionError、list index out of range
- 捕获多个异常:异常类型用元组包起来
- 捕获所有异常:try:可能发生错误的代码 except Exception as e:print(e)
- 异常的else: try:可能发生错误的代码 except:如果出现异常执行的代码 else:没有异常执行的
- 异常的finally:语法同else,表示的是无论是否发生异常都要执行的代码
Python模块
- 模块:就是一个python文件,里面有类、函数、变量等,我们可以导入模块使用(ctrl+鼠标点击就可以查看这个文件)
模块的导入方式
- 【from 模块名】import【模块|类|变量|函数|*(导入模块的全部内容)】【as 别名】
- PS:中括号内的内容可写可不写
- 语法: import 模块名 模块名.功能名() 作用:使用模块内部定义的函数
- eg:之前使用的random模块
- 语法:from 模块名 import 功能名 功能名() 作用(针对某个功能使用)
- 语法:from 模块名 import * 功能名() 作用:导入模块的全部功能
- 语法:from 模块名 as 别名 作用:模块定义别名
- 语法:from 模块名 import 功能名 as 别名 作用:功能定义别名
自定义模块
- 就是新建一个.py文件,在这个文件里正常写代码,然后在另一个文件里import这个模块,就可以使用自定义模块的一些功能
- PS:当导入多个模块是,且模块内有同名功能,当调用这个同名功能的时候,调用到的是后面导入的模块的功能
安装第三方包
没完成预设目标,但是今天是1024,发篇博客会的一个勋章。
今天还是霜降,柿柿平安,明天开始改头换面。。。。