清明前Python笔记
LESSON1 环境安装及基础一、名词解释机器语言--编译语言--自然语言解释同时Python编译编译完再交给电脑面向对象关注谁去做面向工程关注怎么做二、简介特点开源胶水语言无缝连接其他语言动态赋值决定数据类型解释型面向对象三、安装1.安装解释器官网https://www.python.org/安装路径winR检测是否安装成功geek卸载软件everything扫描软件https://www.voidtools.com/zh-cn/downloads/截图工具https://www.snipaste.com/四、写代码1.解释器中直接书写winR---Python--写代码写一句执行一句2.Python文件书写以.py结尾的文件---进入终端---到达工作路径---输入文件地址相对路径相对于当前工作目录你现在所处的目录的路径只描述 “相对位置”。绝对路径从文件系统的根目录最顶层开始完整描述文件位置的路径。代码的书写规范运算符的左右两边带一个空格五、注释1.#单行注释从#开始到这一行结束中间写的内容不会被python解释器识别2.多行注释 多行注释 “”“ 多行注释 ”“”六、输入输出1.输出print可同时输出多个参数用逗号隔开默认换行2.查看帮助信息help命令3.输入input“提示词” 直到用户按回车键注意1.Python缩进决定代码层级不要随便缩进容易报错2.结束符为分号不建议或者直接换行七、变量1.定义变量是存储数据的容器是动态数据类型可链式赋值2.变量名命名规则1必须是有效字符组成的 大小写的字母、数字、下划线2不以数字开头3不能有空格4不使用关键字和保留字help”keywords“ 查看关键字5严格区分大小写6针对较长变量名采用蛇形命名(见名知义)select_username_from_students SelectUsernameFromStudents3.打印变量时不带引号八、基本数据类型1.分类int float complex复数 string bool2.type()是获取数据的数据类型的3.\去除掉字符的特殊含义\t 制表符4.字符串和变量‘ ’ 和“ ”字符串不能换行“““ ”””和‘‘‘ ’’’可以如果没有赋值给变量就是多行注释反之为字符串5.布尔类型Ture 1 False 0LESSON2 运算符一、数据类型的转换1.例子引入现象input无论输入什么最终都是字符串类型2.查看数据类型type字段isinstance字段数据类型a int(input(num1)) print(type(a)) print(isinstance(a,str)) //True 判断数据a是否是str数据类型的最终的返回结果是布尔值3.转换分类1.隐式转换print(0.10.2) #0.300000000000000042.显式转换1整数intint(x, base10) - integer //如果没有指定转换的进制默认是十进制的 print(int(111000,16)) //把用户输入的值作为十六进制进行转换 print(int(True)) //布尔值转换成数字就是0和12浮点float3字符串str4布尔值bool0和空值都为False 所有非0转换都为True5noneNone 如果函数没有设置返回值那么返回的就是None二、字符串的格式化输出1.例子引入现象Python中同类型才能拼接2.推荐的字符串格式化输出方法1.占位符占位符表示%s字符串%d整数%总宽度.小数位数f浮点数2.str.format()str.format() print(用户的math值是{},用户的年龄是:{}.format(math,age))3.f-string推荐f xxxx{变量名}xxxxxx print(f用户的math值是{math:.2f},用户的年龄是:{age})3.例子三、运算符1.算数运算符符号含义加-减*乘/除默认计算后结果为浮点数//整除向下取整%取余**幂运算2.比较运算符结果为Ture或者False符号含义赋值判断 ……Python中可以链式比较3.逻辑运算符符号含义and如果左边为假返回左边操作数左为真返回右边操作数or如果左边为真返回左边操作数左为假返回右边操作数not空为Ture 非空为False返回的是操作数本身不是Ture或者False闰年能被4整除不能被100整除4.赋值运算符符号含义-5.位运算原码直接把十进制转换成的二进制反码原码除了符号位之外其余位取反补码反码1例如-127 1000 1100 -12 1111 0011 -12反码 1111 0100 -12补码 0000 0111 7 1111 1011 补码 1111 1010 反码 1000 0101 原码 -5符号含义两位为1才为1|一个1则为1^相同为0不同为1~取反左移n位空位补0【相当于乘2的n次方】正数左边高位补0负数先变成补码左边高位补1【相当于除2的n次方】6.成员运算符in判断某个元素是否存在于某个序列中返回结果为True或Falseis存储位置是否一样判断值是否一样LESSON3 程序控制流程一、顺序结构顺序结构代码默认从上到下从左到右进行执行二、选择结构选择结构根据不同的条件执行不同的代码块1.单分支if 条件: 当条件返回的结果为True时执行if下面缩进的代码块2.双分支if 条件: 条件的结果为真时执行的代码块 else: 条件不成立的时候执行的四else下面缩进的代码3.if嵌套pass 没有实际含义就是一个占位符4.多分支if 条件1: 条件1成立时执行的代码块 elif 条件2: 条件2成立的时候执行代码 …… else: 上述的条件都不满足的时候执行的是else里面的代4.三元运算符双分支的简写 值1 if 条件 else 值2 当条件成立的时候执行值1。当条件不成立时执行值2三、循环结构循环结构当条件成立时连续重复执行一段代码1.for用来迭代容器中的每一个元素for 临时变量 in 容器|序列: 循环体重复执行的代码块2.rangerangeend //生成数字序列[0,end) rangestart,end //生成数字序列[start,end) rangestart,end,step //生成数字序列[start,end),并且步长为step生成数字序列3.while详见lesson44.手动退出循环①break直接退出循环②continue退出本次循环执行下一个循环5.enumerate作业1. 计算 1² 2² 3² … n²输入 n计算前 n 个正整数的平方和。nint(input(请输入n)) sum0 for i in range(1,n1): sumi*i print(f前n个正整数的平方和为{sum})2. 求满足条件的数输出 100~999 之间所有个位数大于十位数、且十位数大于百位数的递增数。如 123、135、246 等for i in range(100,1000): baiweii//100 shiweii//10-baiwei*10 geweii-baiwei*100-shiwei*10 if geweishiwei and shiweibaiwei: print(f{i}) else: continue3. 鸡兔同笼输入头数 h 和脚数 f穷举法求出鸡和兔各多少只。如果无解则输出无解。hint(input(请输入头数h:)) fint(input(请输入脚数f:)) for i in range(1,h1): for j in range(1,h1): if ijh and i*2j*4f: print(f鸡有{i}只兔有{j}只) else: continueAILESSON4 while1.规范写法while 条件: 循环语句 break/continue while 条件: 循环语句 break/continue else 循环体正常结束时执行的代码2.例题1.猜数电脑随机生成一个随机整数用户去猜猜三次之后询问是否继续继续则接着猜不继续则退出游戏 import random random1 random.randint(1,100) n0 while n3: guess int(input(请猜数字:)) if guessrandom1: print(猜对了游戏结束) break elif guessrandom1: print(f用户猜的数字是{guess},猜大了) n1 else: print(f用户猜的数字是{guess},猜小了) n1 if n3: choose input(用户已经输错了3次是否继续游戏n/y:) if choosen: print(退出游戏) break elif choosey: n0 print(游戏继续)ATM 系统 ATM 系统 1. 查询余额 2. 存款 3. 取款 4. 转账 5. 修改密码 6. 退出 **要求** 1. **初始密码**为 888888初始余额为 10000 元 2. **登录验证**启动后先验证密码最多 3 次3 次失败则锁定程序退出 3. **查询余额**显示当前余额 4. **存款**输入金额金额必须为正数 5. **取款**输入金额需判断余额是否充足金额必须为正数 6. **转账**输入对方账号任意字符串即可和金额需判断余额是否充足 7. **修改密码**先输入旧密码验证再输入两次新密码确认一致后修改 8. **输入非法选项**时提示无效操作 9. 每次操作后都回到主菜单直到用户选择退出 str1 ATM 系统 1. 查询余额 2. 存款 3. 取款 4. 转账 5. 修改密码 6. 退出 # 1. **初始密码**为 888888初始余额为 10000 元 # 2. **登录验证**启动后先验证密码最多 3 次3 次失败则锁定程序退出 passwd 888888 money 10000 num1 0 #记录用户输错密码的次数 while num13: password input(请输入密码) if passwordpasswd: print(密码正确) while True: print(str1) choose input(请选择你要进行的操作:) if choose 1: print(f当前账户的剩余金额是{money}) elif choose2: cun int(input(请输入存款金额)) if cun0: money cun print(f存款{cun}元成功目前的余额是{money}) else: print(请输入正确的存款金额) elif choose3: print(取款操作) qu int(input(请输入取款金额)) if qumoney: print(余额不足) else: money - qu print(f取款{qu}元成功当前的余额是{money}) elif choose4: # **转账**输入对方账号任意字符串即可和金额需判断余额是否充足 cardid input(请输入收款方的账户:) zhuan int(input(请输入转账的金额)) if zhuanmoney: print(余额不足) else: money - zhuan print(f向{cardid}成功转账{zhuan},当前的余额是{money}) elif choose5: print(开始修改密码) oldpassword input(请输入旧密码) if oldpasswordpasswd: new_passwd input(请输入新的密码) new_passwd2 input(请再次输入新的密码) if new_passwdnew_passwd2: passwdnew_passwd print(f当前的新的密码是{passwd}) else: print(两次新的密码不一致密码修改失败) else: print(旧密码输入错误更改密码失败) elif choose6: print(程序退出) break break else: print(密码错误) num11 print(f当前的错误次数是{num1}) if num13: print(程序异常退出) # while True: # if num13: # print(用户输入错误密码的次数过多程序锁定) # break # password input(请输入密码) # if passwordpasswd: # print(密码输入正确) # print(str1) # choose input(请选择你要进行的操作:) # if choose 1: # print(f当前账户的剩余金额是{money}) # elif choose2: # cun int(input(请输入存款金额)) # if cun0: # money cun # print(f存款{cun}元成功目前的余额是{money}) # else: # print(请输入正确的存款金额) # else: # num11 # print(f密码输入错误当前已经错误{num1}次)3.打印100-200之间所有的素数i 100 while i 200: is_sushu True j 2 while j i//2: if i%j0: is_sushuFalse break j1 if is_sushu: print(f{i}是素数) i13.死循环while True: jieguo input(你还爱我吗) if jieguo爱: breakLESSON5 容器一、定义可以存储多个数据的对象二、分类字符串、列表、元组、字典、集合str1 hello python dir(str)//查看对象方法的1.字符串字符串为有序序列【1】字符串的索引正向索引下标从左往右从0开始反向索引下标从右往左从-1开始通过索引下标获取单个字符即字符串名【索引下标】 索引下标超出边界会报错【2】字符串的切片截取字符串的某一小段字符串名【start:end:step】//索引下标从start开始到end-1结束步长为step组成的字符串 start加上步长要靠近end值 eg.字符串名【6:1:-1】//从下标为6切到下标为2结束步长为-1 eg.用户输入一段字符判断是否为回文 str2 input(请输入一段话) print(是回文) if str2 str2[::-1] else print(不是回文) 切片下标超出会在超出边界后自行截断【3】字符串的方法字符串是不可变的数据类型创建之后不能更改所以他的方法都是返回一个新的字符串字符串名.方法字符串的拼接print(adadacdcdcd)字符串的倍增*print(*20)字符串的成员判断inprint(c in str1)字符串的长度len返回字符串的长度 ——全局方法 len 最大索引下标长度-1 str1cdc dd print(len(str1))大小写str1 hello pYthon # 由于字符串是不变的数据类型所以它的方法都是返回一个新的字符串 # 字符串名.方法() print(str1.upper()) #转大写 print(str1.lower()) #转小写 print(str1.title()) #所有单词的首字母大写 print(str1.capitalize()) #只有第一个单词的首字母大写 print(str1.swapcase()) #大小写互换查找find返回值为从左往右第一个满足匹配的字符索引下标如果没有匹配的则返回-1找不到字符串也返回-1 str1 hello pYthon print(str1.find(pYthon))反查找rfind返回值为从右往左第一个满足匹配的字符索引下标如果没有匹配的则返回-1找不到字符串报错 str1 hello pYthon print(str1.rfind(h)) print(str1.rfind(b))查找indexprint(str1.index(B)) //返回的是从左往右的第一个满足匹配的元素的下标 找不到直接报错ValueError替换replace替换replace(旧的“新的”)——默认在字符串中全局查找替换所有匹配元素 替换replace(旧的“新的”n)——默认在字符串中查找替换n个匹配元素 print(str1.replace(h,李四)) print(str1.replace(h,李四,1))以什么开头结尾withstartswith endswith 是否以……开头、是否以……结尾 print(01-test.py.endswith(py)) print(zhngsan .startswith(z))去除左右两边无意义的空格striprint( vfvfv .strip())字符串居中centerprint(hi.center(10,))【4】串的分割和拼接分割splitstr2 h1这是我要的部分/h1 print(str2.split(,))#分割默认是以空格作为分割的,最终返回的是一个列表拼接joina -----------.join(cdcdcd) list1 [python,apple] print(,.join(list1)) print(a)2.列表【1】列表特点:1、有序的有索引下标2、可变的数据类型列表中的元素在创建之后可以进行增加和删除and更改3、可以存放任何的数据类型【2】列表的创建1、[元素1,元素2,……] 元素的数据类型可以是不一致的 2、list():list函数强行进行数据类型转换转换为列表【3】列表的方法list1 [1,2,3,4,5,6,7]在列表末尾添加一个元素appendlist1.append(zhangsan) print(list1)在列表指定位置添加一个元素insert在列表指定位置添加一个元素insert(插入位置插入元素) list1.insert(1,zhnagsan) print(list1)列表的合并列表extendlist1.extend([zhnagsan,lisi,wangmazi]) print(list1)照索引下标进行的删除元素poppop下标——删除指定下标元素 pop——删除最后一个元素根据元素的值进行删除元素removeremove元素内容——删除列表内和元素内容相同的元素 list1.remove(1) #删除元素的值为1的元素 print(list1)索引下标或者切片删除元素del删除变量del 列表【索引下标】 删除变量del 列表【startend】 list1.remove(1) #删除元素的值为1的元素 print(list1)清空列表clearlist1.clear() print(list1)更改列表名【索引下标】“元素” list1 [1,zhangsan,3,4,zhangsan,6,7,8,9,10] list1[2]zhnagsan print(list1) list1[2:4][lisi,wangwu] print(list1)查找indexindex(查找元素startend)——如果不存在报错统计元素出现次数countprint(list1.count(zhangsan)) //统计某个元素在列表当中出现的次数的翻转reverse——更改原列表排序sortreverse默认为升序 reverseFalse决定升序 reverseTrue决定降序【4】拷贝①浅拷贝copy(被复制列表只会把基本数据类型的元素重新拷贝一份如果子元素有复杂数据类型则直接用原来的内存地址②深拷贝import copy 复制列表copy.deepcopy(被复制列表eg.list4 [1,2,3,4,5,6,7,8,9,10]# 返回奇数组成的新列表 和 所有偶数组成的新列表ji_list[] ou_list[] for i in list4: \# print(i) if i%20: ou_list.append(i) else: ji_list.append(i) print(f奇数列表:{ji_list},\n偶数列表:{ou_list})eg. while循环实现列表元素的遍历 index 0-len(list)-1list1 [1,zhangsan,3,4,zhangsan,6,7,8,9,10] index0 while indexlen(list1)-1: print(list1[index]) index1 list1 [1,zhangsan,3,4,zhangsan,6,7,8,9,10] for index,i in enumerate(list1): print(f下标为{index}的位置元素是{i})Python运行演示https://pythontutor.com/visualize.html#modedisplay【5】其他全局函数sum,min,max,len3.元组【1】元组的特点有序但不可变的数据类型一旦声明无法更改【2】元组的创建1.tuple1 (1,2,3,4,2,2,张三) print(type(tuple1)) print(tuple1[1]) tuple1[1]lisi //元组声明之后无法更改 2、使用函数tuple():强制转换为元组的数据类型 tuple2 tuple() print(type(tuple2)) ——如果元组元素只有一个那么在元素后面必须带上逗号否则认为是字符串而不是元组【3】元组的方法统计count查找index注意元组中的可变数据类型的元素是可以进行更改的。原因是元组的对应位置只是保存了这个可变对象的内存地址tuple5 (1,2,3,[4,5,6]) tuple5[-1][1] zhnagsan print(tuple5)4.字典【1】字典的特点字典的键只要是不可变的数据类型都可以字典的值可以是任何数据类型且可变【2】字典的创建1.dict1{ } dict2dict(namezhnagsan,age21) dict3dict([(name,zhnagsan),(age,33)]) dict4 dict.fromkeys([uname,age,hobby],0) 2.dict5dict() //强制转换为元组的数据类型 创建字典 字典名.fromkeys键键默认值 空字典 dict{} dictdict【3】字典的方法查找get通过键 字典名【“键名”】——没有则报错 通过get 字典名.get“键名”——更安全如果找不到返回None不报错检查键是否存在in键名 in 字典名——返回bool值添加和修改字典名【“键名”】【“新键名”】——如果键存在则重新赋值如果不存在则创建批量更新update字典名.update“”设置默认值setdefault字典名.setdefault()——如果key存在则不生效否则设置默认值删除pop字典名.pop(“删除内容”x——根据key删除内容并且返回值删除的内容如果删除内容不存在x可以显示默认值不存在删除最后插入的键值对的popitem字典名.popitem【4】字典的遍历for i in dict: print(dict[i]) for key,value in dict.items(): print(key) print(value) print“”*205.元组结构赋值LESSON6 集合一、练习# # **题目二简易员工管理系统** # # **题目描述** # # 设计一个简易的员工信息管理系统。程序启动后会显示一个功能菜单 # # 用户可以通过输入数字来选择不同的功能。系统需要管理员工的姓名、工号和年龄。 # # **功能菜单** # # # # # # # # **具体要求** # # # # 1. **数据结构** # # 使用一个列表来存储所有员工的信息列表中的每个元素是一个字典。 # # 字典的键为 name姓名、id工号、age年龄。 # # **示例数据结构**预置数据 # # python # # # # # # 2. **添加员工功能1** # # - 使用 while 循环允许用户连续添加。 # # - 提示用户输入员工的姓名、工号和年龄。 # # - 将信息组装成字典并添加到员工列表中。 # # - 询问用户是否继续添加y/n。 # # # # 3. **查看所有员工功能2** # # - 使用 for 循环遍历员工列表并格式化打印出每个员工的信息。 # # # # 4. **按工号查找员工功能3** # # - 提示用户输入要查找的工号。 # # - 使用 for 循环遍历列表并使用 if 语句判断工号是否匹配。 # # - 如果找到打印该员工的完整信息如果未找到提示“未找到该员工”。 # # # # 5. **统计年龄分布功能4** # # - 定义一个字典来统计不同年龄段的人数。年龄段分为青年30、中年30-50、资深50。 # # - 使用 for 循环遍历所有员工通过 if...elif...else 判断每个员工所属的年龄段并在统计字典中对应计数。 # # - 最后遍历统计字典打印出分布情况。 # # # # 6. **退出系统功能5** # # - 使用 break 退出主循环结束程序。 employees [ {name: 张三, id: 1001, age: 28}, {name: 李四, id: 1002, age: 21}, {name: 王五, id: 1003, age: 55} ] str1 --- 员工管理系统 --- 1. 添加员工 2. 查看所有员工 3. 按工号查找员工 4. 统计年龄分布 5. 退出系统 while True: print(str1) choose input(请输入选择的功能:) if choose1: print(添加员工功能开始~~~) # 2. **添加员工功能1** # - 使用 while 循环允许用户连续添加。 # - 提示用户输入员工的姓名、工号和年龄。 # - 将信息组装成字典并添加到员工列表中。 # - 询问用户是否继续添加y/n。 while True: uname input(请输入姓名:) id input(请输入id) # 如果id值本身是存在的则直接报错退出添加 is_cunzaiFalse for i in employees: if i[id]id: is_cunzaiTrue break if is_cunzai: print(id值的用户存在) else: ageint(input(请输入年龄)) new_user { name:uname, id:id, age:age } employees.append(new_user) print(employees) a input(是否继续添加员工N\Y) if aN: break elif choose2: # 查看所有员工 for i in employees: print(f员工的姓名是:{i[name]},员工的id是:{i[id]},员工的年龄是:{i[age]}) elif choose3: select_id input(请输入查找的工号:) is_cunzai False for i in employees: if i[id]select_id: is_cunzaiTrue print(f员工的姓名是:{i[name]},员工的id是:{i[id]},员工的年龄是:{i[age]}) break if not is_cunzai: print(很遗憾用户不存在) elif choose4: # **统计年龄分布功能4** # # - 定义一个字典来统计不同年龄段的人数。年龄段分为青年30、中年30-50、资深50。 # # - 使用 for 循环遍历所有员工通过 if...elif...else 判断每个员工所属的年龄段并在统计字典中对应计数。 # # - 最后遍历统计字典打印出分布情况。 dict1 { 青年:0, 中年:0, 资深:0 } for i in employees: if i[age]30: dict1[青年]1 elif 30i[age]50: dict1[中年]1 else: dict1[资深]1 print(dict1) elif choose5: print(程序退出) break # company { # name: 科技公司, # departments: [ # { # name: 技术部, # employees: [ # {name: 张三, position: 工程师, salary: 15000}, # {name: 李四, position: 架构师, salary: 25000} # ] # }, # { # name: 市场部, # employees: [ # {name: 王五, position: 经理, salary: 18000}, # {name: 赵六, position: 专员, salary: 9000} # ] # } # ] # } # # 市场部门的人员名字返回给我 # # company[departments] # for i in company[departments]: # # print(i) # # 确定是市场部的信息 # if i[name] 市场部: # # print(i[employees]) # for j in i[employees]: # print(j[name])二、集合特点1.集合是无序的不存在索引下标、可变的数据类型集合内部的元素必须是不可变的数据类型2.集合中的元素不能重复三、集合创建1.{元素1,元素2……} set1 {1,1,1,2,12,33,33,33} 如果集合中存在重复的元素那么集合会自动进行去重的操作 空的集合 2. set函数是强制转换为集合的 set2 set()四、集合的方法set1 {1,2,3,4,zhangsan}添加元素添加是无序的不确定添加的位置 set1.add(zhangsan) print(set1) set1.update([zhagsan,lisi]) print(set1)删除print(set1) 只能根据具体的元素内容进行删除,如果删除的元素不存在那么报错KeyError: asassaasass set1.remove(ckdcdkcmdcdmkc) print(set1) set1.discard(cndkcnkdcndkc) #discard删除的元素不存在不会报错 print(set1) set1.pop() #随机删会返回删除的元素 set1.clear()五、集合的运算1、交集同时在a和b中的元素set1 {1,2,3,zhangsan,lisi} set2 {1,3,lisi,wangmai} print(set1 set2) print(set1.intersection(set2))2.并集存在于a或者存在于bprint(set1 | set2) print(set1.union(set2))3.差集在a中但是不在b中的print(set1-set2) print(set1.difference(set2))4.对称差集在a中或者在b中但是不同时在a和bprint(set1 ^ set2) print(set1.symmetric_difference(set2))六、推导式推导式指的是快速生成列表、字典1.无条件的列表推导式1-1000之间所有的偶数的平方组成一个列表 list1 [i*i for i in range(1,11)] print(list1)2.带条件的列表推导式[表达式 for 临时变量 in 序列 if 条件] list2 [str(i)zhagsan for i in range(1,11) if i % 2 0] [4,16] print(list2) # [[1,2],[3,4]] # list3 [[i,j] for i in range(1,3) for j in range(5,8)] # print(list3) # [[1, 5], [1, 6], [1, 7], [2, 5], [2, 6], [2, 7]]3.字典推导式dict1 {i:i*i for i in range(7)} print(dict1) dict2 { i:j for i in [name,age] for j in range(1)} print(dict2)4.集合推导式set1{i for i in range(10)} print(set1)