赞
踩
本文档基于B站Python教程
print(520)
print(98.5)
print('hello world')
print("hello world")
print(3+1)
fp = open('D:/text.txt','a+')
print('hello world',file=fp)
fp.close
**注意:**1.所指定的盘符必须存在;2.使用 file=fp;3.a+表示文件不存在就创建,存在的话就在内容上继续追加。
不进行换行输出:
print('hello','world','Python')
print('hello \n world') #\ +转义功能的首字母 n--newline的首字母表示换行
print('hello \t world') #\t 水平制表符,一组4个空格的位置
print('helloooo \t world')
print('hello \r world') #\r 回车把hello覆盖
print('hello \b world') #\b 退一个格将o退没了
print('http:\\\\www.baidu.com') #\\输出一个\,\\\\输出2个\
print(' 老师说:\’大家好\‘ ')
不希望字符串中的转义字符起作用,字符串前加上r或者R
print(r'hello \n world')
**注意事项:**最后一个字符不能是反斜杠\,但是是两个\\可以。
计算机只认识0和1。ASCII表来表示符号和数字。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6AbmkF7-1625580399562)(https://static01.imgkr.com/temp/d141123ef9d94013a8e0c3f6a025a7c9.png)]
‘A’ 使用了8个位(bit)才能表示出来,在计算机他们叫一个字节(byte)。
0
1
0
0
0
0
0
1
\qquad0 \qquad 1\qquad 0\qquad 0\qquad0\qquad0\qquad 0\qquad 1\qquad
01000001
1024 byte = 1 kB ; 1024 kB = 1 MB ;
1024 MB = 1 GB ; 1024 GB = 1 TB.
二进制0,1 → ASCII → GB2312 → GB18030 → Unicode → UTF-8
# 汉字“乘”与进制数的转换
print(chr(0b100111001011000)) #0b代表二进制
print(ord('乘')) #得到'乘'所代表的十进制数
有一些单词被赋予了特定的意义,这些单词在用户给任何对象起名字的时候不允许使用。
import keyword
print(keyword.kwlist) #查看所有的保留字
标识符是指变量、函数、类、模块和其他对象的名字。
其规则是:
- 字母、数字、下划线
- 不能以数字开头
- 不能是Python的保留字
- 严格区分大小写
变量是内存中一个带标签的盒子。下例中,name表示变量名,=是复制运算符,玛丽亚是值。
name = '玛丽亚'
print(name)
print('标识',id(name))
print('类型',type(name))
print('值',name)
变量由三部分组成:
当多次复制后,变量名会指向新的空间,旧的空间称为内存垃圾。
name = '玛丽亚'
print(name)
name = '楚留冰'
print(name)
常用的数据类型:
整数的不同进制表示方法:
n1 = 90
n2 = -76
n3 = 0
print(n1,type(n1))
print(n2,type(n2))
print(n3,type(n3))
#整数可以表示为二进制,十进制,八进制,十六进制
print('十进制',118)
print('二进制',0b10101111) #二进制以0b开头,0,1
print('八进制',0o176) #八进制以0o开头,0-7
print('十六进制',0x1EAF) #十六进制以0x开头,0-9,A-F
a = 3.14159
print(a,type(a))
n1 = 1.1
n2 = 2.2
n3 = 2.1
print(n1+n2) #结果出现很多0,计算不准确,二进制的底层问题,会有误差
print(n1+n3)
from decimal import Decimal #导入模块decimal解决不准确的问题
print(Decimal('1.1')+Decimal('2.2'))
f1 = True
f2 = False
print(f1,type(f1))
print(f2,type(f2))
#布尔值转化为整数计算
print(f1+1) #2 1+1的结果为2,True表示1
print(f2+1) #1 0+1的结果为1,False表示0
str1 = '人生苦短,我用Python'
print(str1,type(str1))
str2 = "人生苦短,我用Python"
print(str2,type(str2))
str3 = '''人生苦短,
我用Python'''
print(str3,type(str3))
str4 = """人生苦短,
我用Python"""
为什么需要数据类型的转换?将不同类型的数据拼接到一起。
name = '张三' age = 20 print(type(name),type(age)) #说明name和age的数据类型不同 print('我叫' +name+ '今年' +str(age)+ '岁' ) #将int类型通过str()转换为str类型 print('---str()将其他类型转换成str类型---') a = 10 b = 198.8 c = False print(typr(a),type(b),type(c)) print(str(a),str(b),str(c),type(str(a)),type(str(b)),type(str(c))) print('---int()将其他类型转换成int类型---') s1 = '128' f1 = 98.7 s2 = '76.77' ff = True s3 = 'hello' print(type(s1),type(f1),type(s2),type(ff),type(s3)) print(int(s1),type(int(s1))) #str转换成int类型,字符串为数字串 print(int(f1),type(int(f1))) #float转换成int类型,只截取整数部分,舍去小数部分 #print(int(s2),type(int(s2))) #str转换成int类型报错,因为字符串为小数串 print(int(ff),type(int(ff))) #bool转换成int类型 #print(int(s3),type(int(s3))) #str转换成int类型报错,字符串必须是数字串且是整数,非数字串不允许转换 print('---float()函数,将其他数据类型转换成float类型---') s4 = '128.96' s5 = '76' ff1 = True s6 = 'hello' i = 98 print(type(s4),type(s5),type(s6),type(ff1),type(i)) print(float(s4),type(float(s4))) print(float(s5),type(float(s5))) print(float(ff1),type(float(ff1))) #print(float(s6),type(float(s6))) #字符串中数据为非数字串,不允许转换 print(float(i),type(float(i)))
注释是在代码中对代码的功能进行解释说明的标注性文字,可以提高代码的可读性,注释的内容会被Python解释器忽略。通常包含三种类型的注释:
#输入功能(单行注释)
print('hello')
'''嘿嘿,
我是多行注释'''
input()函数的基本使用:present=input(‘大圣想要什么礼物呢?’)
其中present是变量,=是赋值运算符,将输入函数的结果赋值给变量present,input函数是一个输入函数,需要输入回答。
#输入函数input
present = input('大圣想要什么礼物呢?')
print(present,type(present))
#要求从键盘录入两个整数,计算两个整数的和
a = input('请输入一个加数:')
a = int(a)
b = input('请输入另一个加数:')
b = int(b)
print(type(a),type(b))
print(a+b) #对str类型的两个量进行连接,对int类型的两个量进行计算
算术运算符(标准算术运算符,取余运算符,幂运算符)
print(1+1) #加法运算
print(1-1) #减法运算
print(2*4) #乘法运算
print(11/2) #除法运算
print(11//2) #整除运算
print(11%2) #取余运算
print(2**3) #幂运算,2的3次方
#一正一负整除运算 向下取整
print(9//4) #2
print(-9//-4) #2
print(9//-4) #-3
print(-9//4) #-3
#一正一负取余运算 公式:余数=被除数-除数*商
print(9%-4) #9-(-4)*(-3)=-3
print(-9%4) #-9-4*(-3)=3
赋值运算符=
#赋值运算符 i = 3+4 print(i) #运算顺序从右到左 a = b = c = 20 #链式赋值 print(a,id(a)) print(b,id(b)) print(c,id(c)) print('---支持参数赋值---') a = 20 a += 30 #相当于a=a+30 print(a) a -= 10 print(a) a *= 2 print(a) #int类型 print(type(a)) a /= 3 print(a) print(type(a)) #float a //= 2 print(a) print(type(a)) a %= 3 print(a) print('---解包赋值---') a,b,c = 20,30,40 print(a,b,c) print('---交换两个变量的值---'') a,b = 10,20 print('交换之前:',a,b) a,b = b,a #交换 print('交换之后:',a,b)
比较运算符对变量或表达式的结果进行大小、真假等比较。
a,b = 10,20 print('a>b吗?',a>b) #False print('a<b吗?',a<b) #True print('a<=b吗?',a<=b) #True print('a>=b吗?',a>=b) #False print('a==b吗?',a==b) print('a!=b吗?',a!=b) '''一个 = 称为赋值运算符, == 称为比较运算符 一个变量由三部分组成,标识(id),类型(type),值(value) == 比较的是值还是标识呢? 答案是比较的是值 比较对象的标识使用 is ''' a = 10 b = 10 print(a==b) #True 说明a与b的value相等 print(a is b) #True 说明a与b的id标识相等 lst1=[11,22,33,44] lst2=[11,22,33,44] print(lst1 == lst2) #value --True print(lst1 is lst2) #id --False print(id(lst1)) print(id(lst2)) print(a is not b) #False print(lst1 is not lst2) #True
布尔运算符对于布尔值之间的运算。and,or,not,in,not in
#布尔运算符 a,b = 1,2 print('----and----') print(a==1 and b==2) #True and True -->True print(a==1 and b<2) #True and False -->False print(a!=1 and b==2) #False and True -->False print(a!=1 and b!=2) #False and False -->False print('----or----') print(a==1 or b==2) print(a==1 or b<2) print(a!=1 or b==2) print(a!=1 or b!=2) print('----not-----') f = True f2 = False print(not f) print(not f2) print('----in与not in------') s = 'helloworld' print('w' in s) print('k' in s) print('w' not in s) print('k' not in s)
位运算符将数据转换成二进制进行计算。
print(4 & 8) #按位与
print(4 | 8) #按位或
print(4 << 1) #向左移动1位置
print(4 << 2)
print(4 >> 1)
print(4 >> 2)
** *,/,//,% +,- <<,>> & | >,<,>=,<=,==,!= and or =
算术 → 位 → 比较(True False)→ 布尔 → 赋值=
任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。
程序从上到下顺序地执行代码,中间没有任何地判断和跳转,直到程序结束。
程序开始 → 代码1 → 代码2 → … → 代码N → 程序结果
'''把大象装冰箱一共分几步'''
print('-------程序开始--------')
print('1.把冰箱门打开')
print('2.把大象放到冰箱里')
print('3.把冰箱门关上')
print('------程序结束---------')
Python一切皆对象,所有对象都有一个布尔值,获取对象地布尔值使用内置函数bool()
以下对象地布尔值为False
#测试对象地布尔值 print('----------布尔值均为False---------') print(bool(False)) print(bool(0)) print(bool(0,0)) print(bool(None)) print(bool('')) print(bool("")) print(bool([])) #空列表 print(bool(list())) #空列表 print(bool(())) #空元组 print(bool(tuple())) #空元组 print(bool({})) #空字典 print(bool(dict())) #空字典 print(bool(set())) #空集合 print('------------布尔值为True-------------') print(bool(18)) print(bool(True)) print(bool('helloworld'))
程序根据判断条件地布尔值选择性地执行部分代码,明确地让计算机知道在什么条件下该去做什么。
money = 1000 #余额
s = int(input('请输入取款金额:')) #取款金额
#判断余额是否充足
if money >= s:
money = money - s
print('取款成功,余额为:',money)
'''从键盘录入一个整数,编写程序使计算机判断奇偶 '''
num = int(input('请输入一个整数:'))
if num % 2 == 0:
print(num,'是偶数')
else:
print(num,'是奇数')
'''多分支结构,多选一执行 从键盘录入一个整数成绩 90-100 A 80-89 B 70-79 C 60-69 D 0-59 E 小于0或大于100 为非法数据(不是成绩的有效范围) ''' score = int(input('请输入一个成绩:')) #判断 if score >= 90 and score <= 100: #Python语句独有特点也可写作 if 90 <= score <= 100: print('A级') elif score >= 80 and score <= 89: print('B级') elif score >= 70 and score <= 79: print('C级') elif score >= 60 and score <= 69: print('D级') elif score >= 50 and score <= 59: print('E级') else: print('对不起,成绩有误,不在成绩的有效范围')
'''会员 >= 200 8折 >= 100 9折 不打折 非会员 >=200 9.5折 不打折''' answer = input('您是会员吗?y/n \n') money = float(input('请输入您的购物金额:')) #外层判断是否是会员 if answer == 'y': #会员 if money >= 200: print('打8折,付款金额为:',money*0.8,'元') elif money >= 100: print('打9折,付款金额为:',money*0.9,'元') else: print('不打折,付款金额为:',money,'元') else: #非会员 if money >= 200: print('打9.5折,付款金额为:',money*0.95,'元') else: print('不打折,付款金额为:',money,'元')
条件表达式是if…else的简写,语法结构为:x if 判断条件 else y
运算规则:如果判断条件的布尔值为True,条件表达式的返回值为x,否则条件表达式的返回值为False。
'''从键盘录入两个整数,比较两个整数的大小'''
num_a = int(input('请输入第一个整数:'))
num_b = int(input('请输入第二个整数:'))
#比较大小
if num_a >= num_b:
print(num_a,'大于等于',num_b)
else:
print(num_a,'小于',num_b)
print('---------使用条件表达式进行比较-------------')
print(( str(num_a) + '大于等于' + str(num_b)) if num_a>=num_b else str(num_a)+'小于'+str(num_b))
语句什么都不做,只是一个占位符,用在语法上需要语句的地方。
#pass语句
answer = input(‘您是会员吗?y/n’)
if answer == 'y':
pass
else:
pass
range()函数用于生成一个整数序列,其返回值是一个迭代器对象。
创建range对象的三种方式:
#range的三种创建方式 ''' 第一种创建方式,只有一个参数''' r = range(10) #[0 1 2 3 4 5 6 7 8 9] 默认从0开始,步长为1 print(r) print(list(r)) #用于查看range对象中的整数序列 --list是列表函数 ''' 第二种创建方式,括号里给了两个参数''' r = range(1,10) #指定了起始值和终止值,区间左闭右开[1,10) print(list(r)) ''' 第三种创建方式,括号里给出三个参数''' r = range(1,10,2) print(list(r)) ''' 判断指定的整数在序列中是否存在in,not in''' print(10 in r) print(9 in r) print(10 not in r) print(9 not in r) print(range(1,20,1)) print(range(1,101,1)) #未使用时,上下两个所占内存一样
循环时反复作同一件事情的情况,用于次数不固定的循环,初始条件不成立,一次都不执行。
a = 1
#判断条件表达式
if a < 10: #if改为while重新运行,结果是1 2 3 4 5 6 7 8 9
print(a)
a += 1
#if与while的区别是:if判断一次,条件True执行一行;while是判断N+1次,条件是True执行N次
四步循环法:
#计算0到4的累加和
sum = 0 #用于存储累加和
'''初始化变量为0'''
a = 0
'''条件判断'''
while a < 5:
'''条件执行体(循环体)'''
sum += a
'''改变变量'''
a += 1
print('和为',sum)
'''计算1到100之间的偶数和'''
sum = 0 #用于存储偶数和
a = 1 #初始化变量
while a <= 100 #条件判断
#条件执行体(求和)
if a%2 == 0: # if not bool(a%2): 意味着0的布尔值为False
sum += a
a += 1
print('1到100的偶数和',sum)
语法结构为:for 自定义的变量 in 可迭代对象
循环体
for item in 'Python' #第一次取出来的是P,赋值给item,输出 print(item) #range()产生一个整数序列,也是一个可迭代对象 for i in range(10) print(i) #如果在循环体中不需要使用自定义变量,可将自定义变量写为_ for _ in range(5) print('人生苦短,我用Python') '''使用for循环计算1到100之间的偶数和''' sum = 0 for item in range(1,101): if item % 2 == 0: sum += item print('1到100之间的偶数和为:',sum)
'''输出100到999之间的水仙花数
举例 153 =3*3*3+5*5*5
1*1*1'''
for item in range(100,1000):
ge = item %10
shi = item // 10 % 10
bai = item // 100
print(bai,shi,ge)
if ge**3+shi**3+bai**3 == item:
print(item)
break语句用于结束循环结构,通常与分支结构if一起使用
'''从键盘录入密码,最多录入三次,如果正确就结束循环'''
for item in range(3):
pwd = input('请输入四位数密码:')
if pwd == '8888';
print('密码正确')
break
else:
print('密码不正确')
a = 0
while a < 3:
pwd = input('请输入四位数密码:') #条件执行体
if pwd == '8888':
print('密码正确')
break
else:
print('密码不正确')
a += 1 #改变变量
continue语句用于结束当前循环,进入下一次循环,通常与分支结构中的if一起使用
'''要求输出1到50之间所有5的倍数:和5的余数为0的数
什么样的数不是5的倍数?与5的余数不是0的数'''
for item in range(1,51):
if item % 5 == 0:
print(item)
print('----------使用continue----------')
for item in range(1,51):
if item % 5 != 0:
continue
print(item)
else语句与其他语句配合使用。
与if配合使用,if条件表达式不成立时执行else;与for和while配合使用时,没有碰到break时执行else。
for item in range(3):
pwd = input('请输入密码:')
if pwd == '8888':
print('密码正确')
break
else:
print('密码不正确')
else:
print('对不起,三次密码均输入错误。')
a = 0
while a < 3;
if pwd == '8888':
print('密码正确')
break
else:
print('密码不正确')
'''改变变量'''
a += 1
else:
print('对不起,三次密码均输入错误')
嵌套循环时循环结构中又嵌套了另外的完整的循环结构,其中内层循环作为外层循环的循环体执行。
'''输出一个三行四列的矩形'''
for i in range(1,4): #行表,执行三次,一次是一行
for j in range(1,5);
print('*',end = '\t') #不执行输出
print() #打行
'''九九乘法表'''
for i in range(10):
for j in range(1,i+1):
print(i,'*',j,'=',i*j,end = '\t')
print()
二重循环中的break和continue用于控制本层循环。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dr4rq51B-1625580399567)(…/PythonProjects/Typora_image/30103d82496e45068a9c2b6347526c65.png)]
'''流程控制语句break与continue在二重循环中的使用'''
for i in range(5): #外层循环执行5次
for j in range(1,11):
if j%2 == 0:
break
#continue
print(j)
#print(j,end = '\t')
#print()
为什么需要列表?
a = 10 #变量存储地是一个对象的引用
lst = ['hello','world',98]
print(id(lst))
print(type(lst))
print(lst)
创建方式:1.使用中括号;2.调用内置函数list()
lst = ['hello','world',98] #使用中括号创建列表
print(lst)
lst2 = list(['hello','world',97]) #使用内置函数list()创建列表
列表的特点:
lst = ['hello','world',98,'hello']
print(lst,index('hello')) #列表存在多个相同元素,只返回列表第一个索引
#print(lst,index('Python')) #查询元素不存在ValueError:'Python' is not in list
#print(lst,index('hello',1,3)) ValueError
print(lst,index('hello',1,4)) #指定在start到stop之间进行查找
lst = ['hello','world',98,'hello','world',234]
print(lst[2]) #获取索引为2的元素
print(lst[-3]) #获取索引为-3的元素
#print(lst[10]) #IndexError:list index out of range超出索引范围,真想从0到N-1,逆向从-N到-1
lst = [10,20,30,40,50,60,70,80]
print(lst[1:6:1]) #start=1 stop=6 step=1切片切出一个新列表
print('原列表',id(lst))
lst2 = lst[1:6:1]
print('切的片段:',id(lst2))
print(lst[1:6])
print(lst[1:6:]) #step不写默认从1开始
print(lst[1:6:2])
print(lst[:6:2]) #start不写默认从0开始
print(lst[1::2]) #stop不写默认最后一个元素
print('--------------step为负数的情况-------------')
print('原列表:',lst)
print(lst[::-1])
print(lst[7::-1])
print(lst[6:0:-2])
print('p' in 'python')
print('k' not in 'python')
lst = [10,20,'python','hello']
print(10 in lst)
print(100 in lst)
print(10 not in lst)
print(100 not in lst)
lst = [10,20,'python','hello']
for item in lst:
print(item)
#向列表的末尾添加一个元素
lst = [10,20,30]
print('添加元素之前',lst)
lst.append(100)
print('添加元素之后',lst,id(lst))
lst2 = ['hello','world']
lst.append(lst2) #将lst2作为一个元素添加到列表的末尾
print(lst)
lst.extend(lst2) #向列表的末尾一次性添加多个元素
print(lst)
lst.insert(1,90) #在任意位置添加一个元素
print(lst)
lst3 = [True,False,'hello']
lst[1:] = lst3 #切片替换
print(lst)
lst = [10,20,30,40,50,60,30] lst.remove(30) #重复元素只删除第一个 print(lst) #lst.remove(100) #移除元素不存在ValueError #pop根据索引移除元素 lst.pop(1) print(lst) #lst.pop(8) #IndexError lst.pop() #默认删除最后一个元素 print(lst) print('-------切片操作删除至少一个元素,将产生一个新的列表对象-----------') new_lst = lst[1:3] print('原列表',lst) print('新列表',new_lst) '''不产生新的列表对象,而是删除原列表的内容''' lst[1:3] = [] print(lst) '''清除列表中的所有元素''' lst.clear() print(lst) '''del语句将列表对象删除''' del lst
lst = [10,20,30,40]
#一次修改一个值
lst[2] = 100
print(lst)
lst[1:3] = [300,400,500,600]
print(lst)
lst = [20,40,10,98,54] print('排序前的列表',lst,id(lst)) #调用列表对象的sort方法,默认升序 lst.sort() print('排序后的列表',lst,id(lst)) #指定参数进行降序 lst.sort(reverse = True) print(lst) lst.sort(reverse = False) print(lst) print('-------调用内置函数sorted()对列表对象进行排序,产生一个新的列表对象----') lst = [20,40,10,98,54] print('原列表',lst) new_lst = sorted(lst) print(lst) print(new_lst) desc_lst = sorted(lst,reverse =True print(desc_lst)
列表生成式简称生成列表的公式。
语法格式:
[i*i for i in range(1,10)]
lst = [i for i in range(1,10)]
lst1 = [i*i for i in range(1,10)]
print(lst)
print(lst1)
'''列表中的元素的值为2 4 6 8 10 '''
lst2 = [i*2 for i in range(1,6)]
print(lst2)
什么是字典?Python内置的数据结构之一,与列表一样是一个可变序列;以键值对的方式存储数据,字典是一个无序的序列。
scores = {‘张三’:100,‘李四’:98,‘王五’:45}
字典的实现原理:字典的实现原理与查字典类似,查字典是先根据部首或拼音查找对应的页码,Python中的字典是根据key查找Value所在的位置。
'''使用{}创建字典'''
scores = {'张三':100,'李四':98,'王五':45}
print(scores)
print(type(scores))
'''使用内置函数dict'''
student = dict(name='jack',age=20)
print(student)
'''空字典'''
d = {}
print(d)
[]取值与使用get()取值的区别:
'''获取字典中的值'''
scores = {'张三':100,'李四':98,'王五':45}
''' 第一种方式,使用[]'''
print(scores['张三'])
print(scores['陈六']) #KeyError
'''第二种方式 使用get'''
print(scores,get('张三'))
print(scores,get('陈六')) #None
print(scores,get('麻七',99)) #99是在查找麻七对应的value不存在时,提供的一个返回值
'''key的判断'''
scores = {'张三':100,'李四':98,'王五':45}
print('张三' in scores)
print('张三' not in scores)
del scores['张三'] # 删除指定的key-value对
#scores.clear() #清空字典元素
print(scores)
scores['陈六'] = 98 #新增元素
print(scores)
scores['陈六'] = 100 #修改元素
print(scores)
获取字典视图的三个方法:keys、values、items
scores = {'张三':100,'李四':98,'王五':45}
#获取所有的key
keys = scores.keys()
print(keys)
print(type(keys))
print(list(keys)) #将所有的key组成的视图转成列表
#获取所有的Value
values = scores.values()
print(values)
print(type(values))
print(list(values))
#获取所有的key-value对
items = scores.items()
print(items)
print(list(items)) #转换之后的列表元素为元组
#字典元素的遍历
scores = {'张三':100,'李四':98,'王五':45}
for item in scores:
print(item,scores[item],scores.get(item))
d = {'name':'张三','name':'李四'}
print(d)
d = {'name':'张三','nikename':'张三'}
print(d)
内置函数zip():用于将可迭代对象作为参数,将对象中对应地元素打包成一个元组,然后返回由这些元组组成的列表
items = ['Fruits','Books','Others']
prices = [96,78,85,100,120]
d = {item.upper():prices for item,prices in zip(items,prices)}
print(d)
元组是Python内置的数据结构之一,属于不可变序列。t=(‘Python’,‘hello’,90)
不可变序列与可变序列:
'''可变序列 列表、字典'''
lst = [10,20,45]
print(id(lst))
lst.append(300)
print(id(lst))
'''不可变序列 字符串、元组'''
s = 'hello'
print(id(s))
s = s+'world'
print(id(s))
print(s)
'''元组的创建方式''' #第一种使用小括号 t = ('Python','hello',98) print(type(t)) t0 = 'Python','hello',98 print(t0) print(type(t0)) t3 = ('Python',) #如果元组中只有一个元素,逗号不能省略 print(t3) print(type(t3)) #第二种使用内置函数tuple t1 = tuple(('Python','hello',98)) print(t1) print(type(t1)) '''空元组的创建方式''' lst =[] lst1= list() d={} d2=dict() t4=() t5=tuple() print('空列表',lst,lst1) print('空字典',d,d2) print('空元组',t4,t5)
t = (10,[20,30],9)
print(t)
print(type(t))
print(t[0],type(t[0]),id(t[0]))
print(t[1],type(t[1]),id(t[1]))
print(t[2],type(t[2]),id(t[2]))
'''尝试将t[1]修改为100'''
print(id(100))
#t[1]=100 #元组是不允许修改元素的
'''由于[20,30]是列表,而列表是可变序列,所以可以向列表中添加元素,而列表的内存地址不变'''
t[1].append(100) #向列表中添加元素
print(t,id(t[1])
'''元组的遍历'''
t = ('Python','world',98)
'''第一种获取元组元素的方式,使用索引'''
print(t[0])
print(t[1])
print(t[2])
#print(t[3]) #IndexError
'''遍历元组'''
for item in t:
print(item)
集合是Python语言提供的内置数据结构;与列表、字典一样都属于可变类型的序列;是没有Value的字典,只有key。
'''第一种创建方式使用{}''' s = {2,3,4,5,5,6,7,7} #集合中的元素不允许重复 print(s) '''第二种创建方式使用set{}''' s1 = set(range(6)) print(s1,type(s1)) s2 = set([1,2,4,5,5,5,6,6]) print(s2,type(s2)) s3 = set((1,2,4,4,5,65)) #集合中的元素是无序的 print(s3,type(s3)) s4 = set('Python') print(s4,type(s4)) s5 = set({12,4,34,55,66,44,4}) print(s5,type(s5)) #定义一个空集合 s6 = {} print(type(s6)) s7 = set() print(type(s7))
s = {10,20,30,405,60} #集合元素的判断操作 print(10 in s) print(100 in s) print(10 not in s) print(100 not in s) #集合元素的新增操作 s.add(80) #一次添加一个元素 print(s) s.update({200,400,300}) #一次至少添加一个元素 print(s) s.update([100,99,8]) print(s) s.update((78,64,56)) print(s) #集合元素的删除操作 s.remove(100) #一次删除一个指定元素,元素不存在抛出KeyError print(s) #s.remove(500) #KeyError s.discard(500) #删除一个指定元素,元素不存在不报异常 s.discard(300) print(s) s.pop() #一次只能删除一个任意元素 s.pop() #s.pop(400) #TypeError 不能够添加参数 print(s) s.clear() #清空集合 print(s)
'''集合是否相等?元素相同即相等,与顺序无关''' s = {10,20,30,40} s2 = {30,40,20,10} print(s == s2) #True print(s != s2) #False '''一个集合是否是另一个集合的子集''' s1 = {10,20,30,40,50,60} s2 = {10,20,30,40} s3 = {10,20,90} print(s2.issubset(s1)) print(s3.issubset(s1)) '''一个集合是否是另一个集合的超集''' print(s1.issuperset(s2)) print(s1.issuperset(s3)) '''两个集合是否含有交集''' print(s2.isdisjoint(s3)) #False 有交集为False s4 = {100,200,300} print(s2.isdisjoint(s4)) #True 无交集为True
(4)集合的数学操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xZBtcPBX-1625580399573)(…/PythonProjects/Typora_image/e48eb7510aa743a2bb1064f51352a19d.png)]
'''集合的数学操作''' #交集 s1 = {10,20,30,40} s2 = {20,30,40,50,60} print(s1.intersection(s2)) print(s1 & s2) print(s1) print(s2) #并集 print(s1.union(s2)) print(s1 | s2) print(s1) print(s2) #差集 print(s1.difference(s2)) print(s1 - s2) print(s1) print(s2) #对称差集 print(s1.symmetric_difference(s2)) print(s1 ^ s2)
'''列表生成式'''
lst = [i*i for i in range(10)]
print(lst)
'''集合生成式'''
s = {i*i for i in range(10)}
print(s)
数据结构 | 是否可变 | 是否重复 | 是否有序 | 定义符号 |
---|---|---|---|---|
列表(list) | 可变 | 可重复 | 有序 | [] |
元组(tuple) | 不可变 | 可重复 | 有序 | () |
字典(dict) | 可变 | key不可重复,value可重复 | 无序 | {key:value} |
集合(set) | 可变 | 不可重复 | 无序 | {} |
**字符串:**在Python中是基本数据类型,是一个不可变的字符序列。
**字符串的驻留机制:**仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同的字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量。
'''字符串的驻留机制'''
a = 'Python'
b = "Python"
c = '''Python'''
print(a,id(a))
print(b,id(b))
print(c,id(c))
驻留机制的几种情况(交互模式):
s1 = '' s2 = '' s1 is s2 s1 = '%' s2 = '%' s1 is s2 s1 = 'abc%' s2 = 'abc%' s1 == s2 s1 is s2 id(s1) id(s2) s1 = 'abcx' s2 = 'abcx' s1 is s2 id(s1) id(s2) a = 'abc' b = 'ab'+'c' c = ''.join(['ab','c']) a is b a is c c type(c) a type(a) a = -5 b = -5 a is b a = -6 b = -6 a is b import sys a = 'abc%' b = 'abc%' a is b a = sys.intern(b) a is b
sys中的intern方法强制2个字符串指向同一个对象
PyCharm对字符串进行了优化处理
字符串驻留机制的优缺点:
index rindex find rfind
s = 'hello,hello'
#index查找子串第一次出现的位置,如果查找子串不存在,抛出ValueError
print(s,index('lo')) #3
#查找子串第一次出现的位置,如果查找子串不存在,则返回-1
print(s,find('lo')) #3
#查找子串最后一次出现的位置,如果查找子串不存在,抛出ValueError
print(s,rindex('lo')) #9
#查找子串最后一次出现的位置,如果查找子串不存在,则返回-1
print(s,rfind('lo')) #9
#print(s,index('k')) #ValueError
print(s,find('k')) #-1
#print(s,rindex('k'))
print(s,rfind('k'))
-11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
---|---|---|---|---|---|---|---|---|---|---|
h | e | l | l | o | , | h | e | l | l | o |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
upper lower swapcase caplitalize title
'''字符串中的转换'''
s = 'hello,python'
a = s.upper() #全部转换大写,产生一个新的字符串对象
print(a,id(a))
print(s,id(s))
b = s.lower() #全部转换小写,产生一个新的字符串对象
print(b,id(b))
print(s,id(s))
print(b == s)
print(b is s) #False
s2 = 'hello,Python'
print(s2,swapcase()) #字符串所有大写转换为小写,所有小写转换为大写
print(s2,capitalize()) #把第一个字母转换为大写,其余字母转换为小写
print(s2,title()) #把每个单词的第一个字母转换为大写,把每个单词的剩余字母转换为小写
center ljust rjust zfill
s = 'hello,Python' #居中对齐,第一个参数指定宽度,第二个参数指定填充符,默认空格。若设置宽度小于实际宽度,返回原字符串 print(s,center(20,'*')) #左对齐,第一个参数指定宽度,第二个参数指定填充符 print(s.ljust(20,'*')) print(s.ljust(10)) print(s.ljust(20)) #右对齐 print(s.rjust(20,'*')) print(s.rjust(20)) print(s.rjust(10)) #右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串宽度 print(s.zfill(20)) print(s.zfill(10)) print('-8910'.zfill(8)) #减号后开始添0
split rsplit
s = 'hello world Python'
'''split从字符串的左边开始劈分,默认的劈分字符是空格字符,返回的值都是一个列表'''
lst = s.split()
print(lst)
s1 = 'hello|world|Python'
print(s1.split(sep = '|')) #通过参数sep指定劈分符
print(s1.split(sep = '|',maxsplit = 1)) #通过maxsplit指定劈分字符串时最大劈分次数,经过最大次劈分后,剩余子串会单独作为一部分
'''rsplit从字符串的右边开始劈分,默认的劈分符是空格字符串,返回的值都是一个列表'''
print(s.rsplit())
print(s.resplit(sep = '|'))
print(s.rsplit(sep = '|',maxsplit = 1))
isidentifier isspace isalpha isdecimal isnumeric isalnum
#判断指定的字符串是不是合法的标识符 s = 'hello,python' print('1.',s.isidentifier()) print('2.','hello'.isidentifier()) print('3.','张三_'.isidentifier()) print('4.','张三_123'.isidentifier()) #判断指定的字符串是否全部由空白字符组成(回车、换行、水平制表符) print('5.','\t'.isspace()) #判断指定的字符串是否全部由字母组成 print('6.','abc'.isalpha()) print('7.','张三'.isalpha()) print('8.','张三1'.isalpha()) #判断指定的字符串是否全部由十进制数字组成 print('9.','123'.isdecimal()) print('10.','123四'.isdecimal()) print('11.','ⅠⅡⅢ'.isdecimal()) #判断指定的字符串是否全部由数字组成 print('12.','123'.isnumeric()) print('13.','123四'.isnumeric()) print('14.','ⅠⅡⅢ'.isnumeric()) #判断指定的字符串是否全部由字母和数字组成 print('15.','abc1'.isalnum()) print('16.','张三123'.isalnum()) print('17.','abc!'.isalnum())
repalce join
#replace第一个参数指定被替换子串,第二个参数指定替换子串,第三个参数指定最大替换次数
s = 'hello,Python'
print(s.replace('Python','Java'))
s1 = 'hello,Python,Python,Python'
print(s1.replace('Python','Java',2))
#join将列表或元组中的字符串合并为一个字符串
lst = ['hello','java','Python']
print('|'.join(lst))
print(''.join(lst))
t = ('hello','java','Python')
print(''.join(t))
print('*'.join('Python'))
< > = < < = = = ! =
**比较规则:**首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较。
**比较原理:**两个字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord就可以得到指定字符的ordinal value。与内置函数对应的是内置函数chr,调用内置函数chr时可以使指定的ordinal value得到其对应的字符。
print('apple' > 'apple') #True print('apple' > 'banana') #97>98,Flase print(ord('a'),ord('b')) print(ord('杨')) print(chr(97),chr(98)) print(chr(26472)) '''is与 == 的区别 ==比较的是value is 比较的是id''' a = b = 'Python' c = 'Python' print(a == b) print(b == c) print(a is b) print(a is c) print(id(a)) print(id(b)) print(id(c))
s = 'hello,Python' s1 = s[:5] #没有指定起始位置,从0开始 s2 = s[6:] #没有指定结束位置,直到最后一个为止 s3 = '!' newstr = s1 + s3 + s2 print(s1) print(s2) print(newstr) print(id(s)) print(id(s1)) print(id(s2)) print(id(s3)) print(id(newstr)) print('---------切片[start:end:step]------') print(s[1:5:1]) #从1开始截到5,不包括5,步长为1 print(s[::2]) #默认从0开始,直到最后一个元素,索引间隔为2 print(s[::-1]) #默认从最后一个元素开始,直到第一个元素结束,因为步长为-1 print(s[-6::1]) #截取Python字符串
**为什么需要格式化字符串?**按照一定格式输出字符串。
两种方式:%作占位符;{}作占位符。
'''格式化字符串''' #使用 % 占位符 name = '张三' age = 20 print('我叫%s,今年%d岁' % (name,age)) #使用 {} 占位符 print('我叫{0},今年{1}岁'.format(name,age)) #f-string(Python 3.x以上版本) print(f'我叫{name},今年{age}岁') #宽度和精度 print('%d' % 99) print('%10d' % 99) #10代表宽度 print('%.3f' % 3.1415926) #.3保留三位小数 print('%10.3f' % 3.1415926) #宽度为10,小数点后三位 print('{0}'.format(3.1415926)) print('{0:.3}'.format(3.1415926)) #.3表示一共是3位数 print('{0:.3f}'.format(3.1415926)) #.3f表示3位小数 print('{:10.3f}'.format(3.1415926)) #同时设置宽度和精度,一共是10位数,3位小数
编码与解码的方式:
s = '天涯共此时'
#编码
print(s.encode(encoding = 'GBK')) #GBK编码格式中,一个中文占两个字节
print(s.encode(encoding = 'UTF-8')) #UTF-8中,一个中文占三个字节
#解码
byte = s.encode(encoding = 'GBK') #编码
print(byte.decode(encoding = 'GBK')) #解码 byte代表的就是一个二进制数据(字节类型的数据)
byte = s.encode(encoding = 'UTF-8') #编码
print(byte.decode(encoding = 'UTF-8'))
**什么是函数?**函数就是执行特定任务和完成特定功能的一段代码。
**为什么需要函数?**复用代码;隐藏实现细节;提高可维护性;提高可读性便于调试。
函数的创建 def 函数名([输入参数]):函数体 [return xxx]
函数的调用 函数名([实际参数])
def calc(a,b): #a,b称为形式参数,简称形参,形参位置在函数的定义处
c = a + b
return c
'''位置实参传递'''
result = calc(10,20) #10,20实际参数,简称实参,位置在函数的调用处
print(result)
'''关键字实参传递'''
res = calc(b = 10,a = 20)
print(res)
def fun(arg1,arg2): print('arg1',arg1) print('arg2',arg2) arg1 = 100 arg2.append(10) print('arg1',arg1) print('arg2',arg2) #return n1 = 11 n2 = [22,33,44] print('n1',n1) print('n2',n2) fun(n1,n2) print('n1',n1) print('n2',n2) '''在函数的调用过程中,进行参数的传递, 如果是不可变对象,在函数体的修改不会影响实参的值,arg1修改为100,不会影响n1的值 如果是可变对象,在函数体内的修改会影响实参的值,arg2的修改.append(10),会影响到n2的值'''
**函数的返回值:**函数返回多个值时,结果为元组。
print(bool(0)) #False 零的布尔值为False print(bool(1)) #True 非零整数布尔值为True def fun(num): odd = [] #村奇数 even = [] #存偶数 for i in num: if i % 2: odd.append(i) else: even.append(i) return odd,even #函数的调用 lst = [10,29,34,23,44,53,55] print(fun(lst)) '''函数的返回值 1.如果函数没有返回值(函数执行完毕后,不需要给调用处提供数据) return可以不写 2.函数的返回值,如果是1个,直接返回类型 3.函数的返回值,如果是多个,返回结果为元组''' def fun1(): print('hello') #return fun1() def fun2(): return 'hello' res = fun2() print(res) def fun3(): return 'hello','world' print(fun3()) '''函数在定义时,是否需要返回值,视情况而定'''
函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参。
def fun(a,b = 10): #b默认值参数
print(a,b)
#函数的调用
fun(100)
fun(20,30)
# def print(self, *args, sep='', end='\n',file=None):
print('hello')
print('world')
print('hello',end = '\t')
print('world')
定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数;使用*定义个数可变的位置形参;结果为一个元组。
def fun(*args): #函数定义时 可变的位置参数
print(args)
print(args[0])
fun(10)
fun(10,30)
fun(30,405,50)
定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参;使用**定义个数可变的关键字形参;结果为一个字典。
def fun1(**args): print(args) fun1(a = 10) fun1(a = 20,b=30,c=40) '''def fun2(*args,*a): pass 代码运行,程序报错,个数可变的位置参数,只能是一个 def fun3(**args,**args): pass 代码运行,程序报错,个数可变的关键字参数,只能是一个''' def fun2(*args1,**args2): pass '''def fun3(**args1,*args2): pass 在一个函数的定义过程中,既有个数可变的位置形参,也有个数可变的关键字形参,要求,个数可变的位置形参放在个数可变的关键字形参之前'''
def fun(a,b,c):
print('a = ',a)
print('b = ',b)
print('c = ',c)
#函数的调用
fun(10,20,30) #函数调用时的参数传递,称为位置传参
lst = [11,22,33]
fun(*lst) #在函数调用时,将列表中的每个元素都转换成位置实参传入
print('----------------')
fun(a=100,c=300,b=200) #函数的调用,关键字实参
dic = {'a':111,'b':222,'c':333}
fun(**dic) #函数调用时,将字典中的键值对都转换成关键字实参传入
def fun(a,b=10): #b是在函数的定义处,所以是形参,而且进行了赋值,所以是默认值形参 print('a=',a) print('b=',b) def fun2(*args): #个数可变的位置形参 print(args) def fun3(**args2): #个数可变的关键字形参 print(args2) fun2(10,20,30,40) fun3(a=11,b=22,c=33,d=44,e=55) def fun4(a,b,c,d): print('a=',a) print('b=',b) print('c=',c) print('d=',d) #调用fun4函数 fun4(10,20,30,40) #位置实参传递 fun4(a=10,b=20,c=30,d=40) #关键字实参传递 fun4(10,20,c=30,d=40) #前两个参数,采用位置实参传递,后两个参数采用关键字实参传递 '''需求:c,d只能采用关键字实参传递''' #def fun4(a,b,*,c,d): 从*之后的参数,在函数调用时,只能采用关键字参数传递
'''函数定义时的形参的顺序问题'''
def fun5(a,b,*,c,d,**args):
pass
def fun6(*args,**args2):
pass
def fun7(a,b=10,*args,**args2):
pass
变量的作用域:程序代码能访问该变量的区域。根据变量的有效范围可以分为局部变量、全局变量。
def fun(a,b): c = a+b #c是局部变量,因为是在函数体内进行定义的;a,b为函数的形参,作用范围也是函数内部,相当于局部变量 print(c) #print(c) ,因为a,c超出了起作用的范围(超出了作用域) #print(a) name ='杨老师' #name作用范围为函数的内部和外部都可以使用,全局变量 print(name) def fun2(): print(name) #调用函数 fun2() def fun3(): global age #函数内部定义的变量,局部变量;局部变量使用global声明之后,这个变量实际上就变成了全局变量 age = 20 print(age) fun3() print(age)
什么是递归函数?
如果在一个函数的函数体内调用了该函数本身,这个函数就称为递归函数.
递归函数的组成部分:
递归调用条件与递归终止条件.
递归的调用过程:
每递归调用一次函数,都会在栈内存分配一个栈帧;每执行完一次函数,都会释放相应的空间.
递归的优缺点:
优点是思路和代码简单;缺点是占用内存多,效率低下.
'''使用递归计算阶乘'''
def fac(n):
if n == 1:
return 1
else:
res = n*fac(n-1)
return res
print(fac(6))
F n = F n − 1 + F n − 2 F_{n}=F_{n - 1}+F_{n-2} Fn=Fn−1+Fn−2
def fib(n):
if n == 1:
return 1
elif n == 2:
return 1
else:
return fib(n-1) + fib(n-2)
#斐波那契数列第六位
print(fib(6))
#斐波那契数列前六位(循环操作用列表)
for i in range(1,7):
print(fib(i))
**Bug的由来:**世界上第一部万用计算机的进化版-马克2号(Mark Ⅱ)
**Debug:**排除程序bug
Bug的常见类型:
粗心导致的语法错误 SyntaxError
age = input('请输入你的年龄:') print(type(age)) if age >= 18 : #if int(age) >= 18: print('成年人...') while i < 10: #i没有初始值,括号为中文状态的,缺少i += 1使程序进入循环状态 print(i) for i in range(3): uname = input('请输入用户名:') pwd = input('请输入密码:') if uname = 'admin' and pwd = 'admin': #一个 = 是赋值,两个 = 是比较 print('登录成功!') break else print('输入有误') else print('对不起,三次均输入错误')
知识点不熟练导致的错误
lst = [11,22,33,44]
print(lst[4]) #IndexError lst索引从0开始
lst = []
lst = append('A','B','C')
print(lst) #lst.append 且每次只能添加一个
思路不清导致的问题
'''豆瓣电影Top250排行,使用列表存储电影信息,要求输入名字在屏幕上娴熟xxx出演了哪部电影''' lst = [{'rating':[9.7,2062397],'id':'1292052','type':['犯罪','剧情'],'title':'肖申克的救赎','actors':['蒂姆·罗宾斯','摩根·弗里曼']} {'rating':[9.6,1528760],'id':'1291546','type':['爱情','剧情','同性'],'title':'霸王别姬','actors':['张国荣','张丰毅','巩俐','葛优']} {'rating':[9.5,1559181],'id':'1292720','type':['剧情','爱情'],'title':'阿甘正传','actors':['汤姆·汉克斯','罗宾·怀特']} ] name = input('请输入你要查询的演员:') for item in lst: #遍历列表,得到一个{},item是一个又一个的字典 act_lst = item['actors'] for actor in act_lst: if name in actor: print(name,'出演了:',item['title']) '''for movie in item: #遍历字典,得到movie 是一个字典中的key actors = movie['actors'] if name in actors: print(name + '出演了:' + movie)'''
第一层for循环遍历列表可以得到每一部电影,而每一部电影又是一个字典,只需要根据key在字典中取值即可。根据演员的键actors取出学员的列表,使用判断name在列表中是否存在,最后根据电影名称的键title取出电影的名称,进行输出。
被动掉坑:程序代码逻辑没有错,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃。
'''输入两个整数并进行除法运算'''
a = input('请输入第一个整数:')
a = int(a)
b = input('请输入第二个整数:')
b = int(b)
result = a/b
print('结果为:',result)
try:
n1 = int(input('请输入第一个整数:'))
n2 = int('请输入第二个整数:')
result = n1/n2
print('结果为:',result)
except ZeroDivisionError:
print('对不起,除数不允许为0')
except ValueError:
print('只能输入数字串')
except BaseException as e: #except从子类到父类,最后可以增加BaseException
print(e)
print('程序结束')
如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except块。
try:
a = int(input('请输入第一个整数:'))
b = int(input('请输入第二个整数:'))
result = a / b
except BaseException as e:
print('出错了',e)
else:
print('计算结果为:',result)
finally块无论是否发生异常都会被执行,能常用来释放try块中申请的资源。
try:
a = int(input('请输入第一个整数:'))
b = int(input('请输入第二个整数:'))
result = a / b
except BaseException as e:
print('出错了',e)
else:
print('计算结果为:',result)
finally:
print('谢谢您的使用')
使用traceback模块打印异常处理信息,存储log日志。
#print(10/0)
import traceback
try:
print('------------------')
print(1/0)
except:
traceback.print_exc()
序号 | 异常类型 | 描述 |
---|---|---|
1 | ZeroDivisionError | 除(或取模)零(所有数据类型) |
2 | IndexError | 序列中没有此索引(index) |
3 | KeyError | 映射中没有这个键 |
4 | NameError | 未声明/初始化对象(没有属性) |
5 | SyntaxError | Python语法错误 |
6 | ValueError | 传入无效的参数 |
'''ZeroDivisionError'''
print(10/0)
'''IndexError'''
lst = [11,22,33,44]
print(lst[4])
'''KeyError'''
dic = {'name':'张三','age':20}
print(dic['gender'])
'''NameError'''
print(num)
'''SyntaxError'''
int a = 20
'''ValueError'''
a = int('hello')
i = 1
while i <= 10: #设置断点进行调试
print(i)
i += 1
面向过程 | 面向对象 | |
区别 | 事物比较简单,可以用线性的思维去解决 | 事物比较复杂,使用简单的线性思维无法解决 |
共同点 | 面向过程和面向对象都是解决实际问题的一种思维方式 | |
---|---|---|
二者相辅相成,并不是对立的;解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间复杂的关系、方便我们分析整个系统;具体到微观操作,仍然使用面向过程方式来处理。 |
类是多个类似事物组成的群体的统称。能够帮助我们快速理解和判断事物的性质。
**对象:**不同数据类型属于不同的类,像100、99、520都是int类之下包含的相似的不同个例,这些个例专业术语称为实例或者对象。
class Student:
pass
'''Student类名由一个或多个单词组成,每个单词的首字母大写,其余小写'''
#Python中一切皆对象,Student是对象吗?内存由开空间吗?
print(id(Student))
print(type(Student))
print(Student)
类的组成:
class Student: native_pace = '吉林' #直接写在类里的变量,称为类属性 def __init__(self,name,age): self.name = name #self,name称为实体属性,进行了一个赋值的操作,将局部变量name的值赋给实体属性 self.age = age #实例方法 def eat(self): print('学生在吃饭...') #静态方法 @staticmethod def method(): print('我使用了staticmethod进行修饰,所以我是静态方法') #类方法 @classmethod def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰') '''在类之外定义的称为函数,在类之内定义的称为方法 def drink(); #函数 print('喝水') '''
对象的创建又称为类的实例化:实例名 = 类名()
class Student: native_pace = '吉林' #直接写在类里的变量,称为类属性 def __init__(self,name,age): self.name = name #self,name称为实体属性,进行了一个赋值的操作,将局部变量name的值赋给实体属性 self.age = age #实例方法 def eat(self): print('学生在吃饭...') #静态方法 @staticmethod def method(): print('我使用了staticmethod进行修饰,所以我是静态方法') #类方法 @classmethod def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰') '''在类之外定义的称为函数,在类之内定义的称为方法 def drink(); #函数 print('喝水') ''' #创建Student类的对象 stu1 = Student('张三',20) stu1.eat() #对象名.方法名() print(stu1.name) print(stu1.age) print('---------------------------') print(id(stu1)) print(type(stu1)) print(stu1) print('---------------------------') print(id(Student)) print(type(Student)) print(Student) print('--------------------------') Student.eat(stu1) #类名.方法名(类的对象) 与stu1.eat()一样,都是调用Student中的eat方法
class Student: native_pace = '吉林' #直接写在类里的变量,称为类属性 def __init__(self,name,age): #初始化方法 self.name = name #self,name称为实体属性,进行了一个赋值的操作,将局部变量name的值赋给实体属性 self.age = age #实例方法 def eat(self): print('学生在吃饭...') #静态方法 @staticmethod def method(): print('我使用了staticmethod进行修饰,所以我是静态方法') #类方法 @classmethod def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰') print('------------类属性的使用方法---------------') print(Student.native_pace) stu1 = Student('张三',20) stu2 = Student('李四',30) print(stu1.native_pace) print(stu2.native_pace) Student.native_pace = '天津' print(stu1.native_pace) print(stu2.native_pace) print('------------类方法的使用方式--------------') Student.cm() print('-----------静态方法的使用方式----------------') Student.method()
Python是动态语言,在创建对象后,可以动态地绑定属性和方法。
class Student: def __init__(self,name,age): self.name = name self.age = age def eat(self): print(self.name + '在吃饭') stu1 = Student('张三',20) stu2 = Student('李四',30) print(id(stu1)) print(id(stu2)) print('---------只给李四添加一个性别---------------') stu2.gender = '女' print(stu1.name,stu1.age) #如果添加stu1.gender会抛出AttributeError print(stu2.name,stu2.age,stu2.gender) print('-------------------------') stu1.eat() stu2.eat() def show(): print('定义在类之外地,称为函数') stu1.show = show stu1.show #stu2.show 因为stu2并没有绑定show方法
面向对象的三大特征:
class Car:
def __init__(self,brand):
self.brand = brand
def start(self):
print('汽车已启动...')
car = Car('宝马X5')
car.start()
print(car,brand)
class Student:
def __init__(self,name,age):
self.name = name
self.__age = age #年龄age不希望在类的外部被使用,所以加了两个“_”
def show(self):
print(self.name,self.__age)
stu = Student('张三',20)
stu.show()
#在类的外部使用name与age
print(stu.name)
#print(stu.__age)
print(dir(stu))
print(stu._Student__age) #在类的外部可以通过 _Student__age 进行访问
**继承的特点:**如果一个类没有继承任何类,则默认继承object;Python支持多继承;定义子类时,必须在其构造函数中调用父类的构造函数。
#语法结构
class 子类类名(父类1,父类2...):
pass
class Person(object): #Person继承object类 def __init__(self,anme,age): self.name = name self.age = age def info(self): print(self.name,self.age) class Student(Person): def __init__(self,name,age,stu_no): super().__init__(name,age) self.stu_no = stu_no class Teacher(Person): def __init__(self,name,age,teachofyear): super().__init__(name,age) self.teachofyear = teachofyear stu = Student('张三',20,'1001') teacher = Teacher('李四',34,10) stu.info() teacher.info()
class A(object):
pass
class B(object):
pass
class C(A,B): #Python支持多继承
pass
class Person(object): #Person继承object类 def __init__(self,anme,age): self.name = name self.age = age def info(self): print(self.name,self.age) class Student(Person): def __init__(self,name,age,stu_no): super().__init__(name,age) self.stu_no = stu_no def info(self): super().info() print(self.stu_no) class Teacher(Person): def __init__(self,name,age,teachofyear): super().__init__(name,age) self.teachofyear = teachofyear def info(self): super().info() print('教龄',self.teachofyear) stu = Student('张三',20,'1001') teacher = Teacher('李四',34,10) stu.info() teacher.info()
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return '我的名字是{0},今年{1}岁。'.format(self.name,self,age)
stu = Student('张三',20)
print(dir(stu))
print(stu) #默认调用__str__()方法
print(type(stu))
简单地说,多态就是“具有多种形态”,它指的是:即便不知道一个变量所引用地对象到底是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所用对象的类型,动态决定调用哪个对象中的方法。
class Animal(object): def eat(self): print('动物会吃') class Dog(Animal): def eat(self): print('狗吃骨头...') class Cat(Animal): def eat(self): print('猫吃鱼...') class Person: def eat(self): print('人吃五谷杂粮') #定义一个函数 def fun(obj): obj.eat() #开始调用函数 fun(Cat()) fun(Dog()) fun(Animal()) print('-----------------------') fun(Person())
静态语言和动态语言关于多态的区别:
名称 | 描述 | |
特殊属性 | __dict()__ | 获得类对象或者实例对象所绑定的所有属性和方法的字典 |
特殊方法 | __len__() | 通过重写__len__()方法,让内置函数len()的参数可以是自定义类型 |
---|---|---|
__add__() | 通过重写__add__()方法,可以使用自定义对象具有“+”功能 | |
__new__() | 用于创建对象 | |
__init__() | 对创建的对象进行初始化 |
'''特殊属性''' print(dir(object)) class A: pass class B: pass class C(A,B): def __init__(self,name,age): self.name = name self.age = age class D(A): pass #创建C类的对象 x = C('Jack',20) #x是C类型的一个实例对象 print(x.__dict__) #实例对象的属性字典 print(C.__dict__) print('-------------------------') print(x.__class__) #输出对象所属的类 print(C.__bases__) #输出C类的父类类型的元素 print(C.__base__) #输出类的基类 print(C.__mro__) #类的层次结构 print(A.__subclasses__()) #输出A的子类
'''特殊方法''' a = 20 b = 100 c = a+b #两个int类型的对象相加操作 d = a.__add__(b) print(c) print(d) class Student: def __init__(self,name): self.name = name def __add__(self,other): return self.name + other.name def __len__(self): return len(self.name) stu1 = Student('Jack') stu2 = Student('李四') s = stu1 + stu2 #实现了两个对象的加法运算(因为在Student类中,编写了__add__()特殊的方法 print(s) s = stu1.__add__(stu2) print(s) print('----------------------------') lst = [11,22,33,44] print(len(lst)) print(lst.__len__()) print(len(stu1))
'''__new__()和__init__()''' class Person(object): def __new__(cls,*args,**kwargs): #9360 print('__new__()被调用执行了,cls的id值为{0}'.format(id(cls))) obj = super().__new__(cls) print('创建的对象的id值为{0}'.format(id(obj))) #7104 return obj def __init__(self,name,age): print('__init__被调用了,self的id值为:{0}'.format(id(self))) #7104 self.name = name self.age = age print('object这个类对象的id为:{0}'.format(id(object))) #3232 print('Person这个类对象的id为:{0}'.format(id(Person))) #9360 #创建Person类的实例对象 p1 = Person('张三',20) print('p1这个Person类的实例对象的id为:{0}'.format(id(p1))) #7104
**变量的赋值操作:**只是形成两个变量,实际上还是指向同一个对象。
**浅拷贝:**Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝。因此,源对象与拷贝对象会引用同一个子对象。
**深拷贝:**使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同。
class CPU: pass class Disk: pass class Computer: def __init__(self,cpu,disk): self.cpu = cpu self.disk = disk #(1)变量的赋值 cpu1 = CPU() cpu2 = cpu1 print(cpu1,id(cpu1)) print(cpu2,id(cpu2)) #(2)类的浅拷贝 print('-------------------') disk = Disk() #创建一个硬盘类的对象 computer = Computer(cpu1,disk) #创建一个计算机类的对象 #浅拷贝 import copy computer2 = copy.copy(computer) print(disk) print(computer,computer.cpu,computer.disk) print(computer2,computer2.cpu,computer2.disk) print('---------------------') #深拷贝 computer3 = copy.deepcopy(computer) print(computer,computer.cpu,computer.disk) print(computer3,computer3.cpu,computer3.disk)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ByigLYR2-1625580399575)(…/PythonProjects/Typora_image/image-20210210175002816.png)]
模块(modules):
def fun(): pass def fun2(): pass class Student: native_place = '吉林' #类属性 def eat(self): pass @classmethod def cm(cls): pass @staticmethod def sm(): pass a = 10 b = 20 print(a,b)
导入模块
import 模块名称 [as 别名]
from 模块名称 import 函数/变量/类
import math
print(id(math))
print(type(math))
print(dir(math))
from math import pi
from math import pow
print(pi)
print(pow(2,3))
#自定义模块
def add(a,b):
return a+b
def div(a,b):
return a/b
#如何导入自定义模块
'''pycharm右键MarkDirectory as SourcesRoot'''
在每个模块的定义中都包括一个记录模块名称的变量_name_,程序可以检查该变量,以确定他们在哪个模块执行,如果一个模块不是被导入到其他程序中执行,那么它可能在解释器的顶端模块中执行。顶端模块的_name_变量的值为_main_
def add(a,b):
return a+b
if __name__ == '__main__':
print(add(10,20)) #只有当点击运行calc2模块时才会执行运算
import calc2
print(calc2.add(100,200))
包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。
**作用:**代码规范;避免模块名称冲突
**包与目录的区别:**包含__int__.py文件的目录叫作包;目录里通常不包含__int__.py文件
#单击右键,创建-Python Package
import package
import calc
#使用import导入时只能跟包名和模块名
from package import modelA
from package.modelA import a
#使用from...import可以导入包,模块,函数变量等
模块名 | 描述 |
---|---|
sys | 与Python解释器及其环境操作相关的标准库 |
time | 提供与时间相关的各种函数的标准库 |
os | 提供了访问操作系统服务功能的标准库 |
calendar | 提供与日期相关的各种函数的标准库 |
urllib | 用于读取来自网上(服务器)的数据标准库 |
json | 用于使用JSON序列化和反序列化对象 |
re | 用于在字符串中执行正则表达式匹配和替换 |
math | 提供标准算术运算函数的标准库 |
decimal | 用于进行精确控制运算精度、有效数位和四舍五入操作的十进制运算 |
logging | 提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能 |
import sys import time import urllib.request import math print(sys.getsizeof(24)) print(sys.getsizeof(45)) print(sys.getsizeof(True)) print(sys.getsizeof(False)) print(time.time()) print(time.localtime(time.time())) print(urllib.request.urlopen('http://www.baidu.com').read()) print(math.pi)
#DOS
pip install schedule
python
import schedule
import schedule
import time
def job():
print('哈哈-----')
schedule.every(3).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(1)
常见的字符编码格式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MlYuCssv-1625580399577)(…/PythonProjects/Typora_image/image-20210215103231516.png)]
Python操作文件 → 打开或新建文件夹 → 读写文件 → 关闭资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XLkqlfnq-1625580399578)(…/PythonProjects/Typora_image/image-20210216142431378.png)]
file = open('a.txt','r')
print(file.readlines()) #结果是一个list
file.close()
打开模式 | 描述 |
---|---|
r | 只读模式打开文件,文件指针将会放在文件的开头 |
w | 只写模式打开文件,如果文件不存在则创建;如果文件存在,则覆盖原有内容,指针放在文件开头 |
a | 追加模式打开文件,如果文件不存在则创建,文件指针在文件开头;如果文件存在,则在文件末尾追加内容,文件指针在原文件末尾 |
b | 二进制方式打开文件,不能单独使用,需要与其他模式一起使用,rb或者wb |
+ | 读写模式打开文件,不能单独使用,需要与其他模式一起使用,a+ |
file = open('b.txt','w')
file.write('Python')
file.close()
file = open('b.txt','a')
file.write('Python')
file.close()
src_file = open('logo.png','rb')
target_file = open('copylogo.png','wb')
target_file.write(src_file.read())
target_file.close()
src_file.close()
方法名 | 说明 |
---|---|
read([size]) | 从文件中读取size个字节或字符的内容返回,若省略[size],则读取到文件末尾,一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串str内容写入文件 |
writelines(s_list) | 将字符串列表s_list写入文本文件,不添加换行符 |
seek(offset[,whence]) | 把文件指针移动到新的位置,offset表示相对whence的位置;offset为正往结束方向移动,为负往开始方向移动。whence不同的值代表不同含义:0从文件头开始计算,1从当前位置开始计算;2从文件末尾开始计算 |
tell() | 返回文件指针的当前位置 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源 |
file = open('a.txt','r') print(file.read(2)) print(file.readline()) print(file.readlines()) file.close() file = open('c.txt','a') file.write('hello') lst = ['java','go','python'] file.writelines(lst) file.close() file = open('c.txt','r') file.seek(2) #一个中文两个字节 print(file.read()) print(file.tell()) file.close() file = open('c.txt','a') file.write('hello') file.flush() file.write('world') file.close()
print(type(open('a.txt','r'))) with open('a.txt','r') as file: print(file.read()) '''MyContentMgr实现了特殊方法__enter__(),__exit__()称为该类对象遵守了上下文管理器协议。 该类对象的实例对象,称为上下文管理器 MyContentMgr()''' class MyContentMgr(object): def __enter__(self): print('enter方法被调用执行了') return self def __exit__(self,exc_type,exc_val,exc_tb): print('exit方法被调用执行了') def show(self): print('show方法被调用执行了') with MyContentMgr() as file: file.show()
#文件的复制
with open('logo.png','rb') as src_file:
with open('copy2logo.png','wb') as target_file:
target_file.write(src_file.read())
os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
os模块与os.path模块用于对目录或文件进行操作。
#os模块与操作系统相关的一个模块
import os
os.system('notepad.exe')
os.system('calc.exe')
#直接调用可执行文件
os.startfile('D:\\YesPlayMusic\\YesPlayMusic.exe')
函数 | 说明 |
---|---|
getcwd() | 返回当前的工作目录 |
listdir() | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
makedirs(path1/path2…[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2…) | 删除多级目录 |
chdir(path) | 将path设置成当前工作目录 |
import os
print(os.getcwd())
os.listdir('../chap15') #办公自动化经常使用
print(lst)
os.mkdir('newdir2')
os.makedirs('A/B/C')
os.rmdir('newdir2')
os.removedirs('A/B/C')
os.chdir('F:\\desktop\\chap14')
print(os.getcwd())
函数 | 说明 |
---|---|
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断文件或目录是否存在,如果存在返回True,否则返回False |
join(path,name) | 将目录与目录或者文件名拼接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为路径 |
import os.path
print(os.path.abspath('demo13.py'))
print(os.path.exists('demo13.py'),os.path.exists('demo18.py'))
print(os.path.join('E:\\Python','demo13.py'))
print(os.path.split('E:\\vippython\\chap15\\demo13.py'))
print(os.path.splitext('demo13.py'))
print(os.path.basename('E:\\vippython\\chap15\\demo13.py'))
print(os.path.dirname('E:\\vippython\\chap15\\demo13.py'))
print(os.path.isdir('E:\\vippython\\chap15\\demo13.py'))
'''列出指定目录下的所有py文件'''
import os
path = os.getcwd()
lst = os.listdir(path)
for filename in lst:
if filename.endswith('.py'):
print(filename)
#chap15-->newdir-->sub-->遍历所有文件walk
import os
path = os.getcwd()
lst_files = os.walk(path)
for dirpath,dirname,filename in lst_files:
print(dirname)
print(dirpath)
print(filename)
print('--------------------------')
for dir in dirname:
print(os.path.join(dirpath,dir))
for file in filename:
print(os.path.join(dirpath,file))
print('+++++++++++++++++++++++++')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnvegEqR-1625580399579)(…/PythonProjects/Typora_image/image-20210216174510594.png)]
学生管理系统应具备的功能:
七大模块:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EGXb14Py-1625580399582)(…/PythonProjects/Typora_image/image-20210216180215185.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdqZVtCp-1625580399583)(…/PythonProjects/Typora_image/image-20210219105757447.png)]
系统开发环境
项目目录结构
studentsys --> students.txt & stusystem.py
编号 | 功能 |
---|---|
0 | 退出系统 |
1 | 录入学生信息,调用insert()函数 |
2 | 查找学生信息,调用search()函数 |
3 | 删除学生信息,调用delete()函数 |
4 | 修改学生信息,调用modify()函数 |
5 | 对学生成绩排序,调用sort()函数 |
6 | 统计学生总人数,调用total()函数 |
7 | 显示所有学生信息,调用show()函数 |
filename = 'student.txt' import os def main(): while True: menu() choice = int(input('请选择:\n')) if choice in [0,1,2,3,4,5,6,7]: if choice == 0: answer = input('您确定退出系统吗?y/n \n') if answer == 'y' or if answer == 'Y': print('谢谢您的使用!') break else: continue if choice == 1: insert() elif choice == 2: search() elif choice == 3: delete() elif choice == 4: modify() elif choice == 5: sort() elif choice == 6: total() elif choice == 7: show() def menu(): print('======================学生信息管理系统===================') print('-----------------------功能菜单-----------------------') print('\t\t\t\t\t\t 1.录入学生信息') print('\t\t\t\t\t\t 2.查找学生信息') print('\t\t\t\t\t\t 3.删除学生信息') print('\t\t\t\t\t\t 4.修改学生信息') print('\t\t\t\t\t\t 5.排序') print('\t\t\t\t\t\t 6.统计学生总人数') print('\t\t\t\t\t\t 7.显示所有学生信息') print('\t\t\t\t\t\t 0.退出系统') print('------------------------------------------------------') def insert(): #(1) pass def search(): #(4) pass def delete(): #(2) pass def modify(): #(3) pass def sort(): #(7) pass def total(): #(5) pass def show(): #(6) pass if __name__ == '__main__': main()
#(1) def insert(): student_list = [] while True: id = input('请输入ID(如1001):') if not id: break name = input('请输入姓名:') if not name: break try: English = int(input('请输入英语成绩:')) Python = int(input('请输入Python成绩:')) Java = int(input('请输入Java成绩')) except: print('输入无效,不是整数类型,请重新输入。') continue #将录入的学生信息保存到字典中 student = {'id':id,'name':name,'English':English,'Python':Python,'Java':Java} #将学生信息添加到列表中 student_list.append(student) answer = input('是否继续添加?y/n \n') if answer == 'y': continue else: break #调用save()函数 save(student_list) print('学生信息录入完毕!') def save(lst): try: stu_txt = open(filename,'a',encoding = 'utf-8') except: stu_txt = open(filename,'w',encoding = 'utf-8') for item in lst: stu_txt.write(str(item) + '\n') stu_txt.close()
#(2) def delete(): while True: student_id = input('请输入要删除的学生的ID:') if student_id != '': if os.path.exists(filename): with open(filename,'r',encoding = 'utf-8') as file: student_old = file.readlines() else: student_old =[] flag = Fasle #标记是否删除 if student_old: with open(filename,'w',encoding = 'utf-8') as wfile: d={} for item in student_old: d = dict(eval(item)) #将字符串转成字典 if d['id'] != student_id: wfile.write(str(d) + '\n') else: flag = True if flag: print(f'id为{student_id}的学生信息已被删除') else: print(f'没有找到ID为{student_id}的学生信息') else: print('无学生信息') break show() #删除之后要重新显示所有学生信息 answer = input('是否继续删除?y/n \n') if answer == 'y': continue else: break
def modify(): show() if os.path.exists(filename): with open(filename,'r',encoding = 'utf-8') as rfile: student_old = rfile.readlines() else: return student_id = input('请输入要修改的学生的ID:\n') with open(filename,'w',encoding = 'utf-8') as wfile: for item in student_old: d = dict(eval(item)) if d['id'] == student_id: print('找到学生信息,可以修改他(她)的相关信息了!') while True: try: d['name'] = input('请输入姓名:\n') d['English'] = input('请输入英语成绩:\n') d['Python'] = input('请输入Python成绩:\n') d['Java'] = input('请输入Java成绩:\n') except: print('您的输入有误,请重新输入!') else: break wfile.write(str(d) + '\n') print('修改成功!') else: wfile.write(str(d) + '\n') answer = input('是否继续修改其他学生信息?y/n \n') if answer == 'y': modify()
def search(): student_query = [] while True: id = '' name = '' if os.path.exists(filename): mode = input('按ID查找请输入1,按姓名查找请输入2:\n') if mode = '1': id = input('请输入学生ID:\n') elif mode = '2': name = input('请输入学生姓名:\n') else: print('您的输入有误,请重新输入:\n') search() with open(filename,'r',encoding = 'utf-8') as rfile: student = rfile.readlines() for item in student: d = dict(eval(item)) if id != '': if d['id'] == id: student_query.append(d) elif name != '': if d['name'] == name: student_query.append(d) #显示查询结果 show_student(student_query) #清空列表 student_query.clear() answer = input('是否要继续查询?y/n \n') if answer == 'y': continue else: break else: print('暂未保存学生信息!') return def show_student(lst): if len(lst) == 0: print('没有查询到学生信息,无数据显示!') return #定义标题的显示格式 format_title = '{:^6 \t {:^12} \t {:^8} \t {:^10} \t {:^10} \t {:^8}}' print(format_title.format('ID','姓名','英语成绩','Python成绩','Java成绩','总成绩')) #定义内容的显示格式 format_data = '{:^6 \t {:^12} \t {:^8} \t {:^8} \t {:^8} \t {:^8}}' for item in lst: print(format_data.format(item.get('id')),item.get('name'),item.get('English'),item.get('Python'),item.get('Java'),int(item.get('English'))+int(item.get('Python'))+int(item.get('Java')) )
def total():
if os.path.exists(filename):
with open(filename.'r',encoding = 'utf-8') as rfile:
students = rfile.readlines()
if students:
print(f'一共有{len(students)}名学生。')
else:
print('还没有录入学生信息。')
def show():
student_lst =[]
if os.path.exists(filename): #判断文件是否存在
with open(filename,'r',encoding ='utf-8') as rfile: #打开文件
students = rfile.readlines() #读取全部数据
for item in students:
student_lst,append(eval(item))
if student_lst:
show_student(student_lst) #调用显示学生信息的方法
else:
print('暂未保存数据')
def sort(): show() if os.path.exists(filename): with open(filename,'r',encoding ='utf-8') as rfile: student_list = rfile.readlines() student_new = [] for item in stuednt_list: d = dict(eval(item)) student_new,append(d) else: return asc_or_desc = input('请选择 \n (0.升序;\n (1.降序') if asc_or_desc == '0': asc_or_desc_bool = False elif asc_or_desc == '1': asc_or_desc_bool = True else: print('您的输入有误,请重新输入。') sort() mode = input('请选择排序方式 \n (1.按英语成绩排序; \n (2.按Python成绩排序; \n (3.按Java语言成绩排序; \n (0.按总成绩排序.') if mode == '1': student_new.sort(key = lambda x:int(x['English']),reverse = asc_or_desc_bool) elif mode == '2': student_new.sort(key = lambda x:int(x['Python']),reverse = asc_or_desc_bool) elif mode == '3': student_new.sort(key = lambda x:int(x['Java']),reverse = asc_or_desc_bool) elif mode == '0': student_new.sort(key = lambda x: int(x['English']) + int(x['Python']) + int(x['Java']),reverse = asc_or_desc_bool) else: print('您的输入有误,请重新输入!') sort() show_student(student_new) #显示排序结果
# Task1 使用print方式进行输出
fp = open('F:/test.txt','w')
print('奋斗成就更好的你',file = fp)
fp.close()
# Task1 使用文件读写操作
with open('F:/test1.txt','w') as file:
file.write('奋斗成就更好的你')
print('星期日','今天')
print('--------------------')
print('08时','11时','14时','17时','20时','23时')
print('0℃ ','6℃ ','10℃','4℃ ','1℃ ','0℃ ')
print('--------------------')
print('明 天 ','2/23','2/11℃')
print('星期二','2/24','0/9℃')
print('星期三','2/25','-2/8℃')
print('星期四','2/26','-3/6℃')
print('星期五','2/27','-2/7℃')
print('星期六','2/28','-1/11℃')
print('✈国内 \t ♜国际.港澳台 \t ↘发现低价')
print('------------------------')
print('航班类型:⊙单程 ⊙往返 ⊙多程(含缺口城)')
print('出发城市:北京')
print('到达城市:长春')
print('出发日期:2020-3-8')
print('返回日期:yyyy-MM-dd')
print('------------------------')
print('\t\t ☐带儿童 ☐带婴儿')
print('\t\t\t__________')
print('\t\t\t___搜索___')
print('地铁1\t\t\t四惠东→苹果园')
print('\t\t首车:05:05')
print('\t\t末车:23:30\t\t票价:起步价:2元')
print('------------------------------------')
print(' 1\t\t 3\t 5\t 7\t\t 9\t\t 11\t\t 12\t\t 14\t\t 16\t\t 18\t\t 20\t\t')
print(' ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t')
print('四惠东\t大望路\t永安里\t东单\t天安门东\t西单\t复兴门\t木樨地\t公主坟\t五棵松\t八宝山')
#1 print('►→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→◄') print('▷ 《Java程序设计教程》 ◁') print('► 出版社:西安电子科技大学出版社 ◄') print('▷ 出版时间:2019-02-02 ◁') print('► 定 价:56.8 ◄') print('▷→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→◁') #2 book_name = 'Java程序设计教程' publish = '西安电子科技大学出版社' pub_date = '2019-02-02' price = 56.8 print('▶➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝◀') print('▷\t\t 《',book_name,'》 \t\t ◁') print('▷\t出版社:',publish,'\t ◁') print('▷\t出版时间:',pub_date,'\t\t\t ◁') print('▷\t定 价:',price,'\t\t\t\t ◁') print('▷➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝◁')
#1 变量的赋值 name1 = '林黛玉' name2 = '薛宝钗' name3 = '贾元春' name4 = '贾探春' name5 = '史湘云' print('①\t' + name1) print('②\t' + name2) print('③\t' + name3) print('④\t' + name4) print('⑤\t' + name5) #2 列表 lst_name = ['林黛玉','薛宝钗','贾元春','贾探春','史湘云'] lst_sig = ['①','②','③','④','⑤'] for i in range(5): print(lst_sig[i],lst_name[i]) #3字典 d = {'①':'林黛玉','②':'薛宝钗','③':'贾元春','④':'贾探春','⑤':'史湘云'} for key in d: print('key,d[key]') print('zip-----------------') for s,name in zip(lst_sig,lst_name): print(s,name)
print('\033[0;35m\t\t图书音像勋章\033[m')
print('\033[0;35m-----------------------\033[m')
print('\033[0;32m❀图书音像勋章\t\t✪专享活动 \033[m')
print('\033[0;34m❤专属优惠\t\t\t☎优惠提醒 \033[m')
print('\033[0;35m-----------------------\033[m')
height = 170
weight = 50.5
bmi = weight / (height+weight)
print('您的身高是:',height)
#print('您的身高是:' + str(height))
print('您的体重是:' + str(weight))
print('您的BMI是:' + str(bmi))
print('您的BMI的指数是:' '{:0.2f}'.format(bmi)
def fun(): num = int(input('请输入一个十进制的整数:')) #str转换成int类型 #使用个数可变的位置参数 print(num,'的二进制数为:',bin(num)) #使用+作为连接符,注意符号左右均为str类型 print(str(num) + '的二进制数为:' + bin(num)) #格式化字符串 print('%s的二进制数为:%s' % (num,bin(num))) #格式化字符串 print('{0}的二进制数为:{1}'.format(num,bin(num))) #格式化字符串 print(f'{num}的二进制数为:{bin(num)}') print('---------------------------') print(f'{num}的八进制数为:{oct(num)}') print(f'{num}的十六进制数为:{hex(num)}') if __name__ == '__main__': while True: try: fun() break except: print('只能输入整数!程序出错,请重新输入')
print('用户手机账户原有话费金额为:\033[0;35m 8元 \033[m')
money = int(input('请输入用户的充值金额:'))
money += 8
print('当前的余额为:\033[0;32m ',money,'元 \033[m')
num = int(input('请输入您当天行走的步数:'))
calorie = num *28
print(f'您今天一共消耗了卡路里{calorie},即{calorie/1000}千卡')
father_height = float(input('请输入父亲的身高:'))
mother_height = float(input('请输入母亲的身高:'))
son_height = (father_height + mother_height)*0.54
print('预测子女的身高为:{}cm'.format(son_height))
pwd = input('支付宝支付密码:')
if pwd.isdigit():
print('支付数据合法')
else:
print('支付数字不合法,支付密码只能是数字')
print('---------------------------')
s = '支付数据合法' if pwd.isdigit() else '支付数字不合法,支付密码只能是数字'
qq = input('请输入您的QQ号:')
pwd = input('请输入您的密码:')
if qq == '296626472' and pwd == '123':
print('登陆成功')
else:
print('账号或者密码不正确')
import random
price = random.randint(1000,1500)
print('今日竞猜的商品为小米扫地机器人,价格在[1000-1500]之间:')
guess = int(input())
if guess > price:
print('大了')
elif guess < price:
print('小了')
else:
print('猜对了')
print('真实价格为:',price)
d = {'白羊座':'1','金牛座':'2','双子座':'3','巨蟹座':'4','狮子座':'5'}
star = input('请输入您的星座查看近来的运势:')
#print(d[star])
print(d.get(star))
x = 97 #a的ASCII为97
for _ in range(1,27):
print(chr(x),'--->',x)
x += 1
print('---------------')
x = 97
while x < 123:
print(chr(x),'---->',x)
x += 1
for i in range(1,4):
user_name = input('请输入用户名:')
user_pwd = input('请输入密码:')
if user_name == 'admin' and user_pwd == '8888':
print('登陆成功')
break
else:
print('用户名或密码不正确!')
if i < 3:
print(f'您还有{3-i}次机会!')
else:
print('对不起,三次均输入错误,请联系后台管理员!')
import random rand = random.randint(1,100) for i in range(1,11): num = int(input('在我心中有个数1-100,请你猜一猜。')) if num < rand: print('小了') elif num > rand: print('大了') else: print('恭喜你猜对了') break print(f'您一共猜了{i}次') if i < 3: print('真聪明') elif i <= 7: print('还凑合') else: print('天哪,找杨老师学习二分算法')
import math
for i in range(100,1000):
if math.pow((i % 10),3) + math.pow((i//10%10),3) + math.pow(i // 100,3) == i:
print(i)
year = [82,89,88,86,85,00,99]
print('原列表:',year)
for index,value in enumerate(year):
#print(index,value)
if str(value) != '0':
year[index] = int('19' + str(value))
else:
year[index] = int('200' + str(value))
print('修改之后的列表为:',year)
year.sort()
print('排序之后的列表为:',year)
lst = [] for i in range(0,5): goods = input('请输入商品的名称进入商品的入库,每次只能输入一个商品:\n') lst.append(goods) for item in lst: print(item) cart = [] while True: num = input('请输入要购买的商品编号:') for item in lst: if item.find(num) != -1: cart.append(item) break #退出for循环 if num == 'q': break #退出while循环 print('您购物车里已经选好的商品为:') '''for m in cart: print(m)''' for j in range(len(cart)-1,-1,-1): print(cart[j])
constellation = ['白羊座','金牛座','双子座','巨蟹座','狮子座','处女座','天秤座','天蝎座','射手座','摩羯座','水瓶座','双鱼座'] nature = ['积极乐观','固执内向','圆滑世故','多愁善感','迷之自信','精明计较','犹豫不决','阴暗消极','放荡不羁','务实本分','作天作地','安于现状'] #将两个列表转成集合 a = zip(constellation,nature) d = dict(zip(constellation,nature)) for item in a: print(item) print(d) key = input('请输入您的星座名称:') flag = True for item in d: if key == item: flag = True print(key,'的性格特点为:',d.get(key)) break else: #print('您输入的星座有误') flag = False if not flag: print('您输入的星座有误')
dict_ticket = { 'G1569':['北京南-天津南','18:05','18:39','00:34'], 'G1567':['北京南-天津南','18:15','18:49','00:34'], 'G8917':['北京南-天津西','18:20','19:19','00:59'], 'G203 ':['北京南-天津南','18:35','19:09','00:34'] } print('车次\t\t出发站\t\t到达站\t\t出发时间\t\t\t到达时间\t\t\t历时时长') for item in dict_ticket: print(item,end = ' ') for i in dict_ticket[item]: print(i,end='\t\t\t') print() #换行 #输入要购买的车次 train_no = input('请输入购买的车次:') persons = input('请输入乘车人。如果是多人请使用逗号分隔') s = f'您已购买了{train_no}次列车,' s_info = dict_ticket[train_no] #获取车次详细信息 s += s_info[0] + ' ' + s_info[1] + ' 开。' print(f'{s}请{persons}尽快取走纸质车票。【铁路客服】')
coffee_name = ('蓝山','卡布奇诺','拿铁','皇家咖啡','女王咖啡','美丽与哀愁')
print('您好!欢迎光临小喵咖啡屋。')
print('本店经营的咖啡有:')
for index,item in enumerate(coffee_name):
print(index+ +1 ,'.',item,end=' ')
index = int(input('\n请输入您喜欢的咖啡编号:'))
if 0 <= index <= len(coffee_name):
print(f'您的咖啡[{coffee_name[index -1]}]好了,请您慢用')
socres = (('广州恒大',72),('北京国安',70),('上海上港',66),('江苏苏宁',53),('山东鲁能',51))
for index,item in enumerate(scores):
print(index +1,'.',end=' ')
for score in item:
print(score,end =' ')
print()
phones = set() #创建一个空集合,集合元素没有顺序
for i in range(5):
info = input(f'请输入第{i+1}个朋友的姓名和手机号码:')
phones.add(info)
for item in phones:
print(item)
def get_count(s,ch):
count = 0
for item in s:
if ch.upper() == item or ch.lower() == item:
count += 1
return count
if __name__ == '__main__':
s = 'hellopython,hellojava,hellogo'
ch = input('请输入要统计的字符:')
count = get_count(s,ch)
print(f'{ch}在{s}中出现的次数为:{count}')
def show(lst): for item in lst: for i in item: print(i,end ='\t\t') print() lst = [ ['01','电风扇','美的',500], ['02','洗衣机','TCL',1000], ['03','微波炉','老板',400], ] print('编号\t\t\t名称\t\t\t品牌\t\t\t单价') show(lst) print('----------格式化---------------') for item in lst: item[0] = '0000' + item[0] item[3] = '¥{:.2f}'.format(item[3]) show(lst)
def calc(a,b,op): if op == '+': return add(a,b) elif op == '-': return sub(a,b) elif op == '*': return mul(a,b) elif op == '/': if b != 0: return div(a,b) else: return '除数不能为0' def add(a,b): return a + b def sub(a,b): return a - b def mul(a,b): return a * b def div(a,b): return a/b if __name__ == '__main__': a = int(input('请输入第一个整数:')) b = int(input('请输入第二个整数:')) op = input('请输入运算符:') print(calc(a,b,op))
import random def guess(num,guess_num): if num = guess_num: return 0 elif guess_num > num: return 1 else: return -1 num = random.randint(1,100) for i in range(10): guess_num = int(input('我心里有个1-100的整数,请你猜一猜:')) result = guess(num,guess_num) if result == 0: print('猜对了') break elif result > 0: print('大了') else: print('小了') else: print('真笨,10次都没猜中!')
try:
score = int(input('请输入分数:'))
if 0 <= score <= 100:
print('分数为:',score)
else:
raise Exception('分数不正确')
except Exception as e:
print(e)
def is_triangle(a,b,c): if a<0 or b<0 or c<0: raise Exception('三条边不能有负数') #手动抛出异常对象 #判断是否构成三角形 if a+b>c and a+c>b and b+c>a: print(f'三角形的边长为a={a},b={b},c={c}') else: raise Exception(f'a={a},b={b},c={c},不能构成三角形') if __name__ == '__main__': try: a = int(input('请输入第一条边:')) b = int(input('请输入第二条边:')) c = int(input('请输入第三条边:')) is_triangle(a,b,c) except Exception as e: print(e)
import math class Circle(object): def __init__(self,r): self.r = r def get_area(self): return math.pi * math.pow(self.r,2) def get_perimeter(self): return 2*math.pi*self.r if __name__ == '__main__': r = int(input('请输入圆的半径:')) c = Circle(r) print(f'圆的面积为:{c.get_area()}') print(f'圆的周长为:{c.get_perimeter()}) print('圆的面积为:{:.2f}'.format(c.get_area())) print('圆的周长为:{:.2f}'.format(c.get_perimeter()))
class Student(object): def __init__(self,stu_name,stu_age_,stu_gender,stu_score): self.stu_name = stu_name self.stu_age = stu_age self.stu_gender = stu_gender self.stu_score = stu_score def show(self): print(self.stu_name,self.stu_age,self.stu_gender,self.stu_score) if __name__ == '__main__': print('请输入五位学员的信息:(姓名#年龄#性别#成绩)') lst = [] for i in range(0,5): s = input(f'请输入第{i+1}位学员的信息和成绩:') s_lst = s.split('#') #print(s_lst) #创建学生对象 stu = Student(s_lst[0],int(s_lst[1]),s_lst[2],float(s_lst[3])) lst.append(stu) #遍历列表 for item in lst: item.show()
class Instrument(): def make_sound(self): pass class Erhu(Instrument): def make_sound(self): print('二胡在演奏') class Piano(Instrument): def make_sound(self): print('钢琴在演奏') class Violin(Instrument): def make_sound(self): print('小提琴在演奏') def play(instrument): instrument.make_sound() class Bird(): def make_sound(self): print('小鸟在唱歌') if __name__ == '__main__': play(Erhu()) play(Piano()) play(Violin())
class Car(object): def __init__(self,type,no): self.type = type self.no = no def start(self): pass def stop(self): pass class Taxi(Car): def __init__(self,type,no,company): super().__init__(type,no) self.company = company def start(self): print(’乘客您好!) print(f'我是{self.company}出租车公司的,我的车牌是{self.no},请问您要去哪里?') def stop(self): print('目的地到了,请您付款下车,欢迎再次乘坐。') class FamilyCar(Car): def __init__(self,type,no,name): super().__init__(type,no) self.name = name def stop(self): print('目的地到了,我们去玩吧') def start(self): print(f'我是{self.name},我的汽车我做主') if __name__ == '__main__': taxi = Taxi('上海大众','京A9765','长城') taxi.start() taxi.stop() print('-'* 30) familycar = FamilyCar('广汽丰田','京B88888','武大郎') familycar.start() familycar.stop()
import prettytable as pt #显示座席 def show_ticket(row_num): tb = pt.PrettyTable() tb.field_names = ['行号','座位1','座位2','座位3','座位4','座位5'] for i in range(row_num): lst = [f'第{i+1}行','有票','有票','有票','有票','有票'] tb.add_row(lst) print(tb) #订票 def order_ticket(row_num,row,column): tb = pt.PrettyTable() tb.field_names = ['行号','座位1','座位2','座位3','座位4','座位5'] for i in range(row_num): if int(row) == i+1: lst = [f'第{i+1}行','有票','有票','有票','有票','有票'] lst[int(column)] = '已售' tb.add_row(lst) else: lst = [f'第{i+1}行','有票','有票','有票','有票','有票'] tb.add_row(lst) if __name__ == '__main__': row_num = 13 show_ticket(row_num) choose_num = input('请输入选择的座位,如13,5表示13排5号座位') #英文逗号处分隔行与列 try: row,column = choose_num.split(',') except: print('输入格式有误,如13排5号座位,应该位13,5') order_ticket(row_num,row,column)
import datetime
def inputdate():
indate = input('请输入开始日期:{20200202}后按回车')
indate = indate.strip()
datestr = indate[0:4] + '-' + indate[4:6] + '-' +indate[6:]
return datetime.datetime.strptime(datestr,'%Y-%m-%d')
if __name__ == '__main__':
print('--------------推算几天后的日期---------------------')
sdate = inputdate()
in_num = int(input('请输入间隔天数:'))
fdate = sdate + datetime.timedelta(days = in_num)
print('您推算的日期是:' + str(fdate))
print('您推算的日期是:' + str(fdate).split(' ')[0])
import time def show_info(): print('输入提示数字,执行相应的操作:0.退出 1.查看登录日志') #记录日志 def write_logininfo(username): with open('log.txt','a') as file: s = f'用户名{username},登录时间:{time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))}' file.write(s) file.write('\n') #读取日志 def read_logininfo(): with open('log.txt','r') as file: while True: line = file.readlin() if line == '': break else: print(line,end = '') if __name__ == '__main__': username = input('请输入用户名:') pwd = input('请输入密码:') if 'admin' == username and 'admin' == pwd: print('登录成功!') write_logininfo(username) show_info() num = int(input('请输入操作数字')) while True: if num == 0: print('退出成功') break elif num == 1: print('查看登录日志') read_logininfo() num = int(input('输入操作数字:')) else: print('您输入的数字有误') show_info() num = int(input('输入操作数字:')) else: print('对不起,用户名和密码不正确!') print(time.time()) print(time.localtime(time.time())) print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
'''replay.txt文档 订单|如果您有任何订单问题,可以登录淘宝账号,点击“我的订单”,查看订单详情 物流|如果您有任何物流问题,可以登录淘宝账号,点击“我的订单”,查看商品系统 账户|如果您有任何账号问题,可以联系淘宝客服,电话:XXXX-XXXXXX 支付|如果您有任何支付问题,可以联系支付宝客服,QQ:XXXXXXXXX ''' def find_answer(question): with open('replay.txt','r',encoding = 'gbk') as file: while True: line = file.readline() if not line: #if line ==''到文件末尾退出 break #字符串的分隔 keyword = line.split('|')[0] reply = line.split('|')[1] if keyword in question: return reply return False if __name__ == '__main__': question = input('Hi,您好,小蜜在此等主任很久了,有什么烦恼快和小蜜说吧') while True: if question == 'bye': break #开始在文件中查找 replay = find_answer(question) if not replay: #如果回复的是False,not False则为True question = input('小蜜不知道你在说什么,您可以问一些关于订单、物流、账户、支付等问题(退出请输入bye)') else: print(replay) question = input('小主,您还可以问一些关于订单、物流、账户、支付等问题(退出请输入bye') print('小主再见')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。