目录
一、Python中的概念
二、Python和C/C++中的一些不同点
三、分支语句
四、for循环
五、函数
六、列表[]
1、列表
2、切片
3、列表的遍历
4、列表的插入
5、in/not in/index
6、列表的删除
7、列表的拼接
七、元组()
八、字典{}
1、字典的基本使用
2、合法的key类型
九、Python中的文件操作
1、文件写入
2、文件读取
3、上下文管理器
十、库的使用
1、datetime模块计算日期差
2、os模块制作文件路径搜索工具
3、pip包管理器(下载第三方库)
4、使用第三方库qrcode制作二维码
5、使用第三方库xlrd/xlwc操作excel
6、使用第三方库playsound/pynput制作程序员鼓励师
7、学生管理系统
一、Python中的概念
在PyCharm选中变量按shift + F6可以整体替换变量名
1 + 2 + 3 称为表达式
1 2 3这样的数字称为字面值常量
+ - * /称为运算符或操作符
print(3 ** 2) #3的平方(乘方)
print(3 ** 5) #3的五次方(乘方)
print(3 ** 0.5) #3的0.5次方(开方)
print(7 // 3) #//代表向下取整算法,打印2
print(-7 // 3)#//代表向下取整算法,打印-3
print(type(a)) #查看a的类型,python中变量的类型在其初始化赋值的时候确定。
print(len(s)) #字符串s的长度
a:int = 1 #在声明变量时,可以指明变量类型(锦上添花行为)
#python格式化字符串,输出字符串"a = 20",
#其中的f代表format格式化的意思,此时就可以使用{}往字符串中嵌入变量或表达式
a = 10
print(f"a = {a + 10}")
num = input("请输入数字") #python中的输入,从键盘输入一个值赋值给num
num = int(num) #num的类型是str,如果要将num用于计算,需先类型转换
a = b = 10 #链式赋值
a, b = 10, 20 #多元赋值,10赋值给了a,20赋值给了b。同理a, b = b, a可用于交换变量
python中的内建函数len()可以传字符串、列表、元组、字典、自定义类的长度。(原理:动态类型)
1、print(2 / 3)#0.6666666666666666
python的浮点数在内存中的存储和C/C++一样,同样遵照IEEE754标准
2、python中int范围是无穷的(自动扩容,取决于内存够不够),所以python中没有byte、short、long等类型。int占用4个字节,可能会扩容。
3、python中的float就是双精度浮点数。所以python中也没有double关键字。float占8个字节。
4、python中的string类型是str。特有的三引号s = """My 'name' is "jly" """
5、python中布尔类型开头大写,True/False。布尔也占一个字节。
6、在程序运行过程中,一个变量的类型是动态的,会随着赋值类型的改变而改变。
7、使用#进行单行注释或三引号进行文档注释。
8、python可以直接使用==和!=来比较字符串的内容是否相等。C/C++使用==或!=则会去比较字符串的地址。注意浮点数使用==或者!=进行比大小,由于浮点数在内存中的存储规则,可能会引发误判!!!
9、python可以进行连续比较。
10、python中的and、or、not即为与、或、非,对应C/C++中的&&、||、!
11、python不支持++、--这种自增、自减操作
12、python中存在身份运算符(is、is not)、成员运算符(in、 not in)
13、在python中-19 % 2等于1,而C/C++等于-1
try:
a = int(input("输入1认真学习,输入2摆烂:")) #注意input输入的是字符串
if a == 1:
print("认真学习")
elif a == 2:
print("摆烂")
else:
pass
except ValueError:
print("输入无效,请输入 1 或 2")
可以使用pass充当空语句;try + except捕获异常。python中没有switch关键字。
for 循环遍历 in 可迭代对象:
循环体
#打印1-10
for i in range(1, 11):
print(i)
#打印1,3,5,7,9
for i in range(1, 11, 2):
print(i)
range也是一个内建函数,效果是获得一个包含一系列成员的可迭代对象。range(begin, end)等价于[begin,end),第三个参数代表遍历时的步长,步长默认是1,如果想从10到1倒着遍历,步长可以给负数。
在python中,只有函数和类中的变量才会涉及作用域,其他地方定义的变量均为全局变量。
python特有的一个函数返回多个值:
def GetPoint():
x = 10
y = 20
z = 30
return x, y, z
a, b, c = GetPoint() # 返回值整体接收
_, _, d = GetPoint() # 返回值部分接收,使用_来进行占位
想要在python中修改全局变量,必须在函数体中使用global将变量声明为全局变量:
x = 10
def Test():
global x
x = 20 # 如果没有global x,那么这里的x将会被当做在函数中创建变量x
print(x)
Test() # 打印20
python函数的关键字传参
def Test(x, y):
print(f"x = {x},y = {y}")
Test(x = 10, y = 30) # 打印x = 10,y = 30
Test(y = 20, x= 5) # 打印x = 5,y = 20
python函数的关键字传参和位置传参混用,位置传参必须在前:
列表是可变的:创建好之后,随时能改。一个列表可以存储多种类型。
元组是不可变的:创建好之后,无法修改,只能丢弃旧的,重新弄个新的。
# 创建列表
# 1、直接使用字面值创建
a = [] # []就表示一个空的列表
# 2、使用list()来创建列表
b = list()
# 3、创建列表时,在[]中指定列表的初始值
c = [1, True, [4, 5, 6], "abc"]
# 4、使用内建函数len来获取列表的长度
print(len(c)) # 打印4
# 5、python中的下标,可以写成负数。a[-1]等价于a[len(a) - 1],代表打印最后一个元素
print(c[len(c) - 1]) # 打印abc
print(c[-1]) # 打印abc
切片是一个高效的操作,只是取出了原列表中的一部分,不涉及数据的拷贝。
# 1、切片基本用法:左闭右开
a = [1, 2, 3, 4]
print(a[1:3]) # 左闭右开,打印[2, 3]
# 2、省略边界的切片
print(a[1:]) # 打印[2, 3, 4]
print(a[:3]) # 打印[1, 2, 3]
print(a[:]) # 打印[1, 2, 3, 4]
print(a[:-1]) # 打印[1, 2, 3]右边界是倒数第一个元素
print(a[0:100]) # 打印[1, 2, 3, 4],切片可以越界
# 3、带有步长的切片
print(a[::2]) # 打印[1, 3], 第一个:是切片,第二个:是步长
print(a[::-2]) # 打印[4, 2],步长是负数,从后往前取
# 1、使用for循环遍历列表
a = [1, 2, 3, 4, 5]
for elem in a:
print(elem) # 若此处修改elem的值,并不会改变列表a中对应的元素
# 2、使用for循环控制执行次数,循环体内下标遍历
for i in range(0, len(a)):
print(a[i]) # 若此处修改a[i]的值,可以改变列表a中对应的元素
# 3、使用while循环通过下标进行遍历
i = 0
while i < len(a):
print(a[i])
# 1、使用append往列表末尾新增一个元素
a = [1, 2, 3, 4]
a.append("hello")
# 2、使用insert向列表任意位置进行插入
a.insert(1, "new data") # 在下标为1的位置插入字符串
a = [1, 2, 3, 4]
print(1 in a) # 使用in、not in判断某个元素是否存在于列表
m = a.index(2) # 在列表中找到元素2的下标并返回,如果找不到将抛出异常
# 1、使用pop删除列表末尾的元素
a = [1, 2, 3, 4]
a.pop() # a为[1, 2, 3]
a.pop(1) # 删除下标为1的元素,a为[1, 3]
# 2、使用remove,按照值进行删除
a = [1, 2, 3, 4]
a.remove(2) # a为[1, 3, 4]
# 1、使用+对两个列表进行拼接
a = [1, 2, 3, 4]
b = [5, 6]
c = b + a
print(c) # 打印[5, 6, 1, 2, 3, 4]
# 2、使用extend对两个列表进行拼接
# 后一个列表会被拼接到前一个列表末尾,这种方法对前一个列表进行修改
m = a.extend(b)
print(a) # 打印[1, 2, 3, 4, 5, 6]
print(m) # 打印None
# 3、使用+=对列表进行拼接,效果和extend一样,但extend更高效
a = [1, 2, 3, 4]
b = [5, 6]
a += b
print(a) # 打印[1, 2, 3, 4, 5, 6]
元组不支持修改操作!!!对于元组这种不可变对象,是可以作为哈希的key值的。
# 1、创建元组
a = ()
b = tuple()
# 2、创建元组的时候,指定初始值
c = (1, [1, 3], "hello", (5, 1, 3))
print(c) # 打印(1, [1, 3], 'hello', (5, 1, 3))
# 3、通过下标访问元组中的元素
print(c[1]) # 打印[1, 3]
print(c[-2]) # 打印hello
print(c[100]) # 访问越界,抛出异常
# 4、通过切片获取元组中的一部分
print(c[1:3:1]) # 打印([1, 3], 'hello')
# 5、也可以使用循环遍历元素、in/not in判断元素是否存在、index查找下标
# 6、使用+拼接两个元组
d = (1, 2, 3)
e = (4, 5, 6)
f = d + e
print(f) # 打印(1, 2, 3, 4, 5, 6)
当进行多元赋值的时候,本质上是按照元组的方式进行工作的:
def GetPoint():
x = 10
y = 20
return x, y
m, n = GetPoint() # 多元赋值,本质是使用了元组
字典中的key不能重复。对于字典来说,使用in或者[]来获取value,都是非常高效的。(底层是哈希表,擅长增删改查,不擅长遍历)
在C++和java中,哈希表中的键值对存储的顺序,是无序的,但在Python中,遍历出来的顺序即为插入的顺序。(做了特殊处理)
# 1、创建字典
a = {}
b = dict()
# 2、创建字典的同时设置初始值,key的类型可以不统一
c = {
"id": 1,
"name": "张三",
100: "李四",
(1, 2, 3): "王五"
}
# 3、使用in来判定某个key是否在字典中存在
print((1, 2, 3) in c) # 打印true
# 4、使用[]来根据key获取value
print(c["name"]) # 打印张三,若key不存在,则抛出KeyError异常
# 5、在字典中新增键值对/修改键值对(key不存在则新增,存在则为修改)
c['score'] = 50 # 新增键值对
c["id"] = 999 # 修改键值对
# 6、使用pop方法,根据key删除键值对
c.pop("id")
# 7、使用for循环遍历字典
for key in c:
print(key, c[key])
# keys()获取字典中的所有key;values获取字典中的所有values;items获取字典中的所有键值对
print(c.keys()) # 打印dict_keys(['name', 100, (1, 2, 3), 'score'])
print(c.values()) # 打印dict_values(['张三', '李四', '王五', 50])
print(c.items()) # 打印dict_items([('name', '张三'), (100, '李四'), ((1, 2, 3), '王五'), ('score', 50)])
for key, value in c.items(): # c.items()返回一个列表,列表中的每一个元素是元组,这里是元组的多元赋值
print(key, value)
字典的本质是一个哈希表,哈希表的key值要求是可哈希的,不能改的。
# 使用hash()函数能够计算出一个变量的哈希值
print(hash(0))
print(hash(3.14))
print(hash("hello"))
print(hash(True))
print(hash((1, 2, 3)))
# 有的类型是不能计算哈希值的
print(hash([1, 2, 3])) # 列表不能计算哈希值,因为列表可修改,无法作为key
print(hash({})) # 字典不能计算哈希值,因为字典可修改,无法作为key
Python中有一个垃圾回收机制GC,会自动把不使用的变量进行释放。(注意释放不一定及时,尽量记得手动关闭资源)
# 打开文件,r:文件不存在,则抛出异常。w:清空写入,若文件不存在,则新建。a:等于追加写入的'w'
f = open("C:/Users/86151/Desktop/新建文本文档.txt", 'w') # f是文件对象的句柄
# 文件的写入
f.write("hello")
# 关闭文件
f.close()
# 读取文件
f = open("C:/Users/86151/Desktop/新建文本文档.txt", 'r', encoding = 'utf8') # 默认的是gbk
result = f.read(30)
print(result)
f.close()
# for循环按行读取
f = open("C:/Users/86151/Desktop/新建文本文档.txt", 'r', encoding = 'utf8') # 默认的是gbk
for line in f:
print(f"line = {line}", end = "")
f.close()
# 使用readlines()把整个文件全部读出来,按行存到一个列表里
f = open("C:/Users/86151/Desktop/新建文本文档.txt", 'r', encoding = 'utf8') # f是文件对象的句柄
lines = f.readlines()
print(lines) # 打印['床前明月光\n', '疑是地上霜\n', '举头望明月\n', '低头思故乡']
f.close()
def func():
with open("C:/Users/86151/Desktop/新建文本文档.txt", 'r', encoding = 'utf8') as f:
# 进行文件处理的逻辑
return # with块中的代码执行完毕后,f就会被自动释放
# 三种写法
import datetime
date1 = datetime.datetime(1850, 3, day = 9) # 从datetime模块构造datetime类的对象
date2 = datetime.datetime(2000, 4, 16)
print(date2 - date1)
from datetime import datetime # 从datetime模块中导入datetime类
date3 = datetime(1850, 3, day = 9) # 对象的构造
date4 = datetime(2000, 4, 16)
print(date4 - date3)
import datetime as dt # 导入datetime模块并将其重命名为dt
date5 = dt.datetime(1850, 3, day = 9) # 对象的构造
date6 = dt.datetime(2000, 4, 16)
print(date6 - date5)
# 输入要查找的路径,输入要搜索的文件名(一部分)
import os
inputPath = input("请输入要查找的路径:")
pattern = input("请输入要搜索的关键词:")
# dirPath:遍历到当前位置对应的路径。dirNames:是一个列表,表示当前目录下有哪些目录。fileNames:列表,当前目录下的所有文件名
# os.walk(inputPath)每次调用都能自动对子目录进行递归操作,获取所有的路径
for dirPath, dirNames, fileNames in os.walk(inputPath):
for f in fileNames:
if pattern in f:
print(f"{dirPath}/{f}")
官网:pypi.org
pip install 【库名】
如果下载超时可使用:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 【库名】
import qrcode
img = qrcode.make("www.baidu.com")
img.save("qrcode.png")
xlrd模块可以用于读取excel,xlwc模块可以用于修改excel。
#安装命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd==1.2.0
统计100班的平均分:
import xlrd
# 1、先打开xls文件
xls = xlrd.open_workbook("C:/Users/86151/Desktop/新建 XLS 工作表.xls")
# 2、获取到指定的工作表
table = xls.sheet_by_index(0)
# 3、获取表格中有多少行
lines = table.nrows
# 4、进行循环统计操作
total = 0 # 总分
count = 0 # 100班的人数
for i in range(1, lines): # 跳过第一行表头
# 拿到当前同学的班级id
classId = table.cell_value(i, 1) # i行1列获取id
if classId == 100:
total += table.cell_value(i, 2)
count += 1
avg = total / count
print(avg)
playsound库用于播放音频;pynput库用于监听键盘按键
#安装命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple playsound==1.2.2
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pynput==1.6.8
import random
from threading import Thread
from pynput import keyboard
from playsound import playsound
count = 0 # 记录用户按了多少次键盘
soundList = ["newDir/aaa.mp3"]
def onRelease(key):
"""
这个函数,在用户释放键盘按键的时候,就会被调用
:param key:代表用户按下了那个键
:return:None
"""
global count
count += 1
if count % 10 == 0:
# 播放音频
i = random.randint(0, len(soundList) - 1)
# 此处播放音频,消耗时间较多,会引起输入的卡顿
# 可以创建一个线程,让线程去播放音频
# 注意参数应该是一个元组,因此需要在单个参数后加逗号
t = Thread(target=playsound, args=(soundList[i], )) # 等价于playsound(soundList[i])
t.start()
# 创建好listener之后,用户键盘的动作就会被捕获
listener = keyboard.Listener(on_release=onRelease)
listener.start()
listener.join()
# 实现命令行版本的学生管理系统
import os.path
import sys
students = [] # 使用这个全局变量来管理所有学生
def Save():
with open("record.txt", 'w', encoding='utf8') as f:
for s in students:
f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}\n")
print(f"存档成功,共存储了{len(students)}条记录")
def Load():
# 如果存档文件不存在,则直接return
if not os.path.exists("record.txt"):
return
global students
students = [] # 清空操作
with open("record.txt", 'r', encoding='utf8') as f:
# 按行读取文件
for line in f: # 对读取到的一行数据按照\t进行切分,切分前要去除末尾的换行
line = line.strip() # 去掉一个字符串头尾的空白符(空格、换行、回车、制表符、翻页符等)
tokens = line.split('\t')
if len(tokens) != 4:
print(f"当前行格式存在问题line = {line}")
continue
student = {
"studentId": tokens[0],
"name": tokens[1],
"gender": tokens[2],
"className": tokens[3]
}
students.append(student)
print(f"读取成功,共读取了{len(students)}个学生数据!")
def menu():
print("1、新增学生")
print("2、显示学生")
print("3、查找学生")
print("4、删除学生")
print("0、退出程序")
choice = input("请输入您的选择:")
return choice
def Insert():
studentId = input("请输入学生的学号:")
name = input("请输入学生的姓名:")
gender = input("请输入学生的性别:")
if gender not in ("男", "女"):
print("输入的性别不符合要求,新增失败")
return
className = input("请输入学生的班级:")
# 使用一个字典把上述的信息组合起来
student = {
"studentId": studentId,
"name": name,
"gender": gender,
"className": className
}
# 将字典student添加到全局列表students中
students.append(student)
Save()
print("新增成功")
def Find():
name = input("请输入要查找的同学姓名:")
count = 0
for s in students:
if name == s["name"]:
print(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}")
count += 1
print(f"查找结束,总共找到了{count}个同学。")
def Show():
# 遍历全局列表,打印出其中的字典
for s in students:
print(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}")
print(f"显示成功,共显示了{len(students)}条数据!")
def Delete():
studentId = input("请输入要删除的学生的学号:")
for s in students:
if studentId == s["studentId"]:
students.remove(s)
print(f"删除{s['name']}同学的信息!")
Save()
print("删除学生成功")
def main():
"""
入口函数
"""
# 通过控制台和用户交互
print("------------------------------")
print("----------不学生管理系统---------")
print("------------------------------")
Load()
while True:
# 通过menu()函数打印菜单项
choice = menu()
if choice == "1":
Insert()
elif choice == "2":
Show()
elif choice == "3":
Find()
elif choice == "4":
Delete()
elif choice == "0":
print("goodBye!")
sys.exit()
else:
print("您的输入有误,重新输入")
main()