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