目录
数据类型
数字、字符串(String)、列表(List)、元组(Tuple)、集合(Set)、字典(Dictionary),数字又包含:整数(int)、浮点数(float)、复数(complex)
布尔类型
布尔类型分为真(true),假(false)
输入
input(内容数据)注意:输入的数据会被默认为字符串,要输入为数字要使用数据类型转化
#可以在括号内填入数据的前提
a=input("请输入数据")
print(a)
输出
print(内容数据)
print("你好")
运算符和注释符
注释符号:#,""" """
除号:/(不取整数)
除号://(取整)
取余数:%
指数:**
#单行注释
"""
多行注释
"""
a1=14/4#除
a2=14//4#除(取整数)
a3=14%4#取余数
a4=2**3#取指数
a5=14+4#加
a6=14-4#减
a7=2*3#乘
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)
print(a6)
print(a7)
比较符号
a1=1>2
a2=1<2
#一个等号是赋值,两个等号是比较
a3=1==2
#1不等于2为真true
a4=1!=2
#输出为布尔类型
print(a1)
print(a2)
print(a3)
print(a4)
字符串的定义
字符串有三种定义方式分别是:
' '
" "
"' '"
字符串的拼接
#字符串的三种定义方式
a1='你好'
a2="今天天气不错"
a3='''你吃了吗?'''
print(a1+a2+a3+"吃了")
字符串的格式化
(要输出带有”“的字符串在前面”“加一个转义字符\就可以了)
字符串格式化:(%:表示占位,s:表示将变量变成字符串放入站位的地方)
#字符串的三种定义方式
a1='你好'
a2="%s今天天气不错" % a1
a3='''%s%s你吃了吗?''' % (a1,a2)
print(a1)
print(a2)
print(a3)
不仅可以用于字符串还可以用于浮点数,整数
%s(字符串),%d(整数),%f(浮点数)
m.n:表示控制数字的宽度和精度(这里的m,n在实际)
m:控制宽度,要求是数字(当宽度小于自身时不生效)
例如%5d 11,输出---11(“-”是空格)
.n:控制精度,要求是数字
例如%5.2f 11,输出11.00(注意小数点也占一个空位)
字符串的格式化2:print(f"{变量}")
#字符串的三种定义方式
a1='你好'
a2="%s今天天气不错" % a1
a3='''%s%s你吃了吗?''' % (a1,a2)
print(f"{a1}{a2}{a3}谢谢我很好")
输出数据的类型
type(数据)
a1=11
a2=11.2
a3='你好'
a4=2>3
#整数类型
print(type(a1))
#浮点数类型
print(type(a2))
#字符串类型
print(type(a3))
#布尔类型
print(type(a4))
数据类型转换
#整数类型
a1=11
#浮点数类型
a2=12.1
#字符串类型
a3="19"
#转化为浮点数类型
a1=float(a1)
#转化为字符串类型
a2=str(a2)
#转化为整数类型
a3=int(a3)
print(a1)
print(a2)
print(a3)
判断语句
if(条件1):
内容要缩进4格
elif(条件2):
elif(条件3):
......
else:
只能满足其中一个条件,或者都不满足,如果出现条件相同,当满数这个条件时,则会输入前面条件的内容
#将输入的数据转化为整数类型
a=int(input("请输入序号"))
if(a==1):
print(1)
elif(a==3):
print(2)
elif(a==3):
print(3)
elif(a==4):
print(4)
else:
print("没有了")
获得随机数
import random
num = random.randint(num1,num2)
得到num是从num1到num2中随机一个数
import random
#得到num是从1到10中随机一个数
num = random.randint(1,10)
print(num)
while循环
while 表达式(判断是否为假,为真(true)继续执行内容,为假(false)则跳出循环)
循环内容
a=0
b=0
#判断a是否小于100,当a==100时跳出循环
while a<100:
a=a+1
#累加,计算从0加到99
b=b+a
#跳出循环后执行以下内容
print(b)
循环嵌套(制作九九乘法表)
a=1
while a<10:
b=1
while b<a+1:
#在输出后面加上end=' '语句可以不换行
print(f"{b}*{a}={a*b}",end=' ')
b=b+1
#保证99乘法表的换行
print()
a=a+1
跳出某一次循环continue
a=0
b=0
#while循环与判断语句嵌套使用
while a<100:
a = a + 1
#当a==50时跳出此次循环循环
if(a==50):
continue
#当a!=50所执行的代码
else:
#累加,计算从0加到99,中间除去了50
b=b+a
print(b)
终止循环break
a=0
b=0
#while循环与判断语句嵌套使用
while a<100:
a=a+1
#当a==50时终止循环
if(a==50):
break
#当a!=50所执行的代码
else:
# 得到从0累加到49的数
b=b+a
print(b)
for循环
for 临时变量 in 待处理的数据集:
循环条件满足执行的代码
待处理的数据集:(序列类型,及字符串(String)、列表(List)、元组(Tuple))详细请看数据容器
for循环也可以使用break语句和continue语句
a='Hello,World'
for x in a:
print(x)
range语法
range只能配合for,单独使用会直接显出range语法,而不会显出数据
range(num)得到从0开始到num(不包含num)的数据序列
range(num1,num2)得到从num1开始到num2(不包含num2)的数据序列
range(num1,num2,step)得到从num1开始到num2(不包含num2)的数据序列,间隔为step(间隔默认为1)
for x in range(8):
print(x,end=' ')
#换行
print()
for x in range(2,7):
print(x, end=' ')
print()
for x in range(1,10,3):
print(x,end=' ')
函数1
函数是组织好的,可重复使用的,用来实现特定功能的代码段
语句:def 自定义的函数名(传入参数(可以有,也可以没有)):
函数体
return 返回值(及调用函数后返回的数据)
函数调用
函数名(数据)数据的个数要和传入参数的个数相同
def num1(x,y):
return x+y
def num2():
#函数嵌套使用
num=num1(9,9)
print(num)
print("你好")
def num3(x):
print(x)
#有返回值需要变量接收
num=num1(1,2)
print(num)
num2()
num3(99)
None
无返回值的函数,还是会返回一种值就是None,None表示空的无意义的意思
数据容器
一种可以容纳多份数据的数据类型,容纳每一个数据称为一个元素(可以是任何数据类型的数据)
数据容器根据
1.是否支持重复元素
2.是否可以修改
3.是否有序,等
分为5类:列表(list),元组(tuple),字符串(str),集合(set),字典(dict)
列表(list)
列表可以一次性存储多个数据(可以容纳2**63-1个元素),且可以为不同数据类型,支持嵌套
而且列表有序的,可以有重复的元素,可以修改(增加或者删除元素等)
字面量
[元素1,元素2,元素3,元素4,......](元素即数据)
[11,"你好",11.2]
定义变量
变量名称=[元素1,元素2,元素3,元素4,......](可以使用print(变量名称)直接输出列表)
add=[11,"你好",11.2]
print(add)
定义空列表
变量名称=[ ]
变量名称=list( )
add=[]
add=list()
可以使用索引提取出列表中对应的元素
add=[11,"你好",11.2]
print(add[0])
print(add[1])
print(add[2])
以此类推
也可以
add=[11,"你好",11.2]
print(add[-1])
print(add[-2])
print(add[-3])
以此类推
如果是嵌套的列表,例如:
add = [[1,2],[3,4]]
print(add[0][0])
print(add[0][1])
print(add[1][0])
print(add[1][1])
以此类推
列表的方法:
查询列表元素对应的索引值
列表.index(元素)= 索引值
例如:
add=[11,"你好",11.2]
num1=add.index(11)
num2=add.index(("你好"))
num3=add.index(11.2)
print(num1)
print(num2)
print(num3)
修改列表对应元素的值
列表[索引]=所要修改的值例如:
add=[11,"你好",11.2]
add[0]=12
print(add[0])
print(add[1])
print(add[2])
在列表中插入值
列表.insert(索引,元素)
例如:
add=[11,"你好",11.2]
add.insert(1,"我不好")
print(add[0])
print(add[1])
print(add[2])
print(add[3])
print(add)
在列表中追加元素
方式1:列表.append(元素)
例如:
add=[11,"你好",11.2]
add.append("我很好")
print(add[0])
print(add[1])
print(add[2])
print(add[3])
print(add)
方式2:列表.extend(其他数据容器),将其他数据容器的内容取出,依次追加到列表尾部
例如:
add=[11,"你好",11.2]
add.extend([1,2,3])
print(add[0])
print(add[1])
print(add[2])
print(add[3])
print(add)
删除列表中的元素
方法1:del 列表[索引](注意空格)
例如:
add=[11,"你好",11.2]
del add[1]
print(add[0])
print(add[1])
print(add)
当将该位置的数据删除时,会有后面的数据填充进来
方法2:列表.pop(索引)
add=[11,"你好",11.2]
num=add.pop(1)
print(add[0])
print(add[1])
print(add)
print(num)
此方法还能将删除的数据输出出来,但是此方法最好不要用两次
删除列表中相同元素的第一个
列表.remove(元素)
例如:
add=[11,"你好",11.2,"你好"]
add.remove("你好")
print(add)
如果需要remove和pop同时出现最好是pop在remove前面
清空列表内容
列表.clear()
add=[11,"你好",11.2,"你好"]
add.clear()
print(add)
统计某元素在列表中的数量
列表.count(元素)
add=[11,"你好",11.2,"你好"]
num1 = add.count("你好")
num2 = add.count(3)
num3 = add.count(11)
print(num1)
print(num2)
print(num3)
print(add)
列表的sort方法(未出现在列表总结)
用于数据可视化,建议学习柱状图时学习此方法
列表.sort(key=选择排序依据的函数(reverse=True|False)
参数key,是要求传入一个函数(把函数当作参数传入)
表示将列表的每一个元素都传入函数中,返回排序的依据(及把列表中的元素传入函数,由函数决定拿到的哪一部分,作为排序的依据,返回出结果)
参数reverse,是否反转排序结果,True表示降序,False表示升序
#列表中内嵌列表不适用sorted方法要用sort方法
num=[["a1",35],["b2",67],["c3",23]]
#列表中每一个列表元素放入函数,返回列表元素的中的第二个元素
def mimi(mo):
return mo[1]
#reverse=True表示降序
num.sort(key=mimi,reverse=True)
#也可以lambda匿名形式,结果一样
#num.sort(key=lambda mo: mo[1],reverse=True)
#排序完成
print(num)
统计列表中的元素数量
len(列表)
add=[11,"你好",11.2,"你好"]
num = len(add)
print(num)
print(add)
列表总结
1 | 列表.append(元素) | 向列表中追加一个元素 |
2 | 列表.extend(容器) | 将数据容器的内容依次取出,追加到列表尾部 |
3 | 列表.insert(下标,元素) | 在指定下标处,插入指定的元素 |
4 | del 列表[下标] | 删除列表指定元素下标 |
5 | 列表.pop(下标) | 删除列表指定元素下标 |
6 | 列表.remove(元素) | 从前向后,删除此元素第一个匹配项 |
7 | 列表.clear() | 清空列表 |
8 | 列表.count(元素) | 统计此元素在列表中出现的次数 |
9 | 列表.index(元素) | 查找指定元素在列表的下标(找不到报错ValueError) |
10 | len(列表) | 统计容器内有多少元素 |
列表的循环遍历
while
i=0
add=[1,2,"你好",1.1,2.2,"我很好"]
while i<len(add):
num=add[i]
i+=1
print(num)
for
add=[1,2,"你好",1.1,2.2,"我很好"]
for x in add:
print(x)
上下两种方法都是可以的,都会得出同样的结果
add=[1,2,"你好",1.1,2.2,"我很好"]
for x in range(0,len(add)):
# range(0,5)=[0,1,2,3,4](在for循环中使用)
num = add[x]
print(num)
元组(tuple)
元组可以一次性存储多个数据(),且可以为不同数据类型,也可以嵌套,
而且列表有序的,可以有重复的元素
但是元组一旦定义完成,就不可以修改
字面量
(11,"你好",11.2)
定义元组变量
add=(11,"你好",11.2)
print(add)
定义元组空变量
add=()
add=tuple()
如果你要定义一个元组,但是元组里面只有一个元素那就要在这一个元素后面添加一个逗号,如果不添加的话,就不是元组类型
add=("Hello",)
利用索引取出对应元素与列表(list)相同
add=(11,"你好",11.2)
num1 = add[1]
bdd=((1,2,3),(11,"你好",11.2))
num2 = bdd[1][2]
print(num1)
print(num2)
元组的方法:
查询元组元素对应的索引值
元组.index(元素)=索引值
add=(11,"你好",11.2)
num = add.index("你好")
print(num)
统计某元素在元组中的数量
元组.count(元素)
add=(11,"你好",11.2,11,11.2,"我很好")
num1 = add.count("你好")
num2 = add.count(11)
print(num1)
print(num2)
统计元组中的元素数量
len(元组)
add=(11,"你好",11.2,11,11.2,"我很好")
num = len(add)
print(num)
元组的定义完的内容不可以修改,但是元组内嵌套一个列表(list),列表里的内容可以修改
add=(11,"你好",11.2,[11,"你好",11.2])
print(add)
add[3][0]=12
add[3][1]="我很好"
add[3].append(19)
print(add)
元组总结
1 | index() | 查找某个数据,如果数据存在返回对应的下标,否则报错 |
2 | count() | 统计某个数据在当前元组出现的个数 |
3 | len(元组) | 统计元组内的元素个数 |
元组的遍历
while
add=(11,"你好",11.2,11,11.2,"我很好")
num=0
while num<len(add):
print(add[num])
num=num+1
for
add=(11,"你好",11.2,11,11.2,"我很好")
for x in add:
print(x)
字符串(str)
一个字符串可以存放任意数量的字符,字符串也是一个不可修改的数据容器,可以有重复字符
如果硬要修改那只能得到一个新字符串
利用索引取出对应元素
num="Today is really nice"
print(num[0])
print(num[-4])
print(num[-5])#第-5个字符是个空格
字符串方法:
查询字符串元素对应的索引值
字符串.index(元素)=索引值
num="Today is really nice"
max=num.index(" ")
min=num.index(" r")
#这里我把空格加一个r设为一个字符串
print(max)
print(min)
字符串的替换
字符串.replace(字符串1,字符串2)(将字符串1全部转换为字符串2,不是修改字符串本身,而是得到一个新的字符串)
num="Today is really nice"
max=num.replace("really nice","not good")
print(max)
print(num)
字符串的分割
字符串.split(分割符字符串)(按照指定的分割符字符串,将字符串分为多个字符串,并存入列表对象中,字符串本身不变,而是得到一个列表对象)
num="Today is really nice"
max=num.split(" ")#分割字符是一个空格
min=num.split("a")#分割字符是a
print(num)
print(max)
print(min)
字符串的规整操作
字符串.strip() (去除字符串最首尾空格,跟空格的多少没关系)
字符串.strip(字符串1) (去除字符串前后指定的字符串1,如果没有则无效)
num=" Today is really nice "
max1=num.strip()
max2=max1.strip("a")
max3 =max1.strip("T")#去除首尾字符串中的"T"
max4=max1.strip("Te")#去除首尾字符串中的"T"和"e",只有去除其中一个才能有机会去除另外一个
max5=max1.strip("Teo")#去除首尾字符串中的"T","e","o"
print(max1)
print(max2)
print(max3)
print(max4)
print(max5)
(理解能力有限)
统计某字符在字符串中的数量
字符串.count(某字符)
num=" Today is really nice "
max=num.count("a")
print(max)
统计字符串中的长度
len(字符串)
num="Today is really nice"
max=len(num)
print(max)
字符串总结
1 | 字符串[下标] | 根据下标索引取出特定位置字符 |
2 | 字符串.index(字符串) | 查找给定字符的第一个匹配项的下标 |
3 | 字符串.replace(字符串1,字符串2) | 将字符串内的全部字符串1,替换为字符串2(不会修改原字符串,而是得到一个新的) |
4 | 字符串.split(字符串) | 按照给定的字符串,对字符串进行分隔(不会修改原字符串,而是得到一个新的列表) |
5 | 字符串.strip() 字符串.strip(字符串) | 移除首尾的空格和换行符或指定字符串 |
6 | 字符串.count(字符串) | 统计字符串内某字符串出现的次数 |
7 | len(字符串) | 统计字符串的字符个数 |
字符串的遍历
(字符串的遍历和元组,列表差不多就不写了)
序列
内容连续,有序,可以使用下标索引的数据容器(列表,元组,字符串均可视为序列)
序列切片
从一个序列中,取出一个子序列,但不会影响母序列
序列[起始索引:结束索引:步长]
起始索引:表示从哪里开始,可以留空,留空视作从头开始
结束索引(不含其本身):表示从哪里结束,可以留空,留空视作截取到结尾
步长:步长为1表示一个个取
步长为2表示跳过一个元素取
步长为m表示跳过m-1个元素取
步长为负数表示反向取(注意起始索引和结束索引也要反向)
num1=[0,1,2,3,4,5,6,7,8,9]
num2=num1[2:7]#步长为1省略不写
num3=num1[1:7:2]
num4=num1[:]#从头到尾,步长为1
num5=num1[::2]#从头到尾,步长为2
num6=num1[::-1]#从头到尾步长为-1
num7=num1[7:1:-2]#从7到1,步长为-2
print(num1)
print(num2)
print(num3)
print(num4)
print(num5)
print(num6)
print(num7)
集合(set)
集合可以一次性存储多个数据,且可以为不同数据类型,支持嵌套
集合是无序的(不支持下标索引),不支持重复的元素(有重复元素会在输出是去掉),可以修改(增加或者删除元素等)
字面量
{11,"你好",11.2}
定义集合变量
num={11,"你好",11.2}
print(num)
定义集合空变量
num=set()
集合语法:
添加新元素
集合.add(元素)
num={11,"你好",11.2}
print(num)
num.add("我很好")
print(num)
移除元素
集合.remove(元素)
num={11,"你好",11.2}
print(num)
num.remove("你好")
print(num)
随机取出一个元素
集合.pop()
num={11,"你好",11.2}
print(num)
max=num.pop()
print(num)
print(max)
清空集合
集合.clear
num={11,"你好",11.2}
print(num)
num.clear()
print(num)
取两个集合的差集
集合1.difference(集合2)(集合1有集合2没有的,集合1和集合2本身没有改变)
num1={11,"你好",11.2}
num2={11.3,"我很好",11.2}
max=num1.difference(num2)
min=num2.difference(num1)
print(max)
print(min)
消除两集合的差集
集合1.difference_update(集合2)(集合1改变了,集合2没有改变)
num1={11,"你好",11.2}
num2={11.3,"我很好",11.2}
num1.difference_update(num2)#集合1改变了,集合2没有改变
print(num1)
num2.difference_update(num1)#因为集合2中没有和集合1相同的元素了,所以集合2不变
print(num2)
合并两个集合
集合1.unior(集合2)(原两个集合不变)
num1={11,"你好",11.2}
num2={11.3,"我很好",11.2}
num3=num1.union(num2)
print(num1)
print(num2)
print(num3)#重复的去掉
统计集合的数量
len(集合)
num1={11,"你好",11.2,11.2}
num2=len(num1)
print(num1)#集合去重
print(num2)
集合的遍历
集合的遍历因为不能使用索引所以不能使用while,但关于for的可以使用且和列表元组差不多
集合总结
1 | 集合.add(元素) | 集合内添加一个元素 |
2 | 集合.remove(元素) | 移除集合内指定元素 |
3 | 集合.pop() | 从集合中随机取出一个元素 |
4 | 集合.clear() | 将集合清空 |
5 | 集合1.difference(集合2) | 得到一个新集合,内含两个集合的差集,原有的两个集合内容不变 |
6 | 集合1.difference_update(集合2) | 在集合1中,删除和集合2中相同的元素,集合1修改,集合2不变 |
7 | 集合1.union(集合2) | 得到一个新集合,内含两个集合的全部元素,原有的两个集合不变 |
8 | len(集合) | 得到一个整数,记录了集合总元素个数(重复的不记录) |
字典(dict)
字典可以一次性存储多个数据,且可以为不同数据类型,支持嵌套,可以修改(增加或者删除元素等),不支持下标索引,支持for循环,不支持while循环,每一份数据都是Key value值对,用于基于Key检索value的场景(Key不予许重复,重复添加则代表覆盖了原有的数据)
字面量(类比于现实中的字典,key相当于你查的汉字,value相当于你要查的那个字的含义)
{key:value,key:value,key:value}
定义字典的变量
num={key:value,key:value,key:value}
定义空字典
mun={}
num=dict()
可嵌套使用
num={"小王":{"语文":60,"英语":59,"数学":70},"小李":{"语文":70,"英语":55,"数学":60}}
print(num)
print(num["小李"])
print(num["小王"]["英语"])
字典的方法:
字典的增加与修改
num={"小王":80,"小李":88}
print(num)
num["小美"]=86#如果不存在就是新增
print(num)
num["小李"]=78#如果存在就是覆盖
print(num)
删除字典中的元素
字典.pop(Key)
num={"小王":80,"小李":88,"小美":90}
max=num.pop("小王")
print(max)
print(num)
清空字典中的元素
字典.clear()
num={"小王":80,"小李":88,"小美":90}
num.clear()
print(num)
获取全部的Key
字典.keys()
num={"小王":80,"小李":88,"小美":90}
max=num.keys()
print(max)
print(num)
统计字典内元素的个数
len(字典)
num={"小王":80,"小李":88,"小美":90}
max=len(num)
print(num)
print(max)
字典的遍历
for
num={"小王":80,"小李":88,"小美":90}
for x in num:
print(x)
print(num[x])
字典总结
1 | 字典[Key] | 获取指定Key对应的Value值 |
2 | 字典[Key]=Value | 添加或更新键值对 |
3 | 字典.pop(Key) | 取出Key对应的Value并在字典内删除此Key的键值对 |
4 | 字典.clear() | 清空字典 |
5 | 字典.keys() | 获取字典的全部Key,可用于for循环的遍历字典 |
6 | len(字典) | 计算字典内的元素数量 |
数据容器总结
列表 | 元组 | 字符串 | 集合 | 字典 | |
元素数量 | 支持多个 | 支持多个 | 支持多个 | 支持多个 | 支持多个 |
元素类型 | 任意 | 任意 | 仅字符 | 任意 | Key:Value Key:除字典外的任意类型 Value:任意类型 |
下标索引 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
重复元素 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
可修改性 | 支持 | 不支持 | 不支持 | 支持 | 支持 |
数据有序 | 是 | 是 | 是 | 否 | 否 |
使用场景 | 可修改,可重复的一批数据记录场景 | 不可修改,可重复的一批数据记录场景 | 一串字符串的记录场景 | 不可重复的数据记录场景 | Key检索value的数据记录场景 |
数据容器转化
max()
min()(最大最小元素)
list(容器)(转化为列表)
num1=[1,2,3,4,5]
num2=(1,2,3,4,5,)
num3="abcdefg"
num4={1,2,3,4,5}
num5={"Key1":1,"Key2":2,"Key3":3,"Key4":4,"Key5":5}
print(list(num1))
print(list(num2))
print(list(num3))
print(list(num4))
print(list(num5))
str(容器)(转化为字符串)
num1=[1,2,3,4,5]
num2=(1,2,3,4,5,)
num3="abcdefg"
num4={1,2,3,4,5}
num5={"Key1":1,"Key2":2,"Key3":3,"Key4":4,"Key5":5}
print(str(num1))
print(str(num2))
print(str(num3))
print(str(num4))
print(str(num5))
tuple(容器)(转化为元组)
num1=[1,2,3,4,5]
num2=(1,2,3,4,5,)
num3="abcdefg"
num4={1,2,3,4,5}
num5={"Key1":1,"Key2":2,"Key3":3,"Key4":4,"Key5":5}
print(tuple(num1))
print(tuple(num2))
print(tuple(num3))
print(tuple(num4))
print(tuple(num5))
set(容器)(转化为集合)
num1=[1,2,3,4,5]
num2=(1,2,3,4,5,)
num3="abcdefg"
num4={1,2,3,4,5}
num5={"Key1":1,"Key2":2,"Key3":3,"Key4":4,"Key5":5}
print(set(num1))
print(set(num2))
print(set(num3))
print(set(num4))
print(set(num5))
排序方法
sorted(容器,[reverse=True])
num1=[6,7,3,9,3,1]
num2=(6,7,3,9,3,1)
num3="vvavtebedf"
num4={6,7,3,9,3,1}
num5={"Key3":3,"Key5":5,"Key1":1,"Key4":4,"Key2":2}
#结果对象都变成列表了
print(sorted(num1))
print(sorted(num2))
print(sorted(num3))
print(sorted(num4))
print(sorted(num5))
print(sorted(num1,reverse=True))#反过来了
函数2
函数的多返回值
def num():
return 1,2.2,"你好"
x,y,z=num()
print(x)
print(y)
print(z)
函数的多种传参方式
位置参数
调用函数时,根据函数定义的参数位置来传递参数(传递的参数和函数定义的参数的顺序及个数必须一致)
def num(x,y,z):
print(f"我叫{x},我今年{y}岁,我喜欢{z}")
num("小明",20,"打篮球")
关键字参数
函数调用时,通过“键=值”的形式传递参数(函数调用时,如果有位置参数,位置参数必须在关键字参数前面,但关键字函数不存在位置关系)
def num(x,y,z):
print(f"我叫{x},我今年{y}岁,我喜欢{z}")
num(x="小明",y=20,z="打篮球")
num(z="画画",x="小红",y=21)
num("小兰",z="游泳",y=24)
缺省参数
也叫默认参数,用于定义函数,为参数提供默认值,调用函数时不可传该默认参数的值(所有位置参数,必须在默认参数之前)函数调用时,如果为缺省参数传值则修改默认参数值,否则使用这个默认参数值
def num(x,y,z="男"):#在缺省参数中默认参数必须设在最后面
print(f"我叫{x},我今年{y}岁,性别{z}")
num(x="小明",y=20)
num(z="女",x="小红",y=21)
num("小兰",z="女",y=24)
不定长参数
也叫可变参数,用于不确定调用的时候会传多少个参数(不传也可以)的场景
不定长参数也可以再分为两个:位置参数和关键字参数
位置参数
def 函数(*参数)
def num(*max):
print(max)
num("你好",11)
num(11.2)
#传进去的所有参数会被max变量收集,他会根据传进参数的位置合并为一个元组(tuple),max是元组类型
关键字参数
def 函数(**参数)
def num(**max):
print(max)
num(name="你好",age=11)
num(age=11.2)
#参数是“键=值”形式的形式的情况下,所有的“键=值”都会被max接受,同时会根据“键=值”形成字典
函数作为参数传递
def num(max):
auo=max(3,4)
print(type(max))
print(auo)
def max(x,y):
return x+y
num(max)
lambda匿名函数
def有名称函数
lambda定义匿名函数适用于只能使用一次的场景
lambda 传入参数:函数体(一行代码)
lambda表示匿名函数,传入参数表示匿名函数的形式参数,函数体只能写一行代码
def num(max):
auo=max(3,4)
print(type(max))
print(auo)
num(lambda x,y:x+y)
文件
文件的编码
编码技术:及翻译规则,记录了如何将内容翻译成二进制(编码有许多,要使用正确的编码,才能对文件进行正确的读写操作)
可以通过Windows系统自带的记事本看到(例如:UTF-8(通用),GBK,Big5等)
文件的读取操作
利用open()函数打开存在,或直接创建一个文件
open(name,mode,encoding)
name:是要打开目标文件名的字符串(可以包含目标文件所在的具体路径)
mode:设置打开文件的模式(访问模式),只读,写入,追加等
有三种模式
r:只读
w:写入,从头开始(原文会被删除,如果没有则创建文件)
a:追加(在原文最后追加,如果没有则创建)
encoding:编码格式(推荐UTF-8)
f=open("D:/测试.txt","r",encoding="UTF-8")#"D:/测试.txt"是在我的D盘有一个测试txt文件
"r"是只读 "UTF-8"是编码
print(type(f))
print(f)
read()方法
文件对象.read(num)
num表示从文件中读取数据的长度(单位:字节)(字符串形式),如果没有传入则,表示读取全部
f=open("D:/测试.txt","r",encoding="UTF-8")
mimi=f.read(10)
#"Hello,Wor
nasi=f.read()
#ld"
# "你好"
# 11
# 11.2
#在读取文件过程中,每一次读取开始是从前一次的末尾开始(第一次是从头开始)
print(nasi)
print(mimi)
f.close()#关闭文件
readlines()方法
按照行的方式把整个文件的内容进行一次性读取,并且返回的是一个列表,其中每一行数据是一个元素
f=open("D:/测试.txt","r",encoding="UTF-8")
nasi=f.readlines()
print(nasi)#文件内容
f.close()#关闭文件
readline()方法
一次读取一行内容(字符串形式)
f=open("D:/测试.txt","r",encoding="UTF-8")
nasi=f.readline()#读取第一行内容
mimi=f.readline()#读取第二行内容
san=f.readline()#读取第三行内容
print(nasi)
print(mimi)
print(san)
f.close()#关闭文件
用for循环读取文件
f=open("D:/测试.txt","r",encoding="UTF-8")
for lian in f:
print(lian)
f.close()#关闭文件
文件关闭
文件如果打开后不关闭则会一直被python占用,会导致文件无法删除改名等等
文件.close()(打开文件后关闭)前面例子有出现
with open 语法
可以通过with open的语句对文件进行操作。可以在操作完成后自动关闭close文件,避免忘记close方法
with open("D:/测试.txt","r",encoding="UTF-8") as f:
for lian in f:
print(lian)
汇总:
操作 | 功能 |
文件对象=open(file,mode,encoding) | 打开文件获得文件对象 |
文件对象.read(num) | 读取指定长度字节,不指定num读取文件全部 |
文件对象.readline() | 读取一行 |
文件对象.readlines() | 读取全部行,得到列表 |
for line in 文件对象 | for循环文件行,一次循环得到一行数据 |
文件对象.close() | 关闭文件对象 |
with open() as f | 通过with open语法打开文件,可以自动关闭 |
文件的写入
文件对象.write(要写入的内容)
直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
当调用flush时内容才会真正写入文件(如果你不调用flush,调用close文件关闭也是可以的)
这是为了避免频繁操作硬盘,导致效率下降(及攒一堆,一次性写出去)
f=open("D:/测试.txt","r",encoding="UTF-8")
mimi1=f.read()
# HelloWorld
# 你好
# 11
# 11.2
#原有的文件内容读取
#---------------------
d=open("D:/测试.txt","w",encoding="UTF-8")#如果文件不存在“w“模式会帮我们创建一个
d.write("今天真好")#写出内容
d.flush()#将写出的内容刷新到硬盘中取,但原有的内容被删除
d.flush()
#----------------------
s=open("D:/测试.txt","r",encoding="UTF-8")
mimi2=s.read()
#今天真好
#改完后的内容再次读取
print(mimi1)
print(mimi2)
s.close()#关闭文件
额外增加一小点:
time.sleep(10000)将程序睡眠10000秒
文件的追加
和文件的写入几乎一模一样就是”w“模式变成”a“模式
f=open("D:/测试.txt","r",encoding="UTF-8")
mimi1=f.read()
# HelloWorld
# 你好
# 11
# 11.2
#原有的文件内容读取
#---------------------
d=open("D:/测试.txt","a",encoding="UTF-8")
d.write("今天真好")#追加内容
d.write("\n每天都好")#追加内容
d.flush()#将追加的内容刷新到硬盘中取,在原有的内容后面添加
d.flush()
#----------------------
s=open("D:/测试.txt","r",encoding="UTF-8")
mimi2=s.read()
#改完后的内容读取
print(mimi1)
print(mimi2)
s.close()#关闭文件
异常,模块和包
异常
了解异常
当检测到一个错误时,Python解释器就无法继续执行,反而出现一些错误的提示,这就是所谓的“异常”,也就是常说的“BUG”
捕获异常
当我们的程序遇到了BUG一般会有两种情况:
1.整个程序因为一个BUG停止运行
2.对BUG进行提醒,整个程序继续进行
当我们遇到情况2的时候就要使用捕获异常(捕获异常的作用在于,提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段)
try:
可能发生错误的代码
except:
如果出现异常,所执行的代码
整个代码就是如果try中的代码报错,就会执行except中的代码
try:
f=open("D:/mimi.txt","r",encoding="UTF-8")
#在D盘中我没有创建mimi.txt文件
except:
print("出现异常,文件不存在,将r模式换成w模式打开")
f=open("D:/mimi.txt","w",encoding="UTF-8")
捕获指定异常
try:
发生错误的代码
except 异常类型 as 变量(及异常对象):
发生错误后执行代码
若发生的异常和定义的异常类型不一致则无法被捕获,一般try下面只放一行尝试执行的代码
try:
print(num)
except NameError as a:
print("出现变量未定义的异常")
print(a)#异常信息
try:
1/0
except NameError as a:#异常与所给的异常类型不相同,无法捕获
print("出现变量未定义的异常")
print(a)
由上面图片可以看出“1/0”的异常类型(ZeroDivisionError)
捕获多个异常
try:
发生错误的代码
except (异常类型1,异常类型2........)as 变量(及异常对象) :
发生错误后执行代码
try:
#1/0
print(num)
except (NameError,ZeroDivisionError) as a:#多个异常类型
print("出现变量未定义的异常或者出现除以0的异常")
捕获所有异常
try:
可能发生错误的代码
except Exception as a:#捕获所用异常和except差不多(except也是捕获所有异常)
如果出现异常,所执行的代码
如果没有异常
try:(必要)
可能发生错误的代码
except:(必要)
如果出现异常,所执行的代码
else:#当然可写可不写(可选)
如果没有异常所执行的代码
finally:#当然可写可不写(可选)
表示无论出不出现异常也要运行的代码,例如文件的关闭操作close()语法
try:
print(1)
except Exception as a:
print("出现异常")
else:
print("没有异常")
finally:
print("无论有没有异常,我都要运行")
try:
print(1/0)
except Exception as a:
print("出现异常")
else:
print("没有异常")
finally:
print("无论有没有异常,我都要运行")
异常的传递性
def a1():
print("a1开始")
print(1/0)#异常开始
print("a1结束")
def a2():
print("a2开始")
a1()#传递到函数a2
print("a2结束")
def a3():
a2()#传递到a3
a3()#异常出现
def a1():
print("a1开始")
print(1/0)#异常开始
print("a1结束")
def a2():
print("a2开始")
a1()#传递到函数a2
print("a2结束")
def a3():
try:#在a3中捕获异常
a2()#传递到a3
except Exception as a:
print(a)
a3()
模块
模块的导入
模块导入一般写在开头
python的模块就是一个python文件,以.py结尾,模块能定义函数,类和变量,模块里也能包含可执行代码
模块就是类比于工具包,我们平常在一个python文件里写代码就是制作工具,当我们需要用到这个工具时,可以不用重新做而是直接拿(及导入模块)
导入模块方式:
[from 模块名] import[模块|类|变量|函数| * (代表模块内的全部内容)][as 别名]([]中是可选的意思)
常用组合形式:
import 模块名
from 模块名 import 类、变量、方法等
from 模块名 import *
import 模块名 as 别名(别名就是自己给具体的模块或者功能改的名)
from 模块名 import 功能名 as 别名
基本语法:
import 模块名
import 模块名1,模块名2
模块名.功能() 功能就是模块内的功能,通过“ . ”来确定层级关系,并使用其中的功能
import time#导入python中的内置模块time
#import time as t#将模块time改成t(别名效果)
print("你好")
time.sleep(5)#使用time模块中的程序睡眠功能sleep(单位:秒)睡眠5秒
#t.sleep(5)(别名效果)
print("我很好")
#可以自己尝试一下
from 模块名 import 功能名
功能名()
from time import sleep#导入python中的内置模块time并使块中用time模的程序睡眠功能sleep
#或者from time import * 这里的*表示全部及模块time中的所有功能
print("你好")
sleep(5)#睡眠5秒
#sleep(5) 在众多功能中拿出一个sleep功能使用
print("我很好")
模块的自定义
就是自己创建一个python文件(设文件名为num),然后在里面写变量函数,这就是模块自定义
当你创建了两个模块,两个模块中的一个方法命名相同,当你调用这两个模块中的相同方法时,后面一个方法会将前面的方法覆盖
from num1 import a#x+y方法
from num2 import a#x-y方法(将上一个覆盖了)
mi=a(1,1)
#但若是mi=num1.a(1,1)则输出2
print(mi)
在自定义模块中,我们需要测试自己的方法是否创建成功,则会使用测试代码,但调用时,需要删除测试代码,如果不删,则可能对结果产生影响,有时候我们不想删测试代码,又想保证调用正确则要通过“__main__"变量执行
def a(x,y):
return x+y
if __name__ == '__main__':#"__name__"是一个内置变量,如果在本文件中运行则会被标记成“__main__”
i= a(2,3)#这样就不会防止测试代码调用到别的文件当中去
print(i)#4,5行为测试代码
#既方便了测试又方便了调用
本文件输出结果
如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素
__all__=["方法1","方法2"]
方法1,方法2,方法3(方法3不会被导入)
除非from xxx import 方法3
补充模块
补充python中的模块winsound,可以控制电脑发出声音
class Mou:
def num(self):
#导入模块
import winsound
使用功能2000频率,3000时常
winsound.Beep(2000,3000)
mou=Mou()
mou.num()
包
包就是一个文件夹,里面包含python模块,通过包在逻辑上将这一批包归为一类,方便使用
python包里面有__init__.py文件如果没有就不是python包
导入包
导入包里面的模块和导入模块差不多,就多了一个包名
from mi1.no1 import a1#mi1是包名no1是模块名
from mi1.no2 import a2
m=a1(1,2)#x+y方法
n=a2(4,3)#x-y方法
print(m)
print(n)
包也有__all__变量
from mi1 import *
表示mi1里所有的模块
当有__all__变量时只能用__all__变量里的模块,但使用__all__变量只能在__init__.py文件里
第三方包
及非python官方的包,这些包虽然不是python官方的但很实用,极大了丰富了python编程生态提高了开发效率,由于不是python官方开发的,所以没有内置他们
科学计算中常用的 numpy包
数据分析中常用的 pandas包
大数据计算中常用的 pyspark、apache-flink包
图形可视化常用的 matplotlib、pyecharts
人工智能常用的 tensorflow
如何安装第三方包
在命令提示符里:
输入:pip install 包名称(慢)
或者:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称(快)
数据可视化
json数据格式
JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据
JSON本质上是一个带有特定格式的字符串
主要功能:ison就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互,类似于:
国际通用语言-英语
中国56个民族不同地区的通用语言-普通话
在线JSON压缩转义工具-json转义压缩-json数据转义-懒人工具|www.ab173.com
在线JSON压缩转义工具-json转义压缩-json数据转义-懒人工具|www.ab173.com这个懒人网站可以直接转化json数据,及将json数据变成我们可以看得懂得数据
python数据和json数据的相互转换
python将字典,列表(列表内嵌字典)通过json转化为字符串
语法:import json
num=json.dumps(num)
将python数据转化为json数据
import json
num1={"name":"小王","age":18}
num2=[{"name":"小红","age":20},{"name":"小蓝","age":30},{"name":"小明","age":28}]
num1=json.dumps(num1,ensure_ascii=False)#当传入参数有汉字时需要添加ensure_ascii=False
num2=json.dumps(num2)
print(type(num1))#被转化为字符串
print(type(num2))
print(num1)
print(num2)
num=json.loads(num)
将json数据转化为python数据
import json
num1={"name":"小王","age":18}
num2='[{"name":"小红","age":20},{"name":"小蓝","age":30},{"name":"小明","age":28}]'#字符串
num1=json.dumps(num1,ensure_ascii=False)
num2=json.loads(num2)#字符串转化为列表
print(type(num1))
print(type(num2))
print(num1)
print(num2)#转化为列表形式
pyecharts模块
Python培训_北京Python培训班_好口碑Python培训机构-黑马程序员 (itheima.com)(黑马python网站)
开发可视化图表使用的技术栈是:pyecharts包
pyecharts - A Python Echarts Plotting Library built with love.(pyecharts网站,右上角切换语言)
Document(pyecharts的画廊,右上角切换语言,参考用途)
pyecharts模块安装
命令提示符
pip install pyecharts(慢)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts(快)
pyecharts入门
基础折线图
#利用导包pyecharts的charts模块的Line功能
from pyecharts.charts import Line
#通过Line得到一个空的坐标系,及折线图对象lian
lian=Line()
#设置空坐标系的x轴上的数据,列表数据
lian.add_xaxis(["小王","小李","小肖"])
#设置空坐标系的x轴上的数据,y轴命名,列表数据
lian.add_yaxis("岁数",[18,19,17])
#通过render()方法将代码生成图表
lian.render()
#但运行后不会直接生成图标会出现一个文件
# 点击进入文件,可以看到一个网页代码,
# 右上角有可以选择浏览器进入即可看到图表
全局配置选项
主要针对这些图像通用设置项配置
在pyecharts - A Python Echarts Plotting Library built with love.可以找到具体的全局配置的选项
通过set_global_opts方法配置
语法:图像对象.set_global_opts(相关全局设置项)
from pyecharts.charts import Line
#所有项在模块options里,通过逗号导入多个功能
#TitleOpts标题控制选项
#LegendOpts图例控制选项
#ToolboxOpts工具箱控制选项
#VisualMapOpts视觉映射控制选项
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts
lian=Line()
lian.add_xaxis(["小王","小李","小肖"])
lian.add_yaxis("岁数",[18,19,17])
#设置全局配置项,通过set_global_opts()设置,项通过逗号隔开
#将鼠标放置在set_global_opts()上,可以看到
lian.set_global_opts(
#标题title,
#标题左右位置(left 左)center居中
#标题上下位置(bottom 底部)距离底部1%的距离
title_opts=TitleOpts(title="年龄展示",pos_left="center",pos_bottom="1%"),
#图例(默认存在) is_show表示是否展示
legend_opts=LegendOpts(is_show=True),
#工具箱
toolbox_opts=ToolboxOpts(is_show=True),
#视觉映射
visualmap_opts=VisualMapOpts(is_show=True)
)
#通过render()方法将代码生成图表
lian.render()
#如果不懂请联系基础折线图中的代码图解读
系列配置选项
主要针对具体的轴数据配置
详细系列配置到pyecharts - A Python Echarts Plotting Library built with love.查看
例如:
from pyecharts.options import LabelOpts
#设置空坐标系的x轴上的数据,x轴命名,列表数据
lian.add_xaxis(["小王","小李","小肖"])
#设置空坐标系的x轴上的数据,y轴命名,列表数据
#不显示折线上得数字了
lian.add_yaxis("岁数",[18,19,17],label_opts=LabelOpts(is_show=False))
承接全局配置选项里的代码,改动以上内容,得出结果如下:
地图可视化
#利用导包pyecharts的charts模块的Map功能
from pyecharts.charts import Map
#所有项在模块options里,VisualMapOpts视觉映射控制选项
from pyecharts.options import VisualMapOpts
#创建对象
map=Map()
#准备数据,列表内嵌套元组
#对应的省份和数据,注意省份名称要全称
dtat=[
("北京市",10),
("云南省",180),
("山东省",270),
("广东省",2999),
("湖南省",8888),
("湖北省",49999),
("台湾省",999666)
]
#地图名称,数据,地图类型
#(默认中国地图,但我们这里还是写了China),如果要使用省份地图,写对应的省份就行了
#例如:"湖南","河南"
map.add("测试地图",dtat,"china")
#设置全局配置项
map.set_global_opts(
#视觉映射
visualmap_opts=VisualMapOpts(
#显示
is_show=True,
#开启手动校准范围
is_piecewise=True,
#定义范围,列表里面嵌套元组,使用最小,最大值,label(标签),color(颜色)
pieces=[
{"min": 1, "max": 9, "label": "1-9人", "color":"#CCFFFF"},
{"min": 10, "max": 99, "label": "10-99人", "color":"#FFFF99"},
{"min": 100, "max": 999, "label": "100-999人", "color":"#FF9966"},
{"min": 1000, "max": 9999, "label": "1000-9999人", "color":"#FF6666"},
{"min": 10000, "label": "10000人以上", "color":"#CC3333"}
]))
#通过render()方法将代码生成地图,在()内为文件的命名,可写可不写
map.render()
如何写出颜色对应的值
通过在线JSON压缩转义工具-json转义压缩-json数据转义-懒人工具|www.ab173.com,前端,rgb颜色对照表,可以看到对应颜色的值
动态柱状图
基础柱状图
和基础折线图差不多,和折线图不同的是柱状图可以反转x轴和y轴
#利用导包pyecharts的charts模块的Bar功能
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts
#创建对象
bar=Bar()
#系列配置项
#设置坐标系的x轴上的数据,列表数据
bar.add_xaxis(["小王","小李","小肖"])
#设置坐标系的x轴上的数据,y轴命名,列表数据
bar.add_yaxis("岁数",[18,19,17],
#将柱状图的数据从柱子的上侧改成右侧
label_opts=LabelOpts(
#position(位置)改成right(右侧)
position="right"
))
#反转x轴和y轴
bar.reversal_axis()
#通过render()方法将代码生成图表
bar.render()
基础时间线柱状图
#利用导包pyecharts的charts模块的Bar功能创建柱状图
#Timeline用来构建时间线对象
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
#导入主题类型ThemeType
from pyecharts.globals import ThemeType
#创建对象1
bar1=Bar()
bar1.add_xaxis(["湖南","江西","湖北"])
bar1.add_yaxis("人数",[78,89,56],
label_opts=LabelOpts(position="right"))
#反转x轴和y轴
bar1.reversal_axis()
#创建对象2
bar2=Bar()
bar2.add_xaxis(["湖南","江西","湖北"])
bar2.add_yaxis("人数",[115,99,140],
label_opts=LabelOpts(position="right"))
#反转x轴和y轴
bar2.reversal_axis()
#创建对象3
bar3=Bar()
bar3.add_xaxis(["湖南","江西","湖北"])
bar3.add_yaxis("人数",[160,170,130],
label_opts=LabelOpts(position="right"))
#反转x轴和y轴
bar3.reversal_axis()
#创建时间线对象对象,并设置时间线主题,内嵌字典“theme”(主题)LIGHT为主题颜色
timeline=Timeline({"theme":ThemeType.LIGHT})
#在时间线内添加柱状图对象
timeline.add(bar1,"第一个")
timeline.add(bar2,"第二个")
timeline.add(bar3,"第三个")
#设置自动播放
timeline.add_schema(
#自动播放的时间间隔,单位毫秒
play_interval=1000,
#是否在自动播放的时候,显示时间线
is_timeline_show=True,
# 是否自动播放
is_auto_play=True,
#是否循环自动播放
is_loop_play=True
)
#有时间线对象用时间线对象绘图,用bar绘图的话只能出来一个
timeline.render()
主题颜色总结
编号 | 颜色 | |
ThemeType.WHITE | 红蓝 | 默认颜色等bar=Bar() |
ThemeType.LIGHT | 蓝黄粉 | 高亮颜色 |
ThemeType.DARK | 红蓝 | 黑色背景 |
ThemeType.CHALK | 红蓝 绿 | 黑色背景 |
ThemeType.ESSOS | 红黄 | 暖色系 |
ThemeType.INFOGRAPHIC | 红蓝黄 | 偏亮 |
ThemeType.MACARONS | 紫绿 | |
ThemeType.PURPLE_PASSION | 粉紫 | 灰色背景 |
ThemeType.ROMA | 红黑灰 | 偏暗 |
ThemeType.ROMANTIC | 红粉蓝 | 淡黄色背景 |