# 最最基本 ## print函数 ### 将数据输出文件中 ```python #将数据输出文件中,注意点,1.所指定的盘符存在。2.使用file=fp fp = open('C:/李林峰/text.txt', 'a+')#如果文件不存在就创建,存在就在文件内容后面继续追加 print('helloworld', file=fp) fp.close() #不进行换行输出(输出内容在一行当中) print('hello','world','Python')
open的方式是输出到文件当中
print的方式是输出到显示器当中+
print('hello','world','Python')
print('hello\nworld') # 换行 n->newline print('hello\tworld') # 空了三隔 print('helloooo\tworld') # 空了四隔->tab键 print('hello\rworld') # world将hello进行了覆盖->return光标移动到本行的开头 print('hello\bworld') # \是退格back print('http:\\\\www.bandu.com') print('老师说:\'大家好\'') #原字符,不希望字符串中的转义字符起作用,就是用元字串之前加上r或R print(r'hello\nworld') #注意事项,最后一个字符不能是反斜杠,可以是两个反斜杠 print(r'hello\nworld\\')
name = '玛利亚' print(name) print('标识', id(name)) print('类型', type(name)) print('值', name)
·常见的数据类型
·整数类型->int->98
·浮点数类型->float->3.14159
·布尔类型->bool->True,False
·字符串类型->str->人生苦短
#整数可以表示二进制,十进制,八进制,十六进制 print('十进制',118)#默认十进制 print('二进制',0b1010111)#二进制以0b开头 print('八进制',0o176)#八进制以0o开头 print('十六进制',0x1EAF)
n1 = 1.1 n2 = 2.2 print(n1+n2)#3.3000000000000003 from decimal import Decimal print(Decimal('1.1')+Decimal('2.2'))#3.3
f1 = True f2 = False print(f1,type(f1))#True <class 'bool'> print(f2,type(f2))#False <class 'bool'> #布尔值可以转成整数计算 print(f1+1) #2 1+1的结果为2,True表示1 print(f2+1) #1 0+1的结果为2,False表示0
str1 = '人生苦短,我用python' str2 = "人生苦短,我用python" str3 = """人生苦短, 我用python""" str4 = ‘‘‘人生苦短, 我用python’’’ #单引号和双引号定义的字符串必须在一行 print(str1,type(str1))#人生苦短,我用python<class 'str'> print(str2,type(str2)) #三引号定义的字符串可以分布在连续的多行 print(str3,type(str3)) print(str4,type(str4))
name = '张三' age = 20 print(type(name),type(age))#说明name与age的数据类型不相同 print('我叫'+name+'今年'+age+'岁')#当将str类型与int类型进行链接时,报错,解决方案,类型转换 print('我叫'+name+'今年'+str(age)+'岁')
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))) #print(int(s3), type(int(s3))) #将str转成int类型,字符串必须为数字串(整数),非数字串是不允许转换的
#字符串中的数据如果是非数字串,则不允许转换
#单行注释 """我是多行注释 """
present = input('大圣想要什么礼物呢')#输入之前程序给你的一个提示语 需要输入回答
a = input('请输入一个加数:')#10 b = input('请输入另一个加数:')#10 print(type(a), type(b))#<class 'str'><class 'str'> print(a + b)#1020 a = input('请输入一个加数:')#10 b = input('请输入另一个加数:')#10 print(type(a), type(b))#<class 'str'><class 'str'> print(int(a) + int(b))#30 或者a = int(input('请输入一个加数:'))
print(1+1)# 加法运算 print(1-1) # 减法运算 print(2*4)# 8 乘法运算 print(1/2)# 除法运算 print(11/2)#5.5 除法运算 print(11//2)# 5 整除运算 print(11%2)# 1 取余运算 print(2**2)# 4 表示的是2的2次方 print(2**3)# 8 表示的是2的3次方
含减号的运算
print(9 // 4) # 2 print(-9 // -4) # 2 print(9 // -4) # -3 print(-9 // 4) # -3 一正一负的整数公式,向下取整 print(9 % -4) # -3 余数=被除数-除数*商 9-(-4)*(-3) print(-9 % 4) # 3
#解包赋值 a,b,c=20,30,40 print(a,b,c) print('-----------交换两个变量的值----------') a,b=10,20 print('交换之前:',a,b)#交换之前:10 20 #交换 a,b=b,a print('交换之后:',a,b)#交换之后:20 10
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)#False print('a!=b吗',a!=b)#True a=10 b=10 print(a==b)#True 说明,a与b的value相等 print(a is b)#True 说明, a与b的id标识相等 #以下代码没学过,后面会给大家讲解 llist1=[11,22,33,44] llist2=[11,22,33,44] print(lstr1==lstr2)#value -->True print(lstr1 is lstr2)#id -->False print(id(lstr1))#267587787 print(id(lstr2))#787897988 print(lstr1 is not lstr2) #True
#and并且 #or或者 #not 对bool类型操作数取反 f=True f2=False print(not f)#False print(not f2)#True #in与not in s = 'helloworld' print('w' in s)#True print('k' in s)#False print('w' not in s)#False print('k' not in s)#True
print(4 & 8) # 0 按位于&,同为1时结果为1 print(4 | 8) # 12 按位或|,同为0时结果为0 print(4 << 1) # 8 向左移动1位(移动一个位置)相当于乘以2 print(4 << 2) # 16 向左移动2位(移动2个位置) print(4 >> 1) # 2 向右移动1位,相当于除以2 print(4 >> 2) # 1 向右移动2位,相当于除以4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mGcjj80O-1643201540460)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220119175339789.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DxA00Btf-1643201540461)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220119180200590.png)]
print(bool(False))#False print(bool(0))#False print(bool(0.0))#False print(bool(None))#False print(bool(''))#False print(bool(""))#False print(bool([]))#False空列表 print(bool(list()))#False空列表 print(bool(()))#False空元组 print(bool(tuple))#False空元组 print(bool({}))#空字典 print(bool(dict()))#False空字典 print(bool(set()))#False空集合 其他的bool值为True print(bool(18))#True print(bool('helloworld'))#True
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,'是奇数')
score = int(input('请输入一个成绩:')) # 判断 if 90 <= score <= 100: print('A级') elif 80 <= score < 90: print('B级') elif 70 <= score < 80: print('C级') elif 60 <= score < 70: print('D级') elif 0 <= score < 59: print('E级') else: print('对不起,您输入的成绩有误,不再成绩的有效范围内')
answer=input('您是会员吗?y/n') money=float(input('请输入您的购物金额:')) #外层判断是否是会员 if answer=='y': if money >= 200: print('打八折,付款金额为:',money*0.8) elif money>=100: print('打九折,付款金额为:',money*0.9) else: print('不打折,付款金额为:',money) else: if money>=200: print('打9.5折,付款金额为:',money*0.95 else: print('不打折,付款金额为:',money)
''''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('使用条件表达式进行比较') #条件判断的结果为true,就执行左边的内容,为false,执行右侧的代码 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()的三种创建方式 ''''第一种方式,只有一个参数(小括号中只给一个数)'''' r = range(10) #[0,1,2,3,4,5,6,7,8,9],默认从0开始,默认相差1位步长 print(r)#range(0,10) print(list(r))#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #用于查看range对象中的整数序列-->list是列表的意思 ''''第二中创建方式,给了两个数(小括号中给了连个数)'''' r=range(1,10)#指定了起始值,从1开始,到10结束(不包含10),默认步长为1 print(list(r))#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ''''第三种创建方式,给了三个参数(小括号中给了三个数)'''' r=range(1,10,2) print(list(r))#[1,3,5,7,9] '''判断指定的整数在序列中是否存在in,not in''' print(10 in r)#False,10不在当前的r这个整数系列中 print(9 in r)#True,9在当前的r这个序列中 print(10 not in r)#True
sum=0 a=0 while a<5: sum+=a a++ print('和为',sum)
sum=0 a=1 while a<=100: if a%2==0: sum+=a a+=1 print('1-100之间的偶数和',sum)#因为print和while是对齐的,所以print没有进入while循环
for item in 'Python':#第一次取出来的是P,将P赋值给item,将item的值输出 print(item) #range() 产生一个整数序列---》也是一个可迭代对象 for i in range(10): print(i)#1 2 3 4 5 6 7 8 9 #如果在循环体中不需要使用自定义白能量,可将自定义变量写为“_” for _ in range(5): print('人生苦短,我用Python') print('使用for循环,计算1到100的偶数和') sum=0#用于存储偶数和 for item in range(1,101): if item % 2==0: sum+=item print('1到100之间的偶数和为:',sum)
for item in range(100, 1000): ge = item % 10 shi = item // 10 % 10 bai = item // 100 if ge ** 3 + shi ** 3 + bai ** 3 == item: print(item)
for item in range(3): pwd = input('请输入密码:') if pwd == '8888': print('密码正确') break else: print('密码不正确')
for item in range(1, 51): if item % 5 != 0: continue print(item)
没有碰到break时执行else
#for和else搭配使用 for item in range(3): pwd = input('请输入密码:') if pwd == '8888': print('密码正确') break else: print('密码不正确') else: print('对不起,三次密码均输入错误') #while和else搭配使用 a = 0 while a < 3: pwd = input('请输入密码') 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(1, 10): for j in range(1, i+1): print(str(i) + '*' + str(j) + '=' + str(i * j), end='\t') #print(i,'*',j,'=',i*j,end='\t') print()
二重循环中的break和continue用于控制本层循环
列表让我想到了Excel表,他的括号是直上直下的,又联系到java里的列表就有list([ ])
·列表对应的英语单词是list—>list([])
"""创建列表的第一种方式,使用[]""" lst = ['hello', 'world', 98] '''创建列表的第二种方式,使用内置函数list()''' lst2 = list(['hello', 'world', 98]) print()
1.列表元素按顺序有序排序
2.索引映射唯一一个数据
3.列表可以存储重复数据
4.任意数据类型混存
5.根据需要动态分配和回收内存
lst = ['hello', 'world', 98, 'hello'] print(lst.index('hello')) # 如果列表中有相同元素只返回相同元素的第一个元素的索引 # print(lst.index('Python')) # 'Python' is not in list # print(lst.index('hello', 1, 3))#'hello' is not in list 在1~2的位置上查找 print(lst.index('hello', 1, 4))
正向索引从0到N-1,举例list[0]
逆向索引你从-N到-1,举例lst[-N]
指定索引不存,抛出IndexError
lst = ['hello', 'world', 98, 'hello', 'world', 234] # 获取索引为2的元素 print(lst[2]) # 98 # 获取索引为-3的元素 print(lst[-3]) # hello # 获取索引为10的元素 print(lst[10]) # IndexError: list index out of range
列表元素的查询操作
# 判断指定元素在列表中是否存在 print('p' in 'python') print('k' not in 'python') lst = [10, 20, 'python', 'hello'] print(10 in lst) # True print(100 in lst) # False print(10 not in list) # True # 遍历 for item in lst: print(item)
列表元素的增加操作
# append() 向列表的末尾添加一个元素 lst = [10, 20, 30] print('添加元素之前', lst, id(lst)) # 添加元素之前 [10, 20, 30] 2100054273728 lst.append(100) print('添加元素之后', lst, id(lst)) # 添加元素之后 [10, 20, 30, 100] 2100054273728 print(list) # <class 'list'> # extend() 在列表的末尾只收添加一个元素 lst2 = ['hello', 'world'] # st.append(lst2)#将lst2作为一个元素添加到列表的末尾 # print(lst) # [10, 20, 30, 100, ['hello', 'world']] # 向列表的末尾一次性添加多个元素 lst.extend(lst2) print(lst) # 在指定位置上添加一个元素 lst.insert(1, 90) lst3 = [True, False, 'hello'] # 在任意的位置上添加N多个元素 lst[1:] = lst3; print(lst)
lst = [10, 20, 30, 40, 50, 60, 30] lst.remove(30) # 从列表中溢出一个元素,如果有重复元素只移第一个元素 print(lst) lst.remove(100) # [10, 20, 40, 50, 60, 30] lst = [10, 20, 30, 40, 50, 60, 30] # pop()根据索引移除元素 lst.pop(1) print(lst) lst.pop(6) print(lst) # pop index out of range lst = [10, 20, 30, 40, 50, 60, 30] # pop()根据索引移除元素 lst.pop(1) print(lst) lst.pop(5) print(lst) # pop index out of range lst.pop() # 如果不指定参数(索引),将删除列表中的最后一个元素 print(lst) lst = [10, 20, 30, 40, 50, 60, 30] print("------切片操作-删除至少一个元素,将产生一个新的列表对象") new_list = lst[1:3] print('原列表', lst)#原列表 [10, 20, 30, 40, 50, 60, 30] print('切片后的列表', new_list)#切片后的列表 [20, 30] '''不产生新的列表对象,二回删除原列表中的内容''' lst = [10, 20, 30, 40, 50, 60, 30] lst[1:3] = [] print(lst) # [10, 40, 50, 60, 30] """清楚列表中的所有元素""" lst = [10, 20, 30, 40, 50, 60, 30] lst.clear() print(lst) """del语句将列表对象删除""" lst = [10, 20, 30, 40, 50, 60, 30] del lst print(lst)#name 'lst' is not defined
lst = [10, 20, 30, 40] # 一次修改一个值 lst[2] = 100 print(lst) # [10, 20, 100, 40] lst[1:3] = [300, 400, 500, 600] # [10, 300, 400, 500, 600, 40] print(lst)
列表元素的排序操作
·常见的两种方式
·调用sort()方法,列有中的所有元素默认按照从小到大的顺序进行排序,可以指定reverse=True,进行降序排序
·调用内置函数sorted(),可以指定reverse=True,进行降序排序,原列表不发生改变
lst = [20, 40, 10, 98, 54] print('排序前的列表', lst, id(lst)) # 排序前的列表 [20, 40, 10, 98, 54] 3245910544000 # 开始排序,调用列表对象的sort方法,升序排序 lst.sort() print('排序后的列表', lst, id(lst)) # 排序后的列表 [10, 20, 40, 54, 98] 1433208368896 # 通过指定关键字参数,将列表中的元素进行降序排序 lst.sort(reverse=True) # reverse=True 表示降序排序 reverse=False就是降序排序 print(lst)#[98, 54, 40, 20, 10] lst.sort(reverse=False) print(lst)#[10, 20, 40, 54, 98] # 使用内置函数sorted()对列表进行排序,将产生一个新的列表对象 lst = [20, 40, 10, 98, 54] print('原列表', lst) # 开始排序 new_list = sorted(lst) print(lst) print(new_list) # 指定关键字参数,实现列表元素的降序排序 desc_list = sorted(lst, reverse=True) print(desc_list)
简称生成列表的公式
·语法格式:
[i*i for i in range(1,10)]
lst = [i for i in range(1, 10)] print(lst) # [1, 2, 3, 4, 5, 6, 7, 8, 9] lst = [i * i for i in range(1, 10)] print(lst) # [1, 4, 9, 16, 25, 36, 49, 64, 81] '''列表元素的值为2,4,6,8,10''' lst2=[i*2 for i in range(1,6)] print(lst2)#[2, 4, 6, 8, 10]
字典嘛,让我想到了老师的棒棒,---->{},
{‘张三’:100}:冒号显得很随意
字典dictionary,dict(name=‘jack’) ,"="像一个字典横着放在那
·字典对应的英语单词是dict---->dict()
·Python内置的数据结构之一,与列表一样时一个可变序列·以键值对的方式存储数据,字典是一个无序的序列
·最常用的方式:使用花括号
scores={‘张三’:100,‘李四’:98}
·使用内置函数dict()
dict(name=‘jack’,age=20)
"""使用{}创建字典""" scores = {'张三': 100} print(scores) # {'张三': 100} print(type(scores)) # <class 'dict'> '''第二种方式dict()''' student = dict(name='jack', age=20) print(student) # {'name': 'jack', 'age': 20} '''空字典''' d = {} print(d) # {}
scores = {'张三': 100, '李四': 98, '王五': 45} '''第一种方式,使用[]''' print(scores['张三']) # 100 # print(scores['陈六'])#KeyError: '陈六' '''第二种方式,使用get()方法''' print(scores.get('张三')) # 100 print(scores.get('陈六')) # None print(scores.get('马奇', 99)) # 99 99是在查找’马奇‘所对的value不存在时,提供第一个默认值
"""key的判断""" scores = {'张三': 100, '李四': 98, '王五': 45} print('张三' in scores) # True print('张三' not in scores) # False del scores['张三'] # 删除指定的key-value对 scores.clear() # 清空字典的元素 print(scores) # False #新增元素 scores = {'张三': 100, '李四': 98, '王五': 45} scores['陈六'] = 98 print(scores)#{'张三': 100, '李四': 98, '王五': 45, '陈六': 98} #修改元素 scores = {'张三': 100, '李四': 98, '王五': 45, '陈六': 98} scores['陈六'] = 100 print(scores)
1、keys()------获取字典中所有key
2、values()------获取字典中所有value
3、items()------获取字典中所有key,values
scores = {'张三': 100, '李四': 98, '王五': 45} # 获取所有的key keys = scores.keys() print(keys) # dict_keys(['张三', '李四', '王五']) print(type(keys)) # <class 'dict_keys'> print(list(keys)) # ['张三', '李四', '王五'] # 获取所有的value values = scores.values() print(values) # dict_values([100, 98, 45]) print(type(values)) # <class 'dict_values'> print(list(values)) # [100, 98, 45] # 获取所有的key-value对 items = scores.items() print(items) # dict_items([('张三', 100), ('李四', 98), ('王五', 45)]) print(list(items)) # [('张三', 100), ('李四', 98), ('王五', 45)] # 转换之后的列表元素是由元组组成的
scores = {'张三': 100, '李四': 98, '王五': 45} # 字典元素的遍历 for item in scores: print(item, scores[item], scores.get(item)) # 张三 100 100 # 李四 98 98 # 王五 45 45
1、字典中的所有元素都是一个key-value对,key不允许重复,value可以重复
2、字典中的元素是无序的
3、字典中的key必须是不可变对象
4、字典也可以根据需要动态地伸缩
5、字典会浪费较大的内存,是一种使用空间换时间的数据机构
d = {'name': '张三', 'name': '李四'} # key不允许重复 print(d) d = {'name': '张三', 'nickname': '张三'} # values可以重复的 print(d) lst = [10, 20, 30] lst.insert(1, 100) print(lst) # [10, 100, 20, 30 d = {lst: 100} # unhashable type: 'list' print(d) '''不懂,可以再回来看一下'''
items = ['Fruits', 'Books', 'Others'] prices = [96, 78, 85] d = {item.upper(): price for item, price in zip(items, prices)} print(d)#{'FRUITS': 96, 'BOOKS': 78, 'OTHERS': 85}
字典的创建
1、使用{}花括号
2、内置函数dict()
3、字典生成式
常用操作
1、获取value
·字典名[key]
·字典名.get(key)
2、删除key-value对
del字典名[key]
3、修改/新增
字典名[key]=value
4、in/not
什么是元组
·元组很圆 所以用()包住元素,又因为它很圆滑,可以把括号去掉
·元组对应的英语单词是tuple—>tuple(())
·元组
·Python内置的数据结构之一,是一个不可变的序列
·不可变序列与可变序列
·不可变序列与可变序列
·不变序列:字符串、元组
·不可变序列:没有增、删、改的操作
·可变序列:列表、字典
·可变序列:可以对序列执行增、删、改操作,对象地址不发生更改
"""可变序列 列表,字典""" lst = [10, 20, 45] print(id(lst)) # 2190449651584 lst.append(300) print(id(lst)) # 2190449651584 '''不可变序列,字符串,元组''' s = 'hello' print(id(s))#3209077469104 s = s + 'world' print(id(s))#3209077476656 print(s)#helloworld
直接小括号
t = (‘Python’,‘hello’,90)
使用内置函数tuple()
t = tuple((‘Python’,‘hello’,90))
只包含一个元组的元素需要使用逗号和小括号
t=(10,)
'''第一种创建方式,使用()''' t=('Python','world',98) print(t) # ('Python', 'world', 98) print(type(t)) # <class 'tuple'> '''第二种创建方式,使用内置函数tuple()''' t2 = 'Python', 'world', 98 # 省略了小括号 print(t2) # ('Python', 'world', 98) print(type(t2)) # <class 'tuple'> t3 = ('Python',) # 如果元组中只有一个元素,逗号不能省略 print(t3) # ('Python',) print(type(t3)) # <class 'tuple'> '''第二种方式,使用内置函数tuple()''' t1 = tuple(('Python', 'world', 98)) print(t1) # ('Python', 'world', 98) print(type(t1)) # <class 'tuple'> '''空元组的创建方式''' '''空列表的创建方式''' lst = [] lst1 = list() d = {} d2 = dict() # 空元组 t4 = () t5 = tuple() print('空列表', lst, lst1) # 空列表 [] [] print('空字典', d, d2) # 空字典 {} {} print('空元组', t4, t5) # 空元组 () ()
·在多任务环境下,同时操作对象时不需要加锁
·因此,在程序中尽量使用不可变序列
注意事项:
元组中存储的是对象的引用
a)如果元组中对象本身不可对象,则不能再引用其它对象
b)如果元组中的对象是可变对象,则可变对象的引用不允许改变,但数据可以改变
t = [10, [20, 30], 9] print(t) # (10, [20, 30], 9) print(type(t)) # <class 'tuple'> print(type(t[0]), type(t[0]), id(t[0])) # <class 'int'> <class 'int'> 2155089521232 print(type(t[1]), type(t[1]), id(t[1])) # <class 'list'> <class 'list'> 2155091275648 print(type(t[2]), type(t[2]), id(t[2])) # <class 'int'> <class 'int'> 2155089521200 '''尝试将t[1]修改为100''' print(id(100)) # t[1] = 100 #元组是不允许修改元素的 '''由于[20,30]列表,而列表是可变序列,所以可以向列中添加元素,而列表中的内存地址不变''' t[1].append(100) # 向列表中添加元素 print(t,id(t[1])) # [10, [20, 30, 100], 9]
t = ('Python', 'world', 98) '''第一种获取元组的方式,使用索引''' print(t[0]) # Python print(t[1]) # world print(t[2]) # 98 #print(t[3]) # tuple index out of range '''遍历元组''' for item in t: print(item) ''' Python world 98 '''
集合对应的英语单词是set()
·Python语言提供的内置数据结构
·与列表、字典一样都属于可变类型的序列
·集合是没有value的字典
"""第一种创建方式使用{}""" s = {2, 3, 4, 5, 5, 6, 7, 7} # 集合中的元素不能重复 print(s) # {2, 3, 4, 5, 6, 7} '''第二种创建方式使用set()''' s1 = set(range(6)) print(s1, type(s1)) # {0, 1, 2, 3, 4, 5} <class 'set'> s2 = set([1, 2, 3, 4, 5, 5, 6, 6]) print(s2, type(s2)) # {1, 2, 3, 4, 5, 6} <class 'set'> s3 = set((1, 2, 4, 4, 5, 65)) print(s3, type(s3)) # {65, 1, 2, 4, 5} <class 'set'> s4 = set('python') print(s4, type(s4)) # {'t', 'o', 'n', 'h', 'y', 'p'} <class 'set'> s5 = set({12, 4, 34, 55, 66, 44}) print(s5, type(s5)) # {34, 66, 4, 55, 12, 44} <class 'set'> # 定义一个空集合 s6 = {} # dict字典类型 print(type(s6)) # <class 'dict'> s7 = set() print(type(s7)) # <class 'set'>
·集合元素的判断操作
·in或not in
·集合元素的新增操作
·调用add()方法,一次添中一个元素
·调用update()方法,至少添中一个元素
·集合元素的删除操作
·调用remove()方法,一次删除一个指定元素,如果指定的元素不存在抛出KeyErrot
·调用discard()方法,一次删除一个指定元素,如果指定的元素不存在不抛异常
·调用pop()方法,一次只删除一个任意元素
·调用clear()方法,清空集合
s = {10, 20, 30, 405, 60} '''集合元素的判断操作''' print(10 in s) # True print(100 in s) # False print(10 not in s) # False print(100 not in s) # True '''集合元素的新增操作''' s.add(80) # add一次添加一个元素 print(s) # {80, 20, 405, 10, 60, 30} s.update({200, 400, 300}) # 一次至少添加一个元素 print(s) # {200, 10, 300, 80, 400, 20, 405, 60, 30} s.update([100, 99, 8]) s.update((78, 64, 56)) print(s) # {64, 99, 100, 200, 8, 10, 300, 78, 80, 400, 20, 405, 56, 60, 30} '''集合元素的删除操作''' s.remove(100) print(s) # {64, 99, 200, 8, 10, 300, 78, 80, 400, 20, 405, 56, 60, 30} # s.remove(500)#KeyError: 500 s.discard(500) # {64, 99, 200, 8, 10, 300, 78, 80, 400, 20, 405, 56, 60, 30} print(s) s.pop() s.pop() # s.pop(400)#set.pop() takes no arguments (1 given) pop方法不能添加参数 print(s) # {200, 8, 10, 300, 78, 80, 400, 20, 405, 56, 60, 30} s.clear() print(s) # set()
两个集合是否相等
·可以使用运算符==或!=进行判断
一个集合是否是另一个集合的子集
·可以调用方法issubset进行判断
·B是A的子集
一个集合是否是另一个集合的超集
·可以调用方法issuperset进行判断
·A是B的超集
两个集合是否没有交集
·可以调用方法isdisjojoint进行判断
"""两个集合是否相等(元素相同,就相等)""" 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)) # True print(s3.issubset(s1)) # False '''一个集合是否是另一个集合的超集''' print(s1.issuperset(s2)) # True print(s1.issuperset(s3)) # False '''两个集合是否含有交集''' print(s2.isdisjoint(s3)) # False #有交集为False s4 = {100, 200, 300} print(s2.isdisjoint(s4)) # True 没有交集为True
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQh13eTs-1643201540462)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220120181531029.png)]
# (1)交集 s1 = {10, 20, 30, 40} s2 = {20, 30, 40, 50, 60} print(s1.intersection(s2)) # {40, 20, 30} print(s1 & s2) # {40, 20, 30}#intersection与&等价,交集操作 # (2)并集操作 print(s1.union(s2)) print(s1 | s2) # union与|等价,并集操作 print(s1) # {40, 10, 20, 30} print(s2) # {50, 20, 40, 60, 30} # (3)差集操作 print(s1.difference(s2)) # {10} print(s1 - s2) # {10} print(s1) print(s2) # (4)对称差集 print(s1.symmetric_difference(s2))#{50, 10, 60} print(s1 ^ s2)#{50, 10, 60}
·用于生成集合的公式
{i*i for i in range(1,10)}
·将{}修改为[]j就是列表生成式
·没有元组生成式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubEqBxLv-1643201540464)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220120221831248.png)]
# 列表生成式 lst = [i * i for i in range(10)] print(lst) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 集合生成式 s = {i * i for i in range(10)} print(s) # {0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
列表
1、lst = [‘hello’, ‘world’, 98]
2、lst2 = list([‘hello’, ‘world’, 98])
字典
1、dit = {‘张三’: 100}
2、dit1 = dict(name=‘jack’, age=20)
元组
1、tup=(‘Python’,‘world’,98)
tup2 = (‘Python’,)
tup3 = ‘Python’, ‘world’, 98
2、tup4 = tuple((‘Python’, ‘world’, 98))
集合
1、s = {2, 3, 4, 5, 5, 6, 7, 7}
2、 s1 = set(range(6))
s2 = set([1, 2, 3, 4, 5, 5, 6, 6])
s3 = set((1, 2, 4, 4, 5, 65))
s4 = set({12, 4, 34, 55, 66, 44})
s5 = set(‘python’)# {‘t’, ‘o’, ‘n’, ‘h’, ‘y’, ‘p’}
获取指定元素的索引
lst = [‘hello’, ‘world’, 98, ‘hello’]
1、print(lst.index(‘hello’))
2、print(lst.index(‘hello’, 1, 4))
获取列表中的单个元素
lst = [‘hello’, ‘world’, 98, ‘hello’, ‘world’, 234]
1、print(lst[2]) # 98
print(lst[-3]) # hello
print(lst[10]) # IndexError: list index out of range
scores = {‘张三’: 100, ‘李四’: 98, ‘王五’: 45}
‘’‘第一种方式,使用[]’’’
print(scores[‘张三’]) # 100
print(scores[‘陈六’])#KeyError:‘陈六’
‘’‘第二种方式,使用get()方法’’’
print(scores.get(‘张三’)) # 100
print(scores.get(‘陈六’)) # None
print(scores.get(‘马奇’, 99)) # 99 99是在查找’马奇‘所对的value不存在时,提供第一个默认值
·在Python中字符串是基本数据类型,是一个不可变的字符序列
注:第一个不可变的序列是元组,第二个不可变的序列是字符串
·仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
·字符串的长度为0或1时
·符合标识符的字符串
s1='' s2='' print(s1 is s2)#True s1='%' s2='%' print(s1 is s2)#True s1='abc%' s2='abc%' print(s1==s2)#True 内容相同 print(s1 is s2)#False 地址不相同
·字符串只在编译时进行驻留,而非运行时
a='abc' b='ab'+'c' c=''.join(['ab',c])#join的操作是在程序运行的时候,程序在运行的时候当然会开辟一个新的空间 print(a is b)#True print(a is c)#False print(c)#abc
·[-5,256]之间的整数数字
a=-5 b=-5 print(a is b)#True a=-6 b=-6 print(a is b)#False
import sys a='abc%' b='abc%' print(a is b)#False a=sys.intern(b) print(a is b)#True
就是之前为值false的结果在PyCharm编译器中是驻留的,是True的
·当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,替身效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的。
·在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比"+"效率高
·index() 查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出ValueError
·rindex()查找子串substr最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError
·find()查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1
·rfind()查找子串substr最后一次出现的位置,如果查找的子串不存在时,则返回-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pjoysoFO-1643201540465)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220121115056706.png)]
# 字符串的查询操作 s = 'hello,hello' print(s.index('lo')) # 3 print(s.find('lo')) # 3 print(s.rindex('lo')) # 9 print(s.rfind('lo')) # 9 # print(s.index('k'))# ValueError: substring not found print(s.find('k')) # -1 # print(s.rindex('k'))#ValueError: substring not found print(s.rfind('k')) # -1
把字符串中所有字符都转成大写字母
把字符串中所有字符都转成小写字母
把字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母
把第一个字符转换成大写,把其余字符转换成小写
# 字符串中的大小写转换的方法 s = 'hello,python' a = s.upper() # 转成大写之后,会产生一个新的字符串对象 print(s) # HELLO,PYTHON print(a, id(a)) # HELLO,PYTHON 2190073744368 print(s, id(s)) # HELLO,PYTHON 1561669349040 print(s.lower()) # hello,python print(s.lower(), id(s.lower())) # hello,python 2207706857648 print(s, id(s)) # hello,python 2207706853296 s2 = 'hello,Python' print(s2.swapcase()) # HELLO,pPYTHON print(s2.title()) # Hello,Python
居中对齐,第一个参数指定宽度,第二个仓鼠指定填充符,第二个参数是可选的,默认是空格,如果设置款难度小于实际宽度则返回字符串
左对齐,第1个参数指定宽度,第2个参数指定填充符,第二个参数是可选的,默认是空格如果设置宽度小于实际宽度则返回原字符串
右对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格如果设置宽度小于实际宽度则返回原字符串、
右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的款难度小于等于字符串的长度,返回字符串本身
s = 'hello,Python' '''居中对齐''' print(s.center(20, '*')) # ****hello,Python**** '''左对齐''' print(s.ljust(20, '*')) # hello,Python******** print(s.ljust(10, )) # hello,Python print(s.ljust(20)) # hello,Python 默认填充格式空格 '''右对齐''' print(s.rjust(20, '*')) # ********hello,Python print(s.rjust(20)) # hello,Python print(s.rjust(10)) # hello,Python '''右对齐,使用0进行填充''' print(s.zfill(20))#00000000hello,Python print(s.zfill(10))#hello,Python print('-8910'.zfill(8))#-0008910
从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
s='hello world Python' lst=s.split() print(lst)#['hello', 'world', 'Python']
以通过参数sep指定劈分字符串是劈分符
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分之后,剩余的子串会单独做成一部分
s1='hello|world|Python' print(s1.split(sep='|'))#['hello', 'world', 'Python'] print(s1.split(sep='|',maxsplit=1))#['hello', 'world|Python']
从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
以通过参数sep指定劈分字符串是劈分符
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串单独会做成一部分
s1 = 'hello|world|Python' print(s1.split(sep='|')) # ['hello', 'world', 'Python'] print(s1.split(sep='|', maxsplit=1)) # ['hello', 'world|Python'] s = 'hello world Python' print(s.rsplit()) # ['hello', 'world', 'Python'] print(s.rsplit('|')) # ['hello world Python'] print(s1.rsplit(sep='|', maxsplit=1)) # ['hello|world', 'Python']
判断指定的字符串是不是合法的标识符
判断指定的字符串是否全部由空白字符组成(回车,换行,水平制表符)
判断指定的字符串是否全部由字母组成
判断指定字符串是否全部由字母组成
判断指定的字符串是否全部由数字组成
判断指定字符串是否全部由字母和数字组成
replace()
第1个参数指定被替换的子串,第2个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法时可以通过第3个参数指定最大替换次数
join()
将列表或元组中的字符串合并成一个字符串
s = 'hello,Python' print(s.replace('Python', 'Java')) # hello,Java s1 = 'hello,Python,Python,Python' print(s1.replace('Python', 'Java', 2)) # hello,Java,Java,Python lst = ['hello', 'java', 'Python'] print('|'.join(lst)) # hello|java|Python print(''.join(lst)) # hellojavaPython t = ('hello', 'Java', 'Python') print(''.join(t)) # helloJavaPython t = ('hello', 'Java', 'Python') print(''.join(t)) # helloJavaPython print('*'.join('Python')) # P*y*t*h*o*n
运算符:>,>=,<,<=,==,!=
**比较规则:**首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,一次比较下去,指导两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
**比较原理:**两个以上字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符
a = b = 'Python' c = 'Python' print(a == b) # True print(b == c) # True print(a is b) # True print(a is c) # True print(id(a)) # 2592489649456 print(id(b)) # 2592489649456 print(id(c)) # 2592489649456
print(s1) # hello print(s2) # Python print(newstr) # hello!Python print(s1) # hello print(s2) # Python print(newstr) # hello!Python print("-----------") print(id(s)) # 2474006161840 print(id(s1)) # 2474010624176 print(id(s2)) # 2474010824176 print(id(s3)) # 2474010624048 print(id(newstr)) # 2474010639536 print("--------------切片[start:end:step]-----------------") print(s[1:5:1]) # 从1开始截到5(不包含5),步长为1 ello print(s[::2]) # 默认从0开始,没有写结束,默认字符串的最后一个元素,步长为2,两个元素之间的索引间隔为2 hloPto print(s[::-1]) # 默认从字符串的最后一个元素开始,到字符串的第一个元素结束,因为步长为负数 nohtyP,olleh print(s[-6::1]) # 从索引为-6开始,到字符串的最后一个元素结束,步长为1 Python
# (1)%占位符 name = '张三' age = 20 print('我叫%s,今年%d岁' % (name, age)) # 我叫张三,今年20岁 # (2){} print("我叫{0},今年{1}岁".format(name, age)) # 我叫张三,今年20岁 # {3}f-string print(f'我叫{name},今年{age}岁') # 我叫张三,今年20岁 print('%10d' % 99)#10表示的是宽度 print('%.3f' % 3.1415926)#.3表示是小数点后三位 #同时表示宽度和精度 print('%10.3f' % 3.1415926)#一共总宽度为10,小数点后3位
print('%10d' % 99) # 99 10表示的是宽度 print('%.3f' % 3.1415926)#3.142 #同时表示宽度和精度 print('%10.3f' % 3.1415926)# 3.142 一共总宽度为10,小数点后3位 print('hellohello') # hellohello print('hellohello') print('{0:.3f}'.format(3.1415926))#.3表示的是一共是3位数 print('{0:.3f}'.format(3.1415926))#.3f表示是3位小数 print('{:10.3f}'.format(3.1415926))#同时设置宽度和精度
s = '天涯共此时' # 编码 print(s.encode(encoding='GBK')) # 在GBK这种编码格中 一个中文占两个字节 print(s.encode(encoding='UTF-8')) # 在UTF-8这种编码格式中,一个中文占三个字节 # 解码 # byte代表的就是一个二进制数据(字节类型的数据) byte = s.encode(encoding='GBK') # 编码 print(byte.decode(encoding='GBK')) # 解码 byte = s.encode(encoding='UTF-8') print(byte.decode(encoding='UTF-8'))
# 位置实参 # 根据形参对应的位置进行实参传递 def calc(a, b): c = a + b return c result = calc(10, 20) print(result) # 关键字实参 # 根据形参名称进行实参传递 res = calc(b=10, a=20) # 等号左侧的变量的名称成为关键字参数 print(res)
print(bool(0)) # False print(bool(8)) # 非0的布尔值为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()) '''False True ([29, 23, 53, 55], [10, 34, 44]) hello hello ('hello', 'world') '''
def fun(a, b=10): print(a, b) # 函数的调用 fun(100) # 100 10 fun(20, 30) # 20 30 print('hello',end='\t') print('world')#hello 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) print('hello', 'world', 'java') '''def fun2(*args,*a): pass 以上代码,程序会报错,个数可变的位置参数,只能是1个 def fun2(**args,**args): pass 以上代码,程序会报错,个数可变的位置参数,只能是1个 ''' def fun2(*args1, **args2): pass '''def fun2(**args,**args): pass 在一个函数的定义过程中,既有个数可变的关键字,也有个数可变的位置形参,要求,个数可变的位置形参,放在个数可变的关键字形参之前 '''
def fun(a, b, c): # 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) # 在函数调用时,将字典中的键值对都转换为关键字实参传入 ''' a= 10 b= 20 c= 30 a= 11 b= 22 c= 33 ---------------- a= 100 b= 200 c= 300 a= 111 b= 222 c= 333 ''' def fun(a, b=10): # b是在函数的定义处,所以b是形参,而且进行了赋值,所以b称为默认值形参 print('a=', a) print('b=', b) def fun2(*args): # 个数可变的位置形参 print(args) def fun3(**args2): # 个数可变的关键字形参 print(args2) fun2(10, 20, 30, 40) # (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采用的是关键字实参传递 '''需求, 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,就是全局变量,因为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) # 调用函数 fun2() '''杨老师 杨老师 20 20 杨老师 '''
如果在一个函数体内调用了该函数本身,这个函数就称为递归函数
递归调用与递归终止条件
每递归调用一次函数,都会在栈内存分配一个栈帧
每执行完一次函数,都会释放相应的空间
缺点:占用内存多,效率低下
优点:思路和代码简单
def fac(n): if n == 1: return 1 else: res = n * fac(n - 1) return res print(fac(6))#720
def fib(n): if n == 1: return 1 elif n == 2: return 1 else: return fib(n - 1) * fib(n - 2) # 斐波那契数列第六位上的数字 print(fib(6)) # 输出这个数列的前6位上的数字 for i in range(1, 7): print(fib(i)) '''def fib(n): if n == 1: return 1 elif n == 2: return 1 else: return fib(n - 1) * fib(n - 2) # 斐波那契数列第六位上的数字 print(fib(6)) # 输出这个数列的前6位上的数字 for i in range(1, 7): print(fib(i))'''
age = input('请输入你的年龄') print(type(age)) if int(age) >= 18: print('成年人...')
1、漏了末尾的冒号,如if语句,循环语句,else子句等
2、缩进错误,该缩进的没缩进,不该缩进的瞎缩进
3、把英文符号写成中文符号,比如说:引号,冒号,括号
4、字符串拼接的时候,把字符串和数字拼在一起
5、没有定义变量,比如说while的循环条件的变量
6、“==”比较运算符合“=”赋值运算符的混用
(1)索引越界问题IndexError
lst=[11,22,33,44]
print(lst[4])
lst = [11, 22, 33, 44] print(lst[3])
(2)append()方法的使用掌握不熟练
lst=[]
lst=append(‘A’,‘B’,‘C’)
print(lst)
lst=[] lst.append('A') lst.append('B') lst.append('C') print(lst)#['A', 'B', 'C']
lst = [{'rating': [9.7], 'id': '1292052', 'type': ['犯罪'], 'title': '肖申克的救赎', 'actors': ['蒂姆', '摩根']}, {'rating': [9.6], 'id': '1291546', 'type': ['剧情'], 'title': '霸王别姬', 'actors': ['张国荣', '张丰毅']}, {'rating': [9.5], 'id': '1292720', 'type': ['剧情'], 'title': '阿甘正传', 'actors': ['汤姆', '罗宾']}] name = input('请输入您要查询的演员:') for item in lst: # 遍历列表 -->{} item是一个又一个的字典 act_lst = item['actors'] for actor in act_lst: # 遍历字典,得到movie是一个字典中的key if name in actor: print(name, '出演了', item['title']) '''actors = movie['actors'] if name in actors: print(name + '出演了:' + movie) '''
被动掉坑:程序代码逻辑没有错,知识因为用户错误操作或者一些“例外情况”而导致的程序崩溃
**题目要求:**输入两个整数并进行除法运算
try: a = int(input('请输入第一个整数')) b = int(input('请输入第二个整数')) result = a / b print('结果为:', result) except ZeroDivisionError: print('对不起,除数不允许为0') except ValueError: print('只能输入数字串') print('程序结束')
try: a = int(input('请输入第一个整数')) b = int(input('请输入第二个整数')) result = a / b except BaseException as e: print('出错了', e) else: print("计算结果为:",result)
try: a = int(input('请输入第一个整数')) b = int(input('请输入第二个整数')) result = a / bexcept BaseException as e: print('出错了', e) else: print("计算结果为:",result) finally: print('谢谢您的使用')python
ZeroDivisionError除零
IndexError序列中没有此索引
KeyError映射中没有这个键
NameError未声明/初始化对象(没有属性)
SyntaxErrorPython语法错误
ValueError传入无效的参数
# print(10/0)#ZeroDivisionError lst = [11, 22, 33, 44] #print(lst[4]) # IndexError #print(num)#NameError #int a=20#SyntaxError a=int('hello')#ValueError
import traceback try: print('-------------------------') print(1 / 0) except: traceback.print_exc()
class Student: # 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进行修饰,所以我是静态方法') # 类方法 def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰') # 在类之外定义的成为函数,在类之内定义的成为方法 def drink(): print('喝水')
**类属性:**类中方法外的变量成为类属性,被该类的所有对象多共享
类方法:使用@classmethod修饰的方法,使用类名直接访问的方法
静态方法:使用@staticmethod修饰的主法,使用类名直接访问的方法
class Student: # 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进行修饰,所以我是静态方法') # 类方法 def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰') # 在类之外定义的成为函数,在类之内定义的成为方法 def drink(): 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) Student.cm() print('----------------静态方法的使用方式---------------') Student.method()
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)) stu2.gender = '女' # 只为stu2动态绑定了性别 print(stu1.name, stu1.age) print(stu2.name, stu2.age, stu2.gender) stu1.eat() stu2.eat() #动态绑定方法 def show(): print('定义在类之外的,称函数') stu1.show=show stu1.show() #stu2.show() '''1997157314512 1997157313120 张三 20 李四 30 女 张三在吃饭 李四在吃饭 定义在类之外的,称函数 '''
class Student: def __init__(self, name, age): self.name = name self.__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 进行访问
class Person(object): def __init__(self, name, 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, teacheryear): super().__init__(name, age) self.teacheryear = teacheryear stu = Student('张三', 20, '1001') teacher = Teacher('李四', 34, 10) stu.info() teacher.info() ''' 张三 20 李四 34''' # 多继承 class A(object): pass class B(object): pass class C(A, B): pass
方法重写
·如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写
·子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法
·object类是所有类的父类,因此所有类都有object类的属性和方法。
·内置函数dir()可以查看指定对象所有属性
·Object有一个__str__()方法,用于返回一个’对象的描述’,对应与内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对__str__()进行重写
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__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name'] 我的名字是张三,今年20岁 <class '__main__.Student'>'''
多态就是"具有多种形态",它指的是:几遍不知道一个变量所引用的对象到底是什么类型,任然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法
静态语言和动态语言关于多态的区别
·静态语言实现多态的三个必要条件
·继承
·方法重写
·父类引用指向子类对象
·动态语言的多态崇尚“鸭子类型”当看到一只鸟走起来想鸭子、游泳起来像鸭字、收起来也想鸭子,name这只鸟就可以被称为鸭子。在鸭子类型中,不需要关心对象是什么类型,到底是不是鸭子,只关心对象的行为
class A: pass class B: pass class C(A, B): def __init__(self, name, age): self.name = name self.age = age # 创建C类的对象 x = C('Jack', 20) # x是C类型的一个实例对象 print(x.__dict__) #实例对象的属性字典 print(C.__dict__) print(x.__class__)#输出了对象所属的类 print(C.__bases__)#C类的父类类型的元素 print(C.__base__) print(A.__subclasses__()) ''' {'name': 'Jack', 'age': 20} {'__module__': '__main__', '__init__': <function C.__init__ at 0x0000024C5F89DB80>, '__doc__': None} <class '__main__.C'> (<class '__main__.A'>, <class '__main__.B'>) <class '__main__.A'> '''
a = 20 b = 100 c = a + b # 两个帧数类型的对象的相加操作 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('张三') stu2 = Student('李四') s = stu1 + stu2 # 实现了两个对象的加法运算(因为在Student类中,编写__add__()特殊的方法) print(s) s = stu1.__add__(stu2) print(s) lst = [11, 22, 33, 44] print(len(lst)) # len是内置函数len,可以计算列表的长度 print(lst.__len__()) print(len(stu1))
'''特殊属性 __dict__ 获得类对象或实例对象所绑定的所有属性和方法的字典 特殊方法 __len__() 通过重写__len__()方法,让内置函数len()的参数可以自定义类型 __add__() 通过重写__add__()方法,可使用自定义对象具有“+”功能 __new__() 用于创建对象 __init__() 对创建的对象进行初始化 '''
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dr1fcSnZ-1643201540467)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220124114008841.png)]
class Person(object): def __new__(cls, *args, **kwargs): print('__new__被调用执行了cls的id值为{0}'.format(id(cls))) obj = super().__new__(cls) print('创建的对象的id为:{0}'.format(id(obj))) return obj def __init__(self, name, age): print('__init__被调用了,self的id值为:{0}', format(id(self))) self.name = name self.age = age print('object这个类对象的id为:{0}'.format(id(object))) print('Person这个类对象的id为:{0}'.format(id(Person))) # 创建Person类的实例对象 p1 = Person('张三', 20) print('p1这个Person类的实例对象的id:{0}'.format(id(p1)))
变量的赋值操作
只是形成两个变量,实际上还是只想同一个对象
浅拷贝
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) print(cpu2) # (2)类有浅拷贝 print('------------------------------') disk = Disk() # 创建一个硬盘类对象 computer = Computer(cpu1, disk) # 创建一个计算机类的对象 # 浅拷贝 import copy print(disk) computer2 = copy.copy(computer) print(computer, computer.cpu, computer.disk) print(computer2, computer2.cpu, computer2.disk) # 深拷贝 computer3 = copy.deepcopy(computer) print(computer, computer.cpu, computer.disk) print(computer3, computer3.cpu, computer3.disk) <__main__.CPU object at 0x0000023E0FC21FD0> <__main__.CPU object at 0x0000023E0FC21FD0> ------------------------------ <__main__.Computer object at 0x0000023E0FC21F70> <__main__.CPU object at 0x0000023E0FC21FD0> <__main__.Disk object at 0x0000023E0FC21FA0> <__main__.Computer object at 0x0000023E0FC21190> <__main__.CPU object at 0x0000023E0FC21FD0> <__main__.Disk object at 0x0000023E0FC21FA0>
创建模块
新建一个.py文件,名称尽量不要与Python自带的标准模块名称相同
导入模块
import 模块名称 [as 别名]
from 模块名称 import 函数/变量/类
import math # 关于数学运算 print(id(math)) print(type(math)) print(math) print(math.pi) print('----------------------') print(dir(math)) print(math.pow(2, 3), type(math.pow(2, 3))) print(math.ceil(9.001)) print(math.floor(9.999)) ''' 2855299925232 <class 'module'> <module 'math' (built-in)> 3.141592653589793 ---------------------- ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp'] 8.0 <class 'float'> 10 9'''
from math import pi print(pi) print(pow(2, 3)) # print(math.pow(2,8))
def add(a, b): return a + b def div(a, b): return a / b # 这个模块的名称是calc import calc print(calc.add(10,20)) print(calc.div(10,4)) from calc import add print(add(10,20))
以主程序方式运行124
def add(a, b): return a + b if __name__ == '__main__': print(add(10, 20)) # 只有当点击运行calc2时,才会执行运算
sys 与Python解释其及其环境操作相关的标准库
time提供与时间相关的各种函数的标准库
os提供了访问操作系统服务功能的标准库
calendar提供与日期相关的各种函数的标准库
urllib用于读取来自网上(服务器)的数据标准库
json用于使用Json序列化和反序列化对象
re用于在字符串中执行正则表达式匹配和替换
math提供标准算数运算函数的标准库
decimal用于进行精准控制运算精度、有效数位和四舍五入操作的十进制运算
logging提供了灵活的记录时间、错误、警告和调试信息的功能
import sys import time import urllib.request print(sys.getsizeof(24))#28 print(sys.getsizeof(45))#28 print(sys.getsizeof(True))#28 print(sys.getsizeof(False))#24 print(time.time())#1643016733.717006 print(time.localtime(time.time()))#time.struct_time(tm_year=2022, tm_mon=1, tm_mday=24, tm_hour=17, tm_min=32, tm_sec=13, tm_wday=0, tm_yday=24, tm_isdst=0) print(urllib.request.urlopen('http://www.baidu.com').read())
常见的字符编码格式
Python的解释器使用的是Unicode(内存)
py文件在磁盘上使用UTF-8存储(外存)
·文件的读写俗称“IO操作”
·文件读写操作流程
·操作原理
file = open('a.txt', 'r') print(file.readlines()) file.close()
文件类型
按文件中数据的组织形式,文件分为以下两大类
**文本文件:**存储的是普通"字符"文本,默认为uincode字符集,可以使用记本事程序打开
**二进制文件:**把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:mp3音频文件,jpg图片,.doc文档等
r以值读模式打开文件,文件的指针将会放在文件的开头
w以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在文件的开头
a以追加模式打开文件,如果我呢间不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾住家内容,文件指针在源文件末尾
b以二进制方式打开文件,不能单独使用,需要与供他模式一起视同,rb,或者wb
**+**以读写方式打开文件,不能单独使用,需要与其它模式一起使用,a+
#w file = open('b.txt', 'w') file.write('Python') file.close() #b src_file = open('b.txt', 'r') target_file = open('copylogo.png', 'wb') print(target_file.write(src_file.read())) target_file.close() src_file.close()
**read([size])**从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
**readline()**从文本文件中读取一行内容
**readlines()**把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
**write(str)**将字符串str内容写入文件
**writelines(s_list)**将字符串str内容写入文件
**writelines(s_list)**将字符串列表s_list写入文本文件,不添加换行符
seek把文件指针移动到新的位置,offset表示相对于whence的位置:offset:为正往结束方向移动,为负往开始方向移动 whence不同的值代表不同含义
0:从文件头开始计算默认值(默认值)
1:从当前位置开始计算
2:从文件末开始计算
**tell()**返回文件指针的当前位置
**flush()**把缓冲区的内容写入文件,但不关闭文件
**close()**把缓冲区的内容写入文件,同时关闭文件,释放对象相关资源
file = open('c.txt', 'a') lst = ['java', 'go', 'python'] file.writelines(lst) file.close() #javagopython file = open('a.txt', 'r') file.seek(2) print(file.read()) print(file.tell()) file.close()
with语句(上下文管理器)
·with语句可以自动管理上下文资源,不论什么原因跳出with都能确保文件正确的关闭,以此来大道释放资源的目的
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('a.txt', 'r') as file: print(file.read()) '''改进 with open('logo.png','rb') as src_file: with open('copy2logo.png','wb') as target_file: target_file.write(src_file.read()) '''
import os os.system('notepad.exe') os.system('calc.exe') #直接调用 os.startfile('C:\\Program Files (x86)\\Tencent\\TIM\\Bin\\tim.exe')
os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
os模块与os.path模块用于对目录或文件进行操作
import os os.system('notepad.exe') os.system('calc.exe') #直接调用 os.startfile('C:\\Program Files (x86)\\Tencent\\TIM\\Bin\\tim.exe') import os print(os.getcwd())
**getcwd()**返回当前的工作目录
**listdir(path)**返回指定路径下的文件和目录信息
**mkdir(path[,mode])**创建目录
**makedirs(path1/path2)**创建多级目录
**rmdir(path)**删除目录
**removedirs(path1/path2)**删除多级目录
**chdir(path)**将path设置为当前工作目录
import os print(os.getcwd()) lst = os.listdir('../chap15') print(lst) os.mkdir('newdir2') #os.makedirs('A/B/C/') os.rmdir('newdir2') os.removedirs('A/B/C')
path模块操作目录相关函数
**abspath(path)**用于获取文件或目录的绝对路径
**exists(path)**用于判断文件或目录是否存在,如果存在返回True,否则返回False
**join(path,name)**将目录与目录或者文件名拼接起来
**splitext()**将目录与目录或者文件名拼接起来
**basename(path)**从一个目录中提取文件名
**dirname(path)**从一个路径中提取文件路径,不包括文件名
**isdir(path)**用于判断是否为路径
import os.path print(os.path.abspath('demo10.py')) print(os.path.exists('demo13py'), os.path.exists('demo10.py'))
剩下的听不懂
"""一、使用print方式进行输出(输出的目的地是文件)""" fp = open('C:/李林峰/text.txt', 'w')#open是打开创建文件的意思 print('奋斗成就更好的未来',file=fp) fp.close() '''二、使用文件的读写操作''' with open('C:/李林峰/text2.txt', 'w') as file: file.write('奋斗成就更好的未来')
'''1 变量的赋值''' name1='林黛玉' name2='薛宝钗' name3='贾元春' name4='贾探春' name5='史湘云' print('1\t'+name1) print('2\t'+name2) print('3\t'+name3) print('4\t'+name4) print('5\t'+name5) '''2种方式 列表''' lst_name=['林黛玉','薛宝钗','贾元春','贾探春','史湘云'] lst_sig=['1','2','3','4','5'] for i in range(5): print(lst_sig[i],'\t',lst_name[i]) '''3种方式 字典''' d={'1':'林黛玉','2':'薛宝钗','3':'贾元春','4':'贾探春','5':'史湘云'} 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')
height=170 weight=50.5 bmi=weight/(height+weight) print('您的身高是:'+str(height)) print('您的体重是:'+str(weight)) print('您的BMI的指数是:'+'{:0.2f}'.format(bmi))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1zpsXrZ-1643201540468)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220125104315944.png)]
二进制 ------>binary system
八进制 ------>octonary number system 英 /ˈɒktənəri/
十进制 ------>decimalism 英 /ˈdesɪməlɪzəm/
def fun(): num=int(input('请输入一个十进制的整数'))#将str转换成int类型 print(num,'的二进制数是:',bin(num))#第一种写法,使用了个数可变的位置参数 print(str(num)+'的二进制数为:'+bin(num))#第二种写法,使用“+”作为连接符(+的左右均为str类型) print('%s的二进制位:%s'%(num,bin(num)))#第三种写法,格式化字符串 print('{0}的二进制数为:{1}'.format(num,bin(num)))#第三种写法,格式化字符串 print(f'{num}的二进制数为:'{bin(num)})#第三种方式,格式化字符串 print(f'{num}的八进制数为:'{oct(num)}) print(f'{num}的十六进制数为:'{hex(num)}) if __name__ == '__main__': while True: try: fun() break#如果程序正常输出结束以后,我们再break except: print('只能输入整数!程序出错,请重新输入')
print('用户手机账户原有话费金额为:\033[0:35m8元\033[m') money=int(input('请输入用户充值金额:')) money+=8 print('当前的金额为:\033[0:35m',money,'元\033[m') ''' 用户手机账户原有话费金额为:8元 请输入用户充值金额:100 当前的金额为: 108 元 '''
num=int(input('请输入您当天行走的步数:')) calorie=num*28 print(f'今天共消耗了卡路里{calorie},即{calorie/1000}千卡') ''' 请输入您当天行走的步数:10000 今天共消耗了卡路里280000,即280.0千卡 '''
father_height=float(input('请输入父亲的身高:')) mother_height=float(input('请输入母亲的身高:')) son_height=(father_height+mother_height)*0.54 print('预测子女的身高为:{}cm'.format(son_height)) ''' 请输入父亲的身高:170 请输入母亲的身高:168 预测子女的身高为:182.52cm'''
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NaiTxVnV-1643201540468)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220125114055615.png)]
pwd=input('支付宝支付密码:') if pwd.isdigit(): print('支付数据合法') else: print('支付数字不合法,支付密码只能是数据') print('-------------------------------------------') print('支付数据合法' if pwd.isdigit() else '支付数字不合法,支付密码只能是数据')
qq=input('请输入qq号:') pwd=input('请输入密码:') if qq=='1059630434' 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''' } star=input('请输入您的星座查看近来运势:') print(d.get(star)) '''请输入您的星座查看近来运势:白羊座 1'''
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqgG9JCd-1643201540474)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220125121002601.png)]
x=97#代表的是a的ASCII值 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:#这个else的意思是当你的这三个循环都结束后就会执行这个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)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oFUhxFn2-1643201540474)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220126195422389.png)]
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 i in range(len(cart)-1,-1,-1): print(cart[i])
key=input('请输入您的星座名称') flag=True for item in d: if key==item: flag=True print(key,'的性格特点为:',d.get(key)) break else: flag=False if not flag: print('对不起,您输入的星座有误')
dict_ticket={'G120':['天津-上海','18:05'], 'G153':['北京-天津','18:15']} print('车次\t\t出发站-到达站\t\t') for item in dict_ticket: print(item,end=' ') for i in dict_ticket[item]: print(i,end=' ') 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}尽快取走纸质车票.')
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]}]好了,请您慢用')
https://mp.weixin.qq.com/s?src=11×tamp=1643077913&ver=3579&signature=Xs5i8fOba3Gvnk6VoReCQEZbFoRsxdHCv78bIkAR83AXabyIBVQXrSpTxpM7XqJrsF1K9JCf8l4erybJS7kfqksl2v6e0J2*SbQzGq-ZSelf-ULL9K3d7u970gXII3nP&new=1
# 最最基本 ## print函数 ### 将数据输出文件中 ```python #将数据输出文件中,注意点,1.所指定的盘符存在。2.使用file=fp fp = open('C:/李林峰/text.txt', 'a+')#如果文件不存在就创建,存在就在文件内容后面继续追加 print('helloworld', file=fp) fp.close() #不进行换行输出(输出内容在一行当中) print('hello','world','Python')
open的方式是输出到文件当中
print的方式是输出到显示器当中+
print('hello','world','Python')
print('hello\nworld') # 换行 n->newline print('hello\tworld') # 空了三隔 print('helloooo\tworld') # 空了四隔->tab键 print('hello\rworld') # world将hello进行了覆盖->return光标移动到本行的开头 print('hello\bworld') # \是退格back print('http:\\\\www.bandu.com') print('老师说:\'大家好\'') #原字符,不希望字符串中的转义字符起作用,就是用元字串之前加上r或R print(r'hello\nworld') #注意事项,最后一个字符不能是反斜杠,可以是两个反斜杠 print(r'hello\nworld\\')
name = '玛利亚' print(name) print('标识', id(name)) print('类型', type(name)) print('值', name)
·常见的数据类型
·整数类型->int->98
·浮点数类型->float->3.14159
·布尔类型->bool->True,False
·字符串类型->str->人生苦短
#整数可以表示二进制,十进制,八进制,十六进制 print('十进制',118)#默认十进制 print('二进制',0b1010111)#二进制以0b开头 print('八进制',0o176)#八进制以0o开头 print('十六进制',0x1EAF)
n1 = 1.1 n2 = 2.2 print(n1+n2)#3.3000000000000003 from decimal import Decimal print(Decimal('1.1')+Decimal('2.2'))#3.3
f1 = True f2 = False print(f1,type(f1))#True <class 'bool'> print(f2,type(f2))#False <class 'bool'> #布尔值可以转成整数计算 print(f1+1) #2 1+1的结果为2,True表示1 print(f2+1) #1 0+1的结果为2,False表示0
str1 = '人生苦短,我用python' str2 = "人生苦短,我用python" str3 = """人生苦短, 我用python""" str4 = ‘‘‘人生苦短, 我用python’’’ #单引号和双引号定义的字符串必须在一行 print(str1,type(str1))#人生苦短,我用python<class 'str'> print(str2,type(str2)) #三引号定义的字符串可以分布在连续的多行 print(str3,type(str3)) print(str4,type(str4))
name = '张三' age = 20 print(type(name),type(age))#说明name与age的数据类型不相同 print('我叫'+name+'今年'+age+'岁')#当将str类型与int类型进行链接时,报错,解决方案,类型转换 print('我叫'+name+'今年'+str(age)+'岁')
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))) #print(int(s3), type(int(s3))) #将str转成int类型,字符串必须为数字串(整数),非数字串是不允许转换的
#字符串中的数据如果是非数字串,则不允许转换
#单行注释 """我是多行注释 """
present = input('大圣想要什么礼物呢')#输入之前程序给你的一个提示语 需要输入回答
a = input('请输入一个加数:')#10 b = input('请输入另一个加数:')#10 print(type(a), type(b))#<class 'str'><class 'str'> print(a + b)#1020 a = input('请输入一个加数:')#10 b = input('请输入另一个加数:')#10 print(type(a), type(b))#<class 'str'><class 'str'> print(int(a) + int(b))#30 或者a = int(input('请输入一个加数:'))
print(1+1)# 加法运算 print(1-1) # 减法运算 print(2*4)# 8 乘法运算 print(1/2)# 除法运算 print(11/2)#5.5 除法运算 print(11//2)# 5 整除运算 print(11%2)# 1 取余运算 print(2**2)# 4 表示的是2的2次方 print(2**3)# 8 表示的是2的3次方
含减号的运算
print(9 // 4) # 2 print(-9 // -4) # 2 print(9 // -4) # -3 print(-9 // 4) # -3 一正一负的整数公式,向下取整 print(9 % -4) # -3 余数=被除数-除数*商 9-(-4)*(-3) print(-9 % 4) # 3
#解包赋值 a,b,c=20,30,40 print(a,b,c) print('-----------交换两个变量的值----------') a,b=10,20 print('交换之前:',a,b)#交换之前:10 20 #交换 a,b=b,a print('交换之后:',a,b)#交换之后:20 10
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)#False print('a!=b吗',a!=b)#True a=10 b=10 print(a==b)#True 说明,a与b的value相等 print(a is b)#True 说明, a与b的id标识相等 #以下代码没学过,后面会给大家讲解 llist1=[11,22,33,44] llist2=[11,22,33,44] print(lstr1==lstr2)#value -->True print(lstr1 is lstr2)#id -->False print(id(lstr1))#267587787 print(id(lstr2))#787897988 print(lstr1 is not lstr2) #True
#and并且 #or或者 #not 对bool类型操作数取反 f=True f2=False print(not f)#False print(not f2)#True #in与not in s = 'helloworld' print('w' in s)#True print('k' in s)#False print('w' not in s)#False print('k' not in s)#True
print(4 & 8) # 0 按位于&,同为1时结果为1 print(4 | 8) # 12 按位或|,同为0时结果为0 print(4 << 1) # 8 向左移动1位(移动一个位置)相当于乘以2 print(4 << 2) # 16 向左移动2位(移动2个位置) print(4 >> 1) # 2 向右移动1位,相当于除以2 print(4 >> 2) # 1 向右移动2位,相当于除以4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Mx3a8gp-1643201542068)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220119175339789.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rY2tN5rZ-1643201542069)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220119180200590.png)]
print(bool(False))#False print(bool(0))#False print(bool(0.0))#False print(bool(None))#False print(bool(''))#False print(bool(""))#False print(bool([]))#False空列表 print(bool(list()))#False空列表 print(bool(()))#False空元组 print(bool(tuple))#False空元组 print(bool({}))#空字典 print(bool(dict()))#False空字典 print(bool(set()))#False空集合 其他的bool值为True print(bool(18))#True print(bool('helloworld'))#True
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,'是奇数')
score = int(input('请输入一个成绩:')) # 判断 if 90 <= score <= 100: print('A级') elif 80 <= score < 90: print('B级') elif 70 <= score < 80: print('C级') elif 60 <= score < 70: print('D级') elif 0 <= score < 59: print('E级') else: print('对不起,您输入的成绩有误,不再成绩的有效范围内')
answer=input('您是会员吗?y/n') money=float(input('请输入您的购物金额:')) #外层判断是否是会员 if answer=='y': if money >= 200: print('打八折,付款金额为:',money*0.8) elif money>=100: print('打九折,付款金额为:',money*0.9) else: print('不打折,付款金额为:',money) else: if money>=200: print('打9.5折,付款金额为:',money*0.95 else: print('不打折,付款金额为:',money)
''''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('使用条件表达式进行比较') #条件判断的结果为true,就执行左边的内容,为false,执行右侧的代码 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()的三种创建方式 ''''第一种方式,只有一个参数(小括号中只给一个数)'''' r = range(10) #[0,1,2,3,4,5,6,7,8,9],默认从0开始,默认相差1位步长 print(r)#range(0,10) print(list(r))#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #用于查看range对象中的整数序列-->list是列表的意思 ''''第二中创建方式,给了两个数(小括号中给了连个数)'''' r=range(1,10)#指定了起始值,从1开始,到10结束(不包含10),默认步长为1 print(list(r))#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ''''第三种创建方式,给了三个参数(小括号中给了三个数)'''' r=range(1,10,2) print(list(r))#[1,3,5,7,9] '''判断指定的整数在序列中是否存在in,not in''' print(10 in r)#False,10不在当前的r这个整数系列中 print(9 in r)#True,9在当前的r这个序列中 print(10 not in r)#True
sum=0 a=0 while a<5: sum+=a a++ print('和为',sum)
sum=0 a=1 while a<=100: if a%2==0: sum+=a a+=1 print('1-100之间的偶数和',sum)#因为print和while是对齐的,所以print没有进入while循环
for item in 'Python':#第一次取出来的是P,将P赋值给item,将item的值输出 print(item) #range() 产生一个整数序列---》也是一个可迭代对象 for i in range(10): print(i)#1 2 3 4 5 6 7 8 9 #如果在循环体中不需要使用自定义白能量,可将自定义变量写为“_” for _ in range(5): print('人生苦短,我用Python') print('使用for循环,计算1到100的偶数和') sum=0#用于存储偶数和 for item in range(1,101): if item % 2==0: sum+=item print('1到100之间的偶数和为:',sum)
for item in range(100, 1000): ge = item % 10 shi = item // 10 % 10 bai = item // 100 if ge ** 3 + shi ** 3 + bai ** 3 == item: print(item)
for item in range(3): pwd = input('请输入密码:') if pwd == '8888': print('密码正确') break else: print('密码不正确')
for item in range(1, 51): if item % 5 != 0: continue print(item)
没有碰到break时执行else
#for和else搭配使用 for item in range(3): pwd = input('请输入密码:') if pwd == '8888': print('密码正确') break else: print('密码不正确') else: print('对不起,三次密码均输入错误') #while和else搭配使用 a = 0 while a < 3: pwd = input('请输入密码') 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(1, 10): for j in range(1, i+1): print(str(i) + '*' + str(j) + '=' + str(i * j), end='\t') #print(i,'*',j,'=',i*j,end='\t') print()
二重循环中的break和continue用于控制本层循环
列表让我想到了Excel表,他的括号是直上直下的,又联系到java里的列表就有list([ ])
·列表对应的英语单词是list—>list([])
"""创建列表的第一种方式,使用[]""" lst = ['hello', 'world', 98] '''创建列表的第二种方式,使用内置函数list()''' lst2 = list(['hello', 'world', 98]) print()
1.列表元素按顺序有序排序
2.索引映射唯一一个数据
3.列表可以存储重复数据
4.任意数据类型混存
5.根据需要动态分配和回收内存
lst = ['hello', 'world', 98, 'hello'] print(lst.index('hello')) # 如果列表中有相同元素只返回相同元素的第一个元素的索引 # print(lst.index('Python')) # 'Python' is not in list # print(lst.index('hello', 1, 3))#'hello' is not in list 在1~2的位置上查找 print(lst.index('hello', 1, 4))
正向索引从0到N-1,举例list[0]
逆向索引你从-N到-1,举例lst[-N]
指定索引不存,抛出IndexError
lst = ['hello', 'world', 98, 'hello', 'world', 234] # 获取索引为2的元素 print(lst[2]) # 98 # 获取索引为-3的元素 print(lst[-3]) # hello # 获取索引为10的元素 print(lst[10]) # IndexError: list index out of range
列表元素的查询操作
# 判断指定元素在列表中是否存在 print('p' in 'python') print('k' not in 'python') lst = [10, 20, 'python', 'hello'] print(10 in lst) # True print(100 in lst) # False print(10 not in list) # True # 遍历 for item in lst: print(item)
列表元素的增加操作
# append() 向列表的末尾添加一个元素 lst = [10, 20, 30] print('添加元素之前', lst, id(lst)) # 添加元素之前 [10, 20, 30] 2100054273728 lst.append(100) print('添加元素之后', lst, id(lst)) # 添加元素之后 [10, 20, 30, 100] 2100054273728 print(list) # <class 'list'> # extend() 在列表的末尾只收添加一个元素 lst2 = ['hello', 'world'] # st.append(lst2)#将lst2作为一个元素添加到列表的末尾 # print(lst) # [10, 20, 30, 100, ['hello', 'world']] # 向列表的末尾一次性添加多个元素 lst.extend(lst2) print(lst) # 在指定位置上添加一个元素 lst.insert(1, 90) lst3 = [True, False, 'hello'] # 在任意的位置上添加N多个元素 lst[1:] = lst3; print(lst)
lst = [10, 20, 30, 40, 50, 60, 30] lst.remove(30) # 从列表中溢出一个元素,如果有重复元素只移第一个元素 print(lst) lst.remove(100) # [10, 20, 40, 50, 60, 30] lst = [10, 20, 30, 40, 50, 60, 30] # pop()根据索引移除元素 lst.pop(1) print(lst) lst.pop(6) print(lst) # pop index out of range lst = [10, 20, 30, 40, 50, 60, 30] # pop()根据索引移除元素 lst.pop(1) print(lst) lst.pop(5) print(lst) # pop index out of range lst.pop() # 如果不指定参数(索引),将删除列表中的最后一个元素 print(lst) lst = [10, 20, 30, 40, 50, 60, 30] print("------切片操作-删除至少一个元素,将产生一个新的列表对象") new_list = lst[1:3] print('原列表', lst)#原列表 [10, 20, 30, 40, 50, 60, 30] print('切片后的列表', new_list)#切片后的列表 [20, 30] '''不产生新的列表对象,二回删除原列表中的内容''' lst = [10, 20, 30, 40, 50, 60, 30] lst[1:3] = [] print(lst) # [10, 40, 50, 60, 30] """清楚列表中的所有元素""" lst = [10, 20, 30, 40, 50, 60, 30] lst.clear() print(lst) """del语句将列表对象删除""" lst = [10, 20, 30, 40, 50, 60, 30] del lst print(lst)#name 'lst' is not defined
lst = [10, 20, 30, 40] # 一次修改一个值 lst[2] = 100 print(lst) # [10, 20, 100, 40] lst[1:3] = [300, 400, 500, 600] # [10, 300, 400, 500, 600, 40] print(lst)
列表元素的排序操作
·常见的两种方式
·调用sort()方法,列有中的所有元素默认按照从小到大的顺序进行排序,可以指定reverse=True,进行降序排序
·调用内置函数sorted(),可以指定reverse=True,进行降序排序,原列表不发生改变
lst = [20, 40, 10, 98, 54] print('排序前的列表', lst, id(lst)) # 排序前的列表 [20, 40, 10, 98, 54] 3245910544000 # 开始排序,调用列表对象的sort方法,升序排序 lst.sort() print('排序后的列表', lst, id(lst)) # 排序后的列表 [10, 20, 40, 54, 98] 1433208368896 # 通过指定关键字参数,将列表中的元素进行降序排序 lst.sort(reverse=True) # reverse=True 表示降序排序 reverse=False就是降序排序 print(lst)#[98, 54, 40, 20, 10] lst.sort(reverse=False) print(lst)#[10, 20, 40, 54, 98] # 使用内置函数sorted()对列表进行排序,将产生一个新的列表对象 lst = [20, 40, 10, 98, 54] print('原列表', lst) # 开始排序 new_list = sorted(lst) print(lst) print(new_list) # 指定关键字参数,实现列表元素的降序排序 desc_list = sorted(lst, reverse=True) print(desc_list)
简称生成列表的公式
·语法格式:
[i*i for i in range(1,10)]
lst = [i for i in range(1, 10)] print(lst) # [1, 2, 3, 4, 5, 6, 7, 8, 9] lst = [i * i for i in range(1, 10)] print(lst) # [1, 4, 9, 16, 25, 36, 49, 64, 81] '''列表元素的值为2,4,6,8,10''' lst2=[i*2 for i in range(1,6)] print(lst2)#[2, 4, 6, 8, 10]
字典嘛,让我想到了老师的棒棒,---->{},
{‘张三’:100}:冒号显得很随意
字典dictionary,dict(name=‘jack’) ,"="像一个字典横着放在那
·字典对应的英语单词是dict---->dict()
·Python内置的数据结构之一,与列表一样时一个可变序列·以键值对的方式存储数据,字典是一个无序的序列
·最常用的方式:使用花括号
scores={‘张三’:100,‘李四’:98}
·使用内置函数dict()
dict(name=‘jack’,age=20)
"""使用{}创建字典""" scores = {'张三': 100} print(scores) # {'张三': 100} print(type(scores)) # <class 'dict'> '''第二种方式dict()''' student = dict(name='jack', age=20) print(student) # {'name': 'jack', 'age': 20} '''空字典''' d = {} print(d) # {}
scores = {'张三': 100, '李四': 98, '王五': 45} '''第一种方式,使用[]''' print(scores['张三']) # 100 # print(scores['陈六'])#KeyError: '陈六' '''第二种方式,使用get()方法''' print(scores.get('张三')) # 100 print(scores.get('陈六')) # None print(scores.get('马奇', 99)) # 99 99是在查找’马奇‘所对的value不存在时,提供第一个默认值
"""key的判断""" scores = {'张三': 100, '李四': 98, '王五': 45} print('张三' in scores) # True print('张三' not in scores) # False del scores['张三'] # 删除指定的key-value对 scores.clear() # 清空字典的元素 print(scores) # False #新增元素 scores = {'张三': 100, '李四': 98, '王五': 45} scores['陈六'] = 98 print(scores)#{'张三': 100, '李四': 98, '王五': 45, '陈六': 98} #修改元素 scores = {'张三': 100, '李四': 98, '王五': 45, '陈六': 98} scores['陈六'] = 100 print(scores)
1、keys()------获取字典中所有key
2、values()------获取字典中所有value
3、items()------获取字典中所有key,values
scores = {'张三': 100, '李四': 98, '王五': 45} # 获取所有的key keys = scores.keys() print(keys) # dict_keys(['张三', '李四', '王五']) print(type(keys)) # <class 'dict_keys'> print(list(keys)) # ['张三', '李四', '王五'] # 获取所有的value values = scores.values() print(values) # dict_values([100, 98, 45]) print(type(values)) # <class 'dict_values'> print(list(values)) # [100, 98, 45] # 获取所有的key-value对 items = scores.items() print(items) # dict_items([('张三', 100), ('李四', 98), ('王五', 45)]) print(list(items)) # [('张三', 100), ('李四', 98), ('王五', 45)] # 转换之后的列表元素是由元组组成的
scores = {'张三': 100, '李四': 98, '王五': 45} # 字典元素的遍历 for item in scores: print(item, scores[item], scores.get(item)) # 张三 100 100 # 李四 98 98 # 王五 45 45
1、字典中的所有元素都是一个key-value对,key不允许重复,value可以重复
2、字典中的元素是无序的
3、字典中的key必须是不可变对象
4、字典也可以根据需要动态地伸缩
5、字典会浪费较大的内存,是一种使用空间换时间的数据机构
d = {'name': '张三', 'name': '李四'} # key不允许重复 print(d) d = {'name': '张三', 'nickname': '张三'} # values可以重复的 print(d) lst = [10, 20, 30] lst.insert(1, 100) print(lst) # [10, 100, 20, 30 d = {lst: 100} # unhashable type: 'list' print(d) '''不懂,可以再回来看一下'''
items = ['Fruits', 'Books', 'Others'] prices = [96, 78, 85] d = {item.upper(): price for item, price in zip(items, prices)} print(d)#{'FRUITS': 96, 'BOOKS': 78, 'OTHERS': 85}
字典的创建
1、使用{}花括号
2、内置函数dict()
3、字典生成式
常用操作
1、获取value
·字典名[key]
·字典名.get(key)
2、删除key-value对
del字典名[key]
3、修改/新增
字典名[key]=value
4、in/not
什么是元组
·元组很圆 所以用()包住元素,又因为它很圆滑,可以把括号去掉
·元组对应的英语单词是tuple—>tuple(())
·元组
·Python内置的数据结构之一,是一个不可变的序列
·不可变序列与可变序列
·不可变序列与可变序列
·不变序列:字符串、元组
·不可变序列:没有增、删、改的操作
·可变序列:列表、字典
·可变序列:可以对序列执行增、删、改操作,对象地址不发生更改
"""可变序列 列表,字典""" lst = [10, 20, 45] print(id(lst)) # 2190449651584 lst.append(300) print(id(lst)) # 2190449651584 '''不可变序列,字符串,元组''' s = 'hello' print(id(s))#3209077469104 s = s + 'world' print(id(s))#3209077476656 print(s)#helloworld
直接小括号
t = (‘Python’,‘hello’,90)
使用内置函数tuple()
t = tuple((‘Python’,‘hello’,90))
只包含一个元组的元素需要使用逗号和小括号
t=(10,)
'''第一种创建方式,使用()''' t=('Python','world',98) print(t) # ('Python', 'world', 98) print(type(t)) # <class 'tuple'> '''第二种创建方式,使用内置函数tuple()''' t2 = 'Python', 'world', 98 # 省略了小括号 print(t2) # ('Python', 'world', 98) print(type(t2)) # <class 'tuple'> t3 = ('Python',) # 如果元组中只有一个元素,逗号不能省略 print(t3) # ('Python',) print(type(t3)) # <class 'tuple'> '''第二种方式,使用内置函数tuple()''' t1 = tuple(('Python', 'world', 98)) print(t1) # ('Python', 'world', 98) print(type(t1)) # <class 'tuple'> '''空元组的创建方式''' '''空列表的创建方式''' lst = [] lst1 = list() d = {} d2 = dict() # 空元组 t4 = () t5 = tuple() print('空列表', lst, lst1) # 空列表 [] [] print('空字典', d, d2) # 空字典 {} {} print('空元组', t4, t5) # 空元组 () ()
·在多任务环境下,同时操作对象时不需要加锁
·因此,在程序中尽量使用不可变序列
注意事项:
元组中存储的是对象的引用
a)如果元组中对象本身不可对象,则不能再引用其它对象
b)如果元组中的对象是可变对象,则可变对象的引用不允许改变,但数据可以改变
t = [10, [20, 30], 9] print(t) # (10, [20, 30], 9) print(type(t)) # <class 'tuple'> print(type(t[0]), type(t[0]), id(t[0])) # <class 'int'> <class 'int'> 2155089521232 print(type(t[1]), type(t[1]), id(t[1])) # <class 'list'> <class 'list'> 2155091275648 print(type(t[2]), type(t[2]), id(t[2])) # <class 'int'> <class 'int'> 2155089521200 '''尝试将t[1]修改为100''' print(id(100)) # t[1] = 100 #元组是不允许修改元素的 '''由于[20,30]列表,而列表是可变序列,所以可以向列中添加元素,而列表中的内存地址不变''' t[1].append(100) # 向列表中添加元素 print(t,id(t[1])) # [10, [20, 30, 100], 9]
t = ('Python', 'world', 98) '''第一种获取元组的方式,使用索引''' print(t[0]) # Python print(t[1]) # world print(t[2]) # 98 #print(t[3]) # tuple index out of range '''遍历元组''' for item in t: print(item) ''' Python world 98 '''
集合对应的英语单词是set()
·Python语言提供的内置数据结构
·与列表、字典一样都属于可变类型的序列
·集合是没有value的字典
"""第一种创建方式使用{}""" s = {2, 3, 4, 5, 5, 6, 7, 7} # 集合中的元素不能重复 print(s) # {2, 3, 4, 5, 6, 7} '''第二种创建方式使用set()''' s1 = set(range(6)) print(s1, type(s1)) # {0, 1, 2, 3, 4, 5} <class 'set'> s2 = set([1, 2, 3, 4, 5, 5, 6, 6]) print(s2, type(s2)) # {1, 2, 3, 4, 5, 6} <class 'set'> s3 = set((1, 2, 4, 4, 5, 65)) print(s3, type(s3)) # {65, 1, 2, 4, 5} <class 'set'> s4 = set('python') print(s4, type(s4)) # {'t', 'o', 'n', 'h', 'y', 'p'} <class 'set'> s5 = set({12, 4, 34, 55, 66, 44}) print(s5, type(s5)) # {34, 66, 4, 55, 12, 44} <class 'set'> # 定义一个空集合 s6 = {} # dict字典类型 print(type(s6)) # <class 'dict'> s7 = set() print(type(s7)) # <class 'set'>
·集合元素的判断操作
·in或not in
·集合元素的新增操作
·调用add()方法,一次添中一个元素
·调用update()方法,至少添中一个元素
·集合元素的删除操作
·调用remove()方法,一次删除一个指定元素,如果指定的元素不存在抛出KeyErrot
·调用discard()方法,一次删除一个指定元素,如果指定的元素不存在不抛异常
·调用pop()方法,一次只删除一个任意元素
·调用clear()方法,清空集合
s = {10, 20, 30, 405, 60} '''集合元素的判断操作''' print(10 in s) # True print(100 in s) # False print(10 not in s) # False print(100 not in s) # True '''集合元素的新增操作''' s.add(80) # add一次添加一个元素 print(s) # {80, 20, 405, 10, 60, 30} s.update({200, 400, 300}) # 一次至少添加一个元素 print(s) # {200, 10, 300, 80, 400, 20, 405, 60, 30} s.update([100, 99, 8]) s.update((78, 64, 56)) print(s) # {64, 99, 100, 200, 8, 10, 300, 78, 80, 400, 20, 405, 56, 60, 30} '''集合元素的删除操作''' s.remove(100) print(s) # {64, 99, 200, 8, 10, 300, 78, 80, 400, 20, 405, 56, 60, 30} # s.remove(500)#KeyError: 500 s.discard(500) # {64, 99, 200, 8, 10, 300, 78, 80, 400, 20, 405, 56, 60, 30} print(s) s.pop() s.pop() # s.pop(400)#set.pop() takes no arguments (1 given) pop方法不能添加参数 print(s) # {200, 8, 10, 300, 78, 80, 400, 20, 405, 56, 60, 30} s.clear() print(s) # set()
两个集合是否相等
·可以使用运算符==或!=进行判断
一个集合是否是另一个集合的子集
·可以调用方法issubset进行判断
·B是A的子集
一个集合是否是另一个集合的超集
·可以调用方法issuperset进行判断
·A是B的超集
两个集合是否没有交集
·可以调用方法isdisjojoint进行判断
"""两个集合是否相等(元素相同,就相等)""" 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)) # True print(s3.issubset(s1)) # False '''一个集合是否是另一个集合的超集''' print(s1.issuperset(s2)) # True print(s1.issuperset(s3)) # False '''两个集合是否含有交集''' print(s2.isdisjoint(s3)) # False #有交集为False s4 = {100, 200, 300} print(s2.isdisjoint(s4)) # True 没有交集为True
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8xk58OU-1643201542071)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220120181531029.png)]
# (1)交集 s1 = {10, 20, 30, 40} s2 = {20, 30, 40, 50, 60} print(s1.intersection(s2)) # {40, 20, 30} print(s1 & s2) # {40, 20, 30}#intersection与&等价,交集操作 # (2)并集操作 print(s1.union(s2)) print(s1 | s2) # union与|等价,并集操作 print(s1) # {40, 10, 20, 30} print(s2) # {50, 20, 40, 60, 30} # (3)差集操作 print(s1.difference(s2)) # {10} print(s1 - s2) # {10} print(s1) print(s2) # (4)对称差集 print(s1.symmetric_difference(s2))#{50, 10, 60} print(s1 ^ s2)#{50, 10, 60}
·用于生成集合的公式
{i*i for i in range(1,10)}
·将{}修改为[]j就是列表生成式
·没有元组生成式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2tWoObUM-1643201542071)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220120221831248.png)]
# 列表生成式 lst = [i * i for i in range(10)] print(lst) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 集合生成式 s = {i * i for i in range(10)} print(s) # {0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
列表
1、lst = [‘hello’, ‘world’, 98]
2、lst2 = list([‘hello’, ‘world’, 98])
字典
1、dit = {‘张三’: 100}
2、dit1 = dict(name=‘jack’, age=20)
元组
1、tup=(‘Python’,‘world’,98)
tup2 = (‘Python’,)
tup3 = ‘Python’, ‘world’, 98
2、tup4 = tuple((‘Python’, ‘world’, 98))
集合
1、s = {2, 3, 4, 5, 5, 6, 7, 7}
2、 s1 = set(range(6))
s2 = set([1, 2, 3, 4, 5, 5, 6, 6])
s3 = set((1, 2, 4, 4, 5, 65))
s4 = set({12, 4, 34, 55, 66, 44})
s5 = set(‘python’)# {‘t’, ‘o’, ‘n’, ‘h’, ‘y’, ‘p’}
获取指定元素的索引
lst = [‘hello’, ‘world’, 98, ‘hello’]
1、print(lst.index(‘hello’))
2、print(lst.index(‘hello’, 1, 4))
获取列表中的单个元素
lst = [‘hello’, ‘world’, 98, ‘hello’, ‘world’, 234]
1、print(lst[2]) # 98
print(lst[-3]) # hello
print(lst[10]) # IndexError: list index out of range
scores = {‘张三’: 100, ‘李四’: 98, ‘王五’: 45}
‘’‘第一种方式,使用[]’’’
print(scores[‘张三’]) # 100
print(scores[‘陈六’])#KeyError:‘陈六’
‘’‘第二种方式,使用get()方法’’’
print(scores.get(‘张三’)) # 100
print(scores.get(‘陈六’)) # None
print(scores.get(‘马奇’, 99)) # 99 99是在查找’马奇‘所对的value不存在时,提供第一个默认值
·在Python中字符串是基本数据类型,是一个不可变的字符序列
注:第一个不可变的序列是元组,第二个不可变的序列是字符串
·仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
·字符串的长度为0或1时
·符合标识符的字符串
s1='' s2='' print(s1 is s2)#True s1='%' s2='%' print(s1 is s2)#True s1='abc%' s2='abc%' print(s1==s2)#True 内容相同 print(s1 is s2)#False 地址不相同
·字符串只在编译时进行驻留,而非运行时
a='abc' b='ab'+'c' c=''.join(['ab',c])#join的操作是在程序运行的时候,程序在运行的时候当然会开辟一个新的空间 print(a is b)#True print(a is c)#False print(c)#abc
·[-5,256]之间的整数数字
a=-5 b=-5 print(a is b)#True a=-6 b=-6 print(a is b)#False
import sys a='abc%' b='abc%' print(a is b)#False a=sys.intern(b) print(a is b)#True
就是之前为值false的结果在PyCharm编译器中是驻留的,是True的
·当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,替身效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的。
·在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比"+"效率高
·index() 查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出ValueError
·rindex()查找子串substr最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError
·find()查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1
·rfind()查找子串substr最后一次出现的位置,如果查找的子串不存在时,则返回-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3K7jdltf-1643201542072)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220121115056706.png)]
# 字符串的查询操作 s = 'hello,hello' print(s.index('lo')) # 3 print(s.find('lo')) # 3 print(s.rindex('lo')) # 9 print(s.rfind('lo')) # 9 # print(s.index('k'))# ValueError: substring not found print(s.find('k')) # -1 # print(s.rindex('k'))#ValueError: substring not found print(s.rfind('k')) # -1
把字符串中所有字符都转成大写字母
把字符串中所有字符都转成小写字母
把字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母
把第一个字符转换成大写,把其余字符转换成小写
# 字符串中的大小写转换的方法 s = 'hello,python' a = s.upper() # 转成大写之后,会产生一个新的字符串对象 print(s) # HELLO,PYTHON print(a, id(a)) # HELLO,PYTHON 2190073744368 print(s, id(s)) # HELLO,PYTHON 1561669349040 print(s.lower()) # hello,python print(s.lower(), id(s.lower())) # hello,python 2207706857648 print(s, id(s)) # hello,python 2207706853296 s2 = 'hello,Python' print(s2.swapcase()) # HELLO,pPYTHON print(s2.title()) # Hello,Python
居中对齐,第一个参数指定宽度,第二个仓鼠指定填充符,第二个参数是可选的,默认是空格,如果设置款难度小于实际宽度则返回字符串
左对齐,第1个参数指定宽度,第2个参数指定填充符,第二个参数是可选的,默认是空格如果设置宽度小于实际宽度则返回原字符串
右对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格如果设置宽度小于实际宽度则返回原字符串、
右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的款难度小于等于字符串的长度,返回字符串本身
s = 'hello,Python' '''居中对齐''' print(s.center(20, '*')) # ****hello,Python**** '''左对齐''' print(s.ljust(20, '*')) # hello,Python******** print(s.ljust(10, )) # hello,Python print(s.ljust(20)) # hello,Python 默认填充格式空格 '''右对齐''' print(s.rjust(20, '*')) # ********hello,Python print(s.rjust(20)) # hello,Python print(s.rjust(10)) # hello,Python '''右对齐,使用0进行填充''' print(s.zfill(20))#00000000hello,Python print(s.zfill(10))#hello,Python print('-8910'.zfill(8))#-0008910
从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
s='hello world Python' lst=s.split() print(lst)#['hello', 'world', 'Python']
以通过参数sep指定劈分字符串是劈分符
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分之后,剩余的子串会单独做成一部分
s1='hello|world|Python' print(s1.split(sep='|'))#['hello', 'world', 'Python'] print(s1.split(sep='|',maxsplit=1))#['hello', 'world|Python']
从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
以通过参数sep指定劈分字符串是劈分符
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串单独会做成一部分
s1 = 'hello|world|Python' print(s1.split(sep='|')) # ['hello', 'world', 'Python'] print(s1.split(sep='|', maxsplit=1)) # ['hello', 'world|Python'] s = 'hello world Python' print(s.rsplit()) # ['hello', 'world', 'Python'] print(s.rsplit('|')) # ['hello world Python'] print(s1.rsplit(sep='|', maxsplit=1)) # ['hello|world', 'Python']
判断指定的字符串是不是合法的标识符
判断指定的字符串是否全部由空白字符组成(回车,换行,水平制表符)
判断指定的字符串是否全部由字母组成
判断指定字符串是否全部由字母组成
判断指定的字符串是否全部由数字组成
判断指定字符串是否全部由字母和数字组成
replace()
第1个参数指定被替换的子串,第2个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法时可以通过第3个参数指定最大替换次数
join()
将列表或元组中的字符串合并成一个字符串
s = 'hello,Python' print(s.replace('Python', 'Java')) # hello,Java s1 = 'hello,Python,Python,Python' print(s1.replace('Python', 'Java', 2)) # hello,Java,Java,Python lst = ['hello', 'java', 'Python'] print('|'.join(lst)) # hello|java|Python print(''.join(lst)) # hellojavaPython t = ('hello', 'Java', 'Python') print(''.join(t)) # helloJavaPython t = ('hello', 'Java', 'Python') print(''.join(t)) # helloJavaPython print('*'.join('Python')) # P*y*t*h*o*n
运算符:>,>=,<,<=,==,!=
**比较规则:**首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,一次比较下去,指导两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
**比较原理:**两个以上字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符
a = b = 'Python' c = 'Python' print(a == b) # True print(b == c) # True print(a is b) # True print(a is c) # True print(id(a)) # 2592489649456 print(id(b)) # 2592489649456 print(id(c)) # 2592489649456
print(s1) # hello print(s2) # Python print(newstr) # hello!Python print(s1) # hello print(s2) # Python print(newstr) # hello!Python print("-----------") print(id(s)) # 2474006161840 print(id(s1)) # 2474010624176 print(id(s2)) # 2474010824176 print(id(s3)) # 2474010624048 print(id(newstr)) # 2474010639536 print("--------------切片[start:end:step]-----------------") print(s[1:5:1]) # 从1开始截到5(不包含5),步长为1 ello print(s[::2]) # 默认从0开始,没有写结束,默认字符串的最后一个元素,步长为2,两个元素之间的索引间隔为2 hloPto print(s[::-1]) # 默认从字符串的最后一个元素开始,到字符串的第一个元素结束,因为步长为负数 nohtyP,olleh print(s[-6::1]) # 从索引为-6开始,到字符串的最后一个元素结束,步长为1 Python
# (1)%占位符 name = '张三' age = 20 print('我叫%s,今年%d岁' % (name, age)) # 我叫张三,今年20岁 # (2){} print("我叫{0},今年{1}岁".format(name, age)) # 我叫张三,今年20岁 # {3}f-string print(f'我叫{name},今年{age}岁') # 我叫张三,今年20岁 print('%10d' % 99)#10表示的是宽度 print('%.3f' % 3.1415926)#.3表示是小数点后三位 #同时表示宽度和精度 print('%10.3f' % 3.1415926)#一共总宽度为10,小数点后3位
print('%10d' % 99) # 99 10表示的是宽度 print('%.3f' % 3.1415926)#3.142 #同时表示宽度和精度 print('%10.3f' % 3.1415926)# 3.142 一共总宽度为10,小数点后3位 print('hellohello') # hellohello print('hellohello') print('{0:.3f}'.format(3.1415926))#.3表示的是一共是3位数 print('{0:.3f}'.format(3.1415926))#.3f表示是3位小数 print('{:10.3f}'.format(3.1415926))#同时设置宽度和精度
s = '天涯共此时' # 编码 print(s.encode(encoding='GBK')) # 在GBK这种编码格中 一个中文占两个字节 print(s.encode(encoding='UTF-8')) # 在UTF-8这种编码格式中,一个中文占三个字节 # 解码 # byte代表的就是一个二进制数据(字节类型的数据) byte = s.encode(encoding='GBK') # 编码 print(byte.decode(encoding='GBK')) # 解码 byte = s.encode(encoding='UTF-8') print(byte.decode(encoding='UTF-8'))
# 位置实参 # 根据形参对应的位置进行实参传递 def calc(a, b): c = a + b return c result = calc(10, 20) print(result) # 关键字实参 # 根据形参名称进行实参传递 res = calc(b=10, a=20) # 等号左侧的变量的名称成为关键字参数 print(res)
print(bool(0)) # False print(bool(8)) # 非0的布尔值为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()) '''False True ([29, 23, 53, 55], [10, 34, 44]) hello hello ('hello', 'world') '''
def fun(a, b=10): print(a, b) # 函数的调用 fun(100) # 100 10 fun(20, 30) # 20 30 print('hello',end='\t') print('world')#hello 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) print('hello', 'world', 'java') '''def fun2(*args,*a): pass 以上代码,程序会报错,个数可变的位置参数,只能是1个 def fun2(**args,**args): pass 以上代码,程序会报错,个数可变的位置参数,只能是1个 ''' def fun2(*args1, **args2): pass '''def fun2(**args,**args): pass 在一个函数的定义过程中,既有个数可变的关键字,也有个数可变的位置形参,要求,个数可变的位置形参,放在个数可变的关键字形参之前 '''
def fun(a, b, c): # 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) # 在函数调用时,将字典中的键值对都转换为关键字实参传入 ''' a= 10 b= 20 c= 30 a= 11 b= 22 c= 33 ---------------- a= 100 b= 200 c= 300 a= 111 b= 222 c= 333 ''' def fun(a, b=10): # b是在函数的定义处,所以b是形参,而且进行了赋值,所以b称为默认值形参 print('a=', a) print('b=', b) def fun2(*args): # 个数可变的位置形参 print(args) def fun3(**args2): # 个数可变的关键字形参 print(args2) fun2(10, 20, 30, 40) # (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采用的是关键字实参传递 '''需求, 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,就是全局变量,因为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) # 调用函数 fun2() '''杨老师 杨老师 20 20 杨老师 '''
如果在一个函数体内调用了该函数本身,这个函数就称为递归函数
递归调用与递归终止条件
每递归调用一次函数,都会在栈内存分配一个栈帧
每执行完一次函数,都会释放相应的空间
缺点:占用内存多,效率低下
优点:思路和代码简单
def fac(n): if n == 1: return 1 else: res = n * fac(n - 1) return res print(fac(6))#720
def fib(n): if n == 1: return 1 elif n == 2: return 1 else: return fib(n - 1) * fib(n - 2) # 斐波那契数列第六位上的数字 print(fib(6)) # 输出这个数列的前6位上的数字 for i in range(1, 7): print(fib(i)) '''def fib(n): if n == 1: return 1 elif n == 2: return 1 else: return fib(n - 1) * fib(n - 2) # 斐波那契数列第六位上的数字 print(fib(6)) # 输出这个数列的前6位上的数字 for i in range(1, 7): print(fib(i))'''
age = input('请输入你的年龄') print(type(age)) if int(age) >= 18: print('成年人...')
1、漏了末尾的冒号,如if语句,循环语句,else子句等
2、缩进错误,该缩进的没缩进,不该缩进的瞎缩进
3、把英文符号写成中文符号,比如说:引号,冒号,括号
4、字符串拼接的时候,把字符串和数字拼在一起
5、没有定义变量,比如说while的循环条件的变量
6、“==”比较运算符合“=”赋值运算符的混用
(1)索引越界问题IndexError
lst=[11,22,33,44]
print(lst[4])
lst = [11, 22, 33, 44] print(lst[3])
(2)append()方法的使用掌握不熟练
lst=[]
lst=append(‘A’,‘B’,‘C’)
print(lst)
lst=[] lst.append('A') lst.append('B') lst.append('C') print(lst)#['A', 'B', 'C']
lst = [{'rating': [9.7], 'id': '1292052', 'type': ['犯罪'], 'title': '肖申克的救赎', 'actors': ['蒂姆', '摩根']}, {'rating': [9.6], 'id': '1291546', 'type': ['剧情'], 'title': '霸王别姬', 'actors': ['张国荣', '张丰毅']}, {'rating': [9.5], 'id': '1292720', 'type': ['剧情'], 'title': '阿甘正传', 'actors': ['汤姆', '罗宾']}] name = input('请输入您要查询的演员:') for item in lst: # 遍历列表 -->{} item是一个又一个的字典 act_lst = item['actors'] for actor in act_lst: # 遍历字典,得到movie是一个字典中的key if name in actor: print(name, '出演了', item['title']) '''actors = movie['actors'] if name in actors: print(name + '出演了:' + movie) '''
被动掉坑:程序代码逻辑没有错,知识因为用户错误操作或者一些“例外情况”而导致的程序崩溃
**题目要求:**输入两个整数并进行除法运算
try: a = int(input('请输入第一个整数')) b = int(input('请输入第二个整数')) result = a / b print('结果为:', result) except ZeroDivisionError: print('对不起,除数不允许为0') except ValueError: print('只能输入数字串') print('程序结束')
try: a = int(input('请输入第一个整数')) b = int(input('请输入第二个整数')) result = a / b except BaseException as e: print('出错了', e) else: print("计算结果为:",result)
try: a = int(input('请输入第一个整数')) b = int(input('请输入第二个整数')) result = a / bexcept BaseException as e: print('出错了', e) else: print("计算结果为:",result) finally: print('谢谢您的使用')python
ZeroDivisionError除零
IndexError序列中没有此索引
KeyError映射中没有这个键
NameError未声明/初始化对象(没有属性)
SyntaxErrorPython语法错误
ValueError传入无效的参数
# print(10/0)#ZeroDivisionError lst = [11, 22, 33, 44] #print(lst[4]) # IndexError #print(num)#NameError #int a=20#SyntaxError a=int('hello')#ValueError
import traceback try: print('-------------------------') print(1 / 0) except: traceback.print_exc()
class Student: # 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进行修饰,所以我是静态方法') # 类方法 def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰') # 在类之外定义的成为函数,在类之内定义的成为方法 def drink(): print('喝水')
**类属性:**类中方法外的变量成为类属性,被该类的所有对象多共享
类方法:使用@classmethod修饰的方法,使用类名直接访问的方法
静态方法:使用@staticmethod修饰的主法,使用类名直接访问的方法
class Student: # 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进行修饰,所以我是静态方法') # 类方法 def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰') # 在类之外定义的成为函数,在类之内定义的成为方法 def drink(): 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) Student.cm() print('----------------静态方法的使用方式---------------') Student.method()
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)) stu2.gender = '女' # 只为stu2动态绑定了性别 print(stu1.name, stu1.age) print(stu2.name, stu2.age, stu2.gender) stu1.eat() stu2.eat() #动态绑定方法 def show(): print('定义在类之外的,称函数') stu1.show=show stu1.show() #stu2.show() '''1997157314512 1997157313120 张三 20 李四 30 女 张三在吃饭 李四在吃饭 定义在类之外的,称函数 '''
class Student: def __init__(self, name, age): self.name = name self.__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 进行访问
class Person(object): def __init__(self, name, 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, teacheryear): super().__init__(name, age) self.teacheryear = teacheryear stu = Student('张三', 20, '1001') teacher = Teacher('李四', 34, 10) stu.info() teacher.info() ''' 张三 20 李四 34''' # 多继承 class A(object): pass class B(object): pass class C(A, B): pass
方法重写
·如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写
·子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法
·object类是所有类的父类,因此所有类都有object类的属性和方法。
·内置函数dir()可以查看指定对象所有属性
·Object有一个__str__()方法,用于返回一个’对象的描述’,对应与内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对__str__()进行重写
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__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name'] 我的名字是张三,今年20岁 <class '__main__.Student'>'''
多态就是"具有多种形态",它指的是:几遍不知道一个变量所引用的对象到底是什么类型,任然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法
静态语言和动态语言关于多态的区别
·静态语言实现多态的三个必要条件
·继承
·方法重写
·父类引用指向子类对象
·动态语言的多态崇尚“鸭子类型”当看到一只鸟走起来想鸭子、游泳起来像鸭字、收起来也想鸭子,name这只鸟就可以被称为鸭子。在鸭子类型中,不需要关心对象是什么类型,到底是不是鸭子,只关心对象的行为
class A: pass class B: pass class C(A, B): def __init__(self, name, age): self.name = name self.age = age # 创建C类的对象 x = C('Jack', 20) # x是C类型的一个实例对象 print(x.__dict__) #实例对象的属性字典 print(C.__dict__) print(x.__class__)#输出了对象所属的类 print(C.__bases__)#C类的父类类型的元素 print(C.__base__) print(A.__subclasses__()) ''' {'name': 'Jack', 'age': 20} {'__module__': '__main__', '__init__': <function C.__init__ at 0x0000024C5F89DB80>, '__doc__': None} <class '__main__.C'> (<class '__main__.A'>, <class '__main__.B'>) <class '__main__.A'> '''
a = 20 b = 100 c = a + b # 两个帧数类型的对象的相加操作 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('张三') stu2 = Student('李四') s = stu1 + stu2 # 实现了两个对象的加法运算(因为在Student类中,编写__add__()特殊的方法) print(s) s = stu1.__add__(stu2) print(s) lst = [11, 22, 33, 44] print(len(lst)) # len是内置函数len,可以计算列表的长度 print(lst.__len__()) print(len(stu1))
'''特殊属性 __dict__ 获得类对象或实例对象所绑定的所有属性和方法的字典 特殊方法 __len__() 通过重写__len__()方法,让内置函数len()的参数可以自定义类型 __add__() 通过重写__add__()方法,可使用自定义对象具有“+”功能 __new__() 用于创建对象 __init__() 对创建的对象进行初始化 '''
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hh76Ig51-1643201542078)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220124114008841.png)]
class Person(object): def __new__(cls, *args, **kwargs): print('__new__被调用执行了cls的id值为{0}'.format(id(cls))) obj = super().__new__(cls) print('创建的对象的id为:{0}'.format(id(obj))) return obj def __init__(self, name, age): print('__init__被调用了,self的id值为:{0}', format(id(self))) self.name = name self.age = age print('object这个类对象的id为:{0}'.format(id(object))) print('Person这个类对象的id为:{0}'.format(id(Person))) # 创建Person类的实例对象 p1 = Person('张三', 20) print('p1这个Person类的实例对象的id:{0}'.format(id(p1)))
变量的赋值操作
只是形成两个变量,实际上还是只想同一个对象
浅拷贝
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) print(cpu2) # (2)类有浅拷贝 print('------------------------------') disk = Disk() # 创建一个硬盘类对象 computer = Computer(cpu1, disk) # 创建一个计算机类的对象 # 浅拷贝 import copy print(disk) computer2 = copy.copy(computer) print(computer, computer.cpu, computer.disk) print(computer2, computer2.cpu, computer2.disk) # 深拷贝 computer3 = copy.deepcopy(computer) print(computer, computer.cpu, computer.disk) print(computer3, computer3.cpu, computer3.disk) <__main__.CPU object at 0x0000023E0FC21FD0> <__main__.CPU object at 0x0000023E0FC21FD0> ------------------------------ <__main__.Computer object at 0x0000023E0FC21F70> <__main__.CPU object at 0x0000023E0FC21FD0> <__main__.Disk object at 0x0000023E0FC21FA0> <__main__.Computer object at 0x0000023E0FC21190> <__main__.CPU object at 0x0000023E0FC21FD0> <__main__.Disk object at 0x0000023E0FC21FA0>
创建模块
新建一个.py文件,名称尽量不要与Python自带的标准模块名称相同
导入模块
import 模块名称 [as 别名]
from 模块名称 import 函数/变量/类
import math # 关于数学运算 print(id(math)) print(type(math)) print(math) print(math.pi) print('----------------------') print(dir(math)) print(math.pow(2, 3), type(math.pow(2, 3))) print(math.ceil(9.001)) print(math.floor(9.999)) ''' 2855299925232 <class 'module'> <module 'math' (built-in)> 3.141592653589793 ---------------------- ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp'] 8.0 <class 'float'> 10 9'''
from math import pi print(pi) print(pow(2, 3)) # print(math.pow(2,8))
def add(a, b): return a + b def div(a, b): return a / b # 这个模块的名称是calc import calc print(calc.add(10,20)) print(calc.div(10,4)) from calc import add print(add(10,20))
以主程序方式运行124
def add(a, b): return a + b if __name__ == '__main__': print(add(10, 20)) # 只有当点击运行calc2时,才会执行运算
sys 与Python解释其及其环境操作相关的标准库
time提供与时间相关的各种函数的标准库
os提供了访问操作系统服务功能的标准库
calendar提供与日期相关的各种函数的标准库
urllib用于读取来自网上(服务器)的数据标准库
json用于使用Json序列化和反序列化对象
re用于在字符串中执行正则表达式匹配和替换
math提供标准算数运算函数的标准库
decimal用于进行精准控制运算精度、有效数位和四舍五入操作的十进制运算
logging提供了灵活的记录时间、错误、警告和调试信息的功能
import sys import time import urllib.request print(sys.getsizeof(24))#28 print(sys.getsizeof(45))#28 print(sys.getsizeof(True))#28 print(sys.getsizeof(False))#24 print(time.time())#1643016733.717006 print(time.localtime(time.time()))#time.struct_time(tm_year=2022, tm_mon=1, tm_mday=24, tm_hour=17, tm_min=32, tm_sec=13, tm_wday=0, tm_yday=24, tm_isdst=0) print(urllib.request.urlopen('http://www.baidu.com').read())
常见的字符编码格式
Python的解释器使用的是Unicode(内存)
py文件在磁盘上使用UTF-8存储(外存)
·文件的读写俗称“IO操作”
·文件读写操作流程
·操作原理
file = open('a.txt', 'r') print(file.readlines()) file.close()
文件类型
按文件中数据的组织形式,文件分为以下两大类
**文本文件:**存储的是普通"字符"文本,默认为uincode字符集,可以使用记本事程序打开
**二进制文件:**把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:mp3音频文件,jpg图片,.doc文档等
r以值读模式打开文件,文件的指针将会放在文件的开头
w以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在文件的开头
a以追加模式打开文件,如果我呢间不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾住家内容,文件指针在源文件末尾
b以二进制方式打开文件,不能单独使用,需要与供他模式一起视同,rb,或者wb
**+**以读写方式打开文件,不能单独使用,需要与其它模式一起使用,a+
#w file = open('b.txt', 'w') file.write('Python') file.close() #b src_file = open('b.txt', 'r') target_file = open('copylogo.png', 'wb') print(target_file.write(src_file.read())) target_file.close() src_file.close()
**read([size])**从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
**readline()**从文本文件中读取一行内容
**readlines()**把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
**write(str)**将字符串str内容写入文件
**writelines(s_list)**将字符串str内容写入文件
**writelines(s_list)**将字符串列表s_list写入文本文件,不添加换行符
seek把文件指针移动到新的位置,offset表示相对于whence的位置:offset:为正往结束方向移动,为负往开始方向移动 whence不同的值代表不同含义
0:从文件头开始计算默认值(默认值)
1:从当前位置开始计算
2:从文件末开始计算
**tell()**返回文件指针的当前位置
**flush()**把缓冲区的内容写入文件,但不关闭文件
**close()**把缓冲区的内容写入文件,同时关闭文件,释放对象相关资源
file = open('c.txt', 'a') lst = ['java', 'go', 'python'] file.writelines(lst) file.close() #javagopython file = open('a.txt', 'r') file.seek(2) print(file.read()) print(file.tell()) file.close()
with语句(上下文管理器)
·with语句可以自动管理上下文资源,不论什么原因跳出with都能确保文件正确的关闭,以此来大道释放资源的目的
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('a.txt', 'r') as file: print(file.read()) '''改进 with open('logo.png','rb') as src_file: with open('copy2logo.png','wb') as target_file: target_file.write(src_file.read()) '''
import os os.system('notepad.exe') os.system('calc.exe') #直接调用 os.startfile('C:\\Program Files (x86)\\Tencent\\TIM\\Bin\\tim.exe')
os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
os模块与os.path模块用于对目录或文件进行操作
import os os.system('notepad.exe') os.system('calc.exe') #直接调用 os.startfile('C:\\Program Files (x86)\\Tencent\\TIM\\Bin\\tim.exe') import os print(os.getcwd())
**getcwd()**返回当前的工作目录
**listdir(path)**返回指定路径下的文件和目录信息
**mkdir(path[,mode])**创建目录
**makedirs(path1/path2)**创建多级目录
**rmdir(path)**删除目录
**removedirs(path1/path2)**删除多级目录
**chdir(path)**将path设置为当前工作目录
import os print(os.getcwd()) lst = os.listdir('../chap15') print(lst) os.mkdir('newdir2') #os.makedirs('A/B/C/') os.rmdir('newdir2') os.removedirs('A/B/C')
path模块操作目录相关函数
**abspath(path)**用于获取文件或目录的绝对路径
**exists(path)**用于判断文件或目录是否存在,如果存在返回True,否则返回False
**join(path,name)**将目录与目录或者文件名拼接起来
**splitext()**将目录与目录或者文件名拼接起来
**basename(path)**从一个目录中提取文件名
**dirname(path)**从一个路径中提取文件路径,不包括文件名
**isdir(path)**用于判断是否为路径
import os.path print(os.path.abspath('demo10.py')) print(os.path.exists('demo13py'), os.path.exists('demo10.py'))
剩下的听不懂
"""一、使用print方式进行输出(输出的目的地是文件)""" fp = open('C:/李林峰/text.txt', 'w')#open是打开创建文件的意思 print('奋斗成就更好的未来',file=fp) fp.close() '''二、使用文件的读写操作''' with open('C:/李林峰/text2.txt', 'w') as file: file.write('奋斗成就更好的未来')
'''1 变量的赋值''' name1='林黛玉' name2='薛宝钗' name3='贾元春' name4='贾探春' name5='史湘云' print('1\t'+name1) print('2\t'+name2) print('3\t'+name3) print('4\t'+name4) print('5\t'+name5) '''2种方式 列表''' lst_name=['林黛玉','薛宝钗','贾元春','贾探春','史湘云'] lst_sig=['1','2','3','4','5'] for i in range(5): print(lst_sig[i],'\t',lst_name[i]) '''3种方式 字典''' d={'1':'林黛玉','2':'薛宝钗','3':'贾元春','4':'贾探春','5':'史湘云'} 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')
height=170 weight=50.5 bmi=weight/(height+weight) print('您的身高是:'+str(height)) print('您的体重是:'+str(weight)) print('您的BMI的指数是:'+'{:0.2f}'.format(bmi))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0WIDthtU-1643201542079)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220125104315944.png)]
二进制 ------>binary system
八进制 ------>octonary number system 英 /ˈɒktənəri/
十进制 ------>decimalism 英 /ˈdesɪməlɪzəm/
def fun(): num=int(input('请输入一个十进制的整数'))#将str转换成int类型 print(num,'的二进制数是:',bin(num))#第一种写法,使用了个数可变的位置参数 print(str(num)+'的二进制数为:'+bin(num))#第二种写法,使用“+”作为连接符(+的左右均为str类型) print('%s的二进制位:%s'%(num,bin(num)))#第三种写法,格式化字符串 print('{0}的二进制数为:{1}'.format(num,bin(num)))#第三种写法,格式化字符串 print(f'{num}的二进制数为:'{bin(num)})#第三种方式,格式化字符串 print(f'{num}的八进制数为:'{oct(num)}) print(f'{num}的十六进制数为:'{hex(num)}) if __name__ == '__main__': while True: try: fun() break#如果程序正常输出结束以后,我们再break except: print('只能输入整数!程序出错,请重新输入')
print('用户手机账户原有话费金额为:\033[0:35m8元\033[m') money=int(input('请输入用户充值金额:')) money+=8 print('当前的金额为:\033[0:35m',money,'元\033[m') ''' 用户手机账户原有话费金额为:8元 请输入用户充值金额:100 当前的金额为: 108 元 '''
num=int(input('请输入您当天行走的步数:')) calorie=num*28 print(f'今天共消耗了卡路里{calorie},即{calorie/1000}千卡') ''' 请输入您当天行走的步数:10000 今天共消耗了卡路里280000,即280.0千卡 '''
father_height=float(input('请输入父亲的身高:')) mother_height=float(input('请输入母亲的身高:')) son_height=(father_height+mother_height)*0.54 print('预测子女的身高为:{}cm'.format(son_height)) ''' 请输入父亲的身高:170 请输入母亲的身高:168 预测子女的身高为:182.52cm'''
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QoNtIT0V-1643201542080)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220125114055615.png)]
pwd=input('支付宝支付密码:') if pwd.isdigit(): print('支付数据合法') else: print('支付数字不合法,支付密码只能是数据') print('-------------------------------------------') print('支付数据合法' if pwd.isdigit() else '支付数字不合法,支付密码只能是数据')
qq=input('请输入qq号:') pwd=input('请输入密码:') if qq=='1059630434' 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''' } star=input('请输入您的星座查看近来运势:') print(d.get(star)) '''请输入您的星座查看近来运势:白羊座 1'''
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d8g2lFsb-1643201542080)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220125121002601.png)]
x=97#代表的是a的ASCII值 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:#这个else的意思是当你的这三个循环都结束后就会执行这个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)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tu7ItCUe-1643201542081)(C:\Users\10596\AppData\Roaming\Typora\typora-user-images\image-20220126195422389.png)]
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 i in range(len(cart)-1,-1,-1): print(cart[i])
key=input('请输入您的星座名称') flag=True for item in d: if key==item: flag=True print(key,'的性格特点为:',d.get(key)) break else: flag=False if not flag: print('对不起,您输入的星座有误')
dict_ticket={'G120':['天津-上海','18:05'], 'G153':['北京-天津','18:15']} print('车次\t\t出发站-到达站\t\t') for item in dict_ticket: print(item,end=' ') for i in dict_ticket[item]: print(i,end=' ') 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}尽快取走纸质车票.')
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]}]好了,请您慢用')
https://mp.weixin.qq.com/s?src=11×tamp=1643077913&ver=3579&signature=Xs5i8fOba3Gvnk6VoReCQEZbFoRsxdHCv78bIkAR83AXabyIBVQXrSpTxpM7XqJrsF1K9JCf8l4erybJS7kfqksl2v6e0J2*SbQzGq-ZSelf-ULL9K3d7u970gXII3nP&new=1