一、环境配置
Miniconda下载:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Windows-x86_64.exe
(务必勾选“Add Miniconda3 to my PATH environment variable”)
创建环境 conda create -n env_name python=3.10
进入环境 conda activate env_name
退出环境 conda deactivate
二、python基础
Jupyter Notebook 使用
安装 pip install jupyter
打开 jupyter notebook
print输出
·简单的输出
print("hello"+" world")#字符串连接+
print('he said "good"')#单双引号同时使用
print("he said \"let\'s go\"")#单双引号转义:转义符\
print("hello!\nhi!")#换行符\n
#每个print都默认另起一行
#print("hello
#hi")报错
print("""hello
hi
niaho""")
print('''hello
hi
nihao''')#三引号跨行字符串
·format格式化字符串
取代+号,链接字符串
gpa_dict={"小明":3.251,"小花":3.869,"小李":2.683,"小张":3.685}
for name,gpa in gpa_dict.items():
print("{0}你好,你的当前绩点为{1:.2f}".format(name,gpa))
print(f"{name}你好,你的当前绩点为{gpa:.2f}")
#area=...
#print(f"此扇形面积为:{area}")
input输入
输入input()
input函数返回的一律为字符串,必要时要转型
user_weight=float(input("请输入你的体重(单位:kg):"))
user_height=float(input("请输入你的身高(单位m):"))
user_BMI=user_weight /(user_height**2)
print("您的BMI值为"+str(user_BMI))
变量
·命名要求
变量名不能有空格,数字,引号,由文字、数字、下划线组成
下划线命名:字母全部小写,不同单词用下划线分隔user_age
驼峰命名:单词用首字母大写分隔
变量名是大小写敏感的,会看成不同的变量
my_love="1234567890"
print("拨打"+my_love)
my_ex=my_love
my_love ="0987654321"
print("拨打"+my_love)
print("拨打"+my_ex )
print(my_ex +"是前任")
print(my_ex )
·变量类型
整型int,浮点型float
布尔类型bool
a1=True
a2=False
空值类型NoneType
e=None
字符串str
d="hello"
print(len(d))
print(d[0])
print(d[len(d)-1])
type()函数
返回变量类型
print(type(d))
print(type(6))
print(type(6.6))
print(type(a2))
print(type(e))
#运行结果
#<class 'str'>
#<class 'int'>
#<class 'float'>
#<class 'bool'>
#<class 'NoneType'>
计算
·计算
#计算
#3/2==1.5 3//2==1
·数学函数
#数学函数
import math
#math.函数名()
a=math.sin(1)
b=math.log2(8)
print(a)
print(b)
print(2**3)
print(36**(1/2))
print(math.sqrt(36))
a=1
b=9
c=20
delta=b**2-4*a*c
print((-b+math.sqrt(delta))/(2*a))
print(sum([1,-6,23.6,7]))#sum()函数求和
注释
三种方法
·#
·全选注释Ctrl+/
·三引号
"""
33fofkdlddnfie此刻MVv哦皮肤v
VSVS吧
"""
列表
列表的创建
shopping_list=[]
增加/移除列表元素,.pop(索引)删除某索引处的元素
shopping_list.append('键盘')
shopping_list.append("键帽")
shopping_list.append("电竞椅")
print(len(shopping_list))
shopping_list.remove("键帽")
shopping_list[1]="硬盘"
print (len(shopping_list))
print (shopping_list[0])
print(shopping_list)
#shopping_list=["键盘","硬盘"]
列表中的函数运用
price=[799,1024,200,800]
print(max(price))
print(min(price))
print(sorted(price))
字典
名={“键”:“值”,...}
键的类型不可变
字符串,整数,浮点数,布尔类型是不可变的数据类型,可以作为键
列表属于可变数据类型,就不能作为键
#错误示范
#contacts={[”张伟“,23]:“13700000000” ×
# [”张伟“,24]:“13700000001” ×
# [”张伟“,25]:“13700000002”}×
元组 不可变的数据类型,可以作为键
#元组example_tuple=("键盘","键帽")和 列表 区别在于()[],元组不可以像列表一样通 过.append进行添加 .remove进行删除
contacts={("张伟",23):"13700000000",
("张伟",24):"13700000001",
("张伟",25):"13700000002"}
添加 键
dict={"觉醒年代":"名句一",
"YYDS":"名句二"}
dict["双减"]="名句三"
dict["破防"]="名句四"
dict['绝绝子']='名句五'
dict["强国有我"]="名句六"
查询字典中的键 : 用 in (返回布尔值)
query=input("请输入您想要查询的流行语")
if query in dict:
print("您查询的"+query+"含义如下\n"+dict[query])
else:
print("您查询的流行语暂未收录")
print("当前本词典收录的词条为:"+str(len(dict))+"条")
print(dict)
#显示{'觉醒年代': '名句一', 'YYDS': '名句二', '双减': '名句三', '破防': '名句四', '绝绝子': '名句五', '强国有我': '名句六'}
删除字典中的键 del dict[“键名”eg:“双减”]
字典中的函数应用
print(dict.keys())#返回所有键
print(dict.values())#返回所有值
print(dict.items())#返回所有键值对
嵌套字典 名={“键”:{“键”:“值”,...},...} 访问名[键][键]
逻辑运算
and or not
与C语言中的逻辑运算符相对照 and—&&,or—||,not—!
if:...else:.../elif:...
if条件语句
if 条件:######不要漏掉冒号
执行语句缩进四个空格,只要缩进都归if管。else同理。else不能独立于if单独存在
if : elif : elif : else:
for循环
for循环
列表,字典,字符串中的元素都可以迭代
for 变量名(迭代对象里的每个东西) in 可迭代对象:
对每个变量做一些事情
for和range结合
range(起始值,结束值,步长)
步长省略时默认为1,起始值起始值省略默认为0,取不到结束值,只能取到结束值前一值
for num in range(1,10,2):
print(num)#1\n3\n5\n7\n9
total=0
for i in range(1,101):#最后只能取到100,取不到101
total=total+i
print(total)#5050
while循环
while 循环条件:
循环内容
print("我是一个求平均值的程序")
total=0
count=0
user_input=input("请输入数字(完成所有数字输入后,请输入q终止程序):")
while user_input!="q":
total+=float(user_input)
count+=1
user_input=input("请输入数字(完成所有数字输入后,请输入q终止程序):")
if count==0:
result=0
else:
result=total/count
print("您输入的数字的平均值为"+str(result))
函数
·自定义函数
普通函数
def 函数名():
#接下来是一些定义函数的代码
def caculate_secter(central_range,redius):
secter_area=central_range/360*3.14*redius**2
print(f"此扇形的面积为:{secter_area}")
return secter_area
#没有return语句,默认为return None
secter_area_1=caculate_secter(160,30)
secter_area_2=caculate_secter(60,15)
secter_area_3=caculate_secter(30,16)
高阶函数
f(f(x)) 函数名( 参数 ,函数名<不加括号,不加值>)
#格式化函数formatter也可作为高阶函数的参数进行传入
匿名函数
函数名( ,lambda 变量名<参数,参数>:返回的东西<直接写,不用写return>)
#调用时 (匿名函数)(参数,参数...)
·引入模块(python标准库里的模块)
import语句 (推荐使用)
import statistics #ctrl+点击模块名,可查阅包含的函数
print(statistics.median([19,-5,36]))
print(statistics.mean([19,-5,36]))
from...import...语句
from statistics import median,mean
print(median([19,-5,36]))
print(mean([19,-5,36]))
from...import* (若两个模块都引用,且有相同的函数名,易混淆)
from statistics import*
print(median([19,-5,36]))
print(mean([19,-5,36]))
引入第三方模块(python标准库里没有的模块)
需要先下载(pip install)
pypi.org网站可以对第三方库进行搜索
在终端输入pip install 库的名字
下载后,可以用import 库的名字 引用模块,进而用 库.函数 引用函数
常用的Python库 Numpy数值计算 Pandas表格处理 Matplotlib可视化
类
·类
定义属性(对象的性质),定义方法(对象能做什么事情)
通过class关键字,创建一个类
class CuteCat:
定义(该类的) 属性 的函数
def __init__(self,cat_name,cat_age,cat_color):#self绑定到对象自身上,自动运行
#通过__init__这个构造方法可以定义对象有哪些属性
self.name=cat_name#self.name说明是绑定到对象身上的属性,cat_name是普通变量
self.age=cat_age
self.color=cat_color
定义(该类的) 方法 的函数
def speak(self):#第一个参数被占用,用来表示对象自身
print("喵"*self.age)#1岁喵 3岁喵喵喵
def think(self,content):
print(f"小猫{self.name}在思考{content}")
用所创建的类创建新对象
cat1=CuteCat("Jojo",2,"橙色")#通过class的名字()可以调用__init__来创建新对象,并把对应属性赋值
print(f"小猫{cat1.name}的年龄是{cat1.age}岁,花色是{cat1.color}")
cat1.speak()
cat1.think("现在去干嘛")
例题练习
#定义一个学生类
#1.属性包括学生姓名、学号,以及语数英三科的成绩
#2.能够设置学生某科目的成绩
#3.能打印出该学生的所有科目成绩
class Student:
def __init__(self,name,student_id):
self.name=name
self.student_id=student_id
self.grades={"语文":0,"数学":0,"英语":0}
def set_grade(self,course,grade):
if course in self.grades:
self.grades[course]=grade
def print_grades(self):
print(f"学生{self.name}(学号{self.student_id})的成绩为:")
for course in self.grades:
print(f"{course}:{self.grades[course]}分")
zong=Student("小宗",2023001940)
zong.set_grade("语文",90)
zong.set_grade("数学",100)
zong.set_grade("英语",95)
zong.print_grades()
·继承
子类,父类,从属关系,正常情况下,优先执行子类,子类没有再从父类中找
类继承例题练习:
#人力系统
#-员工分为两类:全职员工FullTimeEmployee、兼职员工PartTimeEmployee.
#-全职、兼职都有“姓名 name”、“工号 id”属性
# 都具备“打印信息 print_info”(打印姓名、工号)方法
#-全职有“月薪 monthly_salary”属性
# 兼职有“日薪 daily_salary”属性
#-全职和兼职都有“计算月薪 caculate_monthly_pay”的方法,但具体计算过程不一样
class Employee:
def __init__(self,name,id):
self.name=name
self.id=id
def print_info(self):
print(f"员工名字:{self.name},工号:{self.id}")
class FullTimeEmployee(Employee):
def __init__(self,name,id,monthly_salary):
super(FullTimeEmployee, self).__init__(name, id)#super().__init__(name,id)
self.monthly_salary=monthly_salary
def caculate_monthly_pay(self):
return self.monthly_salary
class PartTimeEmployee(Employee):
def __init__(self,name,id,daily_salary,work_days):
super(PartTimeEmployee, self).__init__(name, id)#super().__init__(name,id)
self.daily_salary=daily_salary
self.work_days=work_days
def caculate_monthly_pay(self):
return self.daily_salary*self.work_days
zhangsan=FullTimeEmployee("张三",1001,6000)
lisi=PartTimeEmployee("李四",1002,230,15)
zhangsan.print_info()
lisi.print_info()
print(f"张三的月薪为:{zhangsan.caculate_monthly_pay()}")
print(f"李四的月薪为:{lisi.caculate_monthly_pay()}")
文件操作
·路径
绝对路径 C:\...\...\
相对路径 用.表示参照文件当前所在目录,用..表示更上一层的父目录,若继续往上走,就用..\.. ,表示当前文件所属目录的父目录的父目录 往下走.\...\
#.\可以省略
同一目录下的文件,想互相用相对路径找到彼此的话,可以直接用文件名
·操作
"r"
open("第一个参数:文件路径","二:模式,shi字符串<不写默认为r只读模式>",“三:encoding<可选参数>表示编码方式,一般都为utf-8”)open函数会返回一个文件对象
#"r"只读模式,"w"写入模式
#“r”若找不到文件,就会报FileNotFoundError,提示文件不存在
f=open(".\data.txt","r",encoding="utf-8")#所读文件和代码文件处于同一个文件夹下,相对路径
content=f.read()#返回字符串,读到结尾,第二次读会读空字符串,没有内容
print(content)#f.read(10)表示读1-10过字节的内容
f.close()#关闭文件
#或
with open(".\data.txt","r",encoding="utf-8") as f:#不用单独关文件
content = f.read() #缩进
print(content) #缩进
print(f.readline())#不缩进代表关闭文件,无法对文件继续进行操作
print(f.readline())#每次读一行,共读两行
#readline会读到文件中每行末尾的换行符,再加上print函数本身就会默认结尾换行,
#所以两个readline读取的两行中间会多一个空行
lines=f.readlines()#返回一个列表[' \n',' \n',' \n',...]
for line in lines:
print(line)
"w"
"w"写入模式(只写)
文件不存在,会自动创建命该名的文件
文件存在,就会先把原本的文件内容清空
with open(".\poem.txt","w",encoding="utf-8") as f:
f.write("关关雎鸠,\n在河之洲。\n窈窕淑女,\n君子好逑。\n")
"a"
"a"附加模式,接着调用"w",即可在原有文件基础上添加内容
文件不存在,会自动创建命该名的文件
with open(".\poem.txt","a",encoding="utf-8") as f:
f.write("参差荇菜,\n左右流之。\n窈窕淑女,\n寤寐求之。\n")
"w""r"都不能用read()读取文件原本的内容
"r+"
文件必须先存在
先读后写,则在文件最后追加内容
先写后读,从顶部开始写,如果顶部有内容会被覆盖(求之不得...参差荇菜...寤寐求之)
with open(".\poem.txt", "r+", encoding="utf-8") as f: #文件必须先存在
print(f.read())
f.write("求之不得,\n寤寐思服。\n悠哉悠哉,\n辗转反侧。\n")
捕捉异常try: except:
从上往下运行,如果第一个except语句捕捉到了对应错误,那么后面的except语句都不会执行
try:
#有可能产生错误的代码
except ValueError:
#产生 值错误 时会运行
except(ZeroDivisionError):
#产生 除零错误 时会运行
except:
#产生其他错误时运行
else:
#没有错误时运行
finally:
#不管发生错误与否都会运行
try:
#有可能产生错误的代码
user_weight=(float(input("请输入您的体重(单位:kg)")))
user_height=(float(input("请输入您的身高(单位:m)")))
user_BMI=user_weight/user_height **2
except ValueError:
#产生 值错误 时会运行
print("输入为不合理数字,请重新运行程序,并输入合理的数字。")
except(ZeroDivisionError):
#产生 除零错误 时会运行
print("身高不能为零,请重新运行程序,并输入正确的数字。")
except:
#产生其他错误时运行
print("发生了未知错误,请重新运行程序。")
else:
#没有错误时运行
print(f"您的BMI值为{user_BMI}")
finally:
#不管发生错误与否都会运行
print("程序运行结束")
测试
·assert 布尔表达式 。 值为True,继续运行,值为False,产生AssertionError断言错误,程序终止
·unittest : 常用的python单元测试库
#把测试代码放到独立文件里//更清晰的划分实现代码和测试代码
#test_测试代码
#import unittest
#from 文件名 import 函数名/类名
import unittest
from 实现代码 import my_adder
class TestAdder(unittest.TestCase):#Test开头命名
#它要当unittest.TestCase的子类,就可使用那些继承自unittest.TestCase的各种测试功能
#这个类下面可以定义不同的测试用例,每一个测试用例都是类下面的一个方法,名字必须以test_开头
#unittest这个库会自动搜寻test_开头的方法,并且只把test_开头的当成测试用例
def test_positive_with_positive(self):
self.assertEqual(my_adder(5,3),8)
def test_negative_with_positive(self):
self.assertEqual(my_adder(-5,3),-2)
#实现代码
def my_adder(x,y):
return x+y
·unittest.TestCase类的常见的测试方法
方法 类似于
assertEqual(A,B) assert A==B
assertTrue(A) assert A is True
assertIn(A,B) assert A in B
assertNotEqual(A,B) assert A!=B
assertFalse(A) assert A is False
assertNotIn(A,B) assert A not in B