欢迎光临散文网 会员登陆 & 注册

python笔记 (学习系列第二篇笔记 这篇会比较长)

2023-09-07 16:23 作者:是泷泷哟  | 我要投稿

建议初学者到本站其他up那安装好环境 开心的学下去 希望我的笔记会对你有用

Python

单纯的学好一门语言并不能让你有太多的成长 你要清楚 我先要做什么事 什么语言最适合 提出问题 选好语言 让语言去协助你完成你想完成的事 大型的比赛 能让你对语言的理解更上一层 给自己压力吧 面向于一门语言 它最深奥的那种压力 能够继续自己所爱的事 所获的不仅只有[快乐]而已 永不放弃+发掘自己 发掘你的才能并且利用它 成家立业 ——> 你可以到过来读 始终不渝地去坚持学习 耐心是生活的关键,你知道的,一步一个脚印 逐渐实现自己的目标,你知道的 那些让你痛苦地 要迎难而上 去他妈的 干就完了 # python 的数据类型 以及一个判断函数的 print("Hello World!") ​ age = 30 name = "泷泷" money = 99999 print(name,age,money) # 全部写一行 它会统一的输出 当然是一行                                                                                        print(name,end="\t") # print 你要是不修改 end后面的东西 它默认是\n 就是换行符 你要是修改了 end 改成了\t 或者就简单的几个空格 结果就截然不同了 print(money) ​ a = (1,2,3,4) # a[0] = 5 定义了后再改变 就会出错 # 元组的定义 一旦定义了初始的值 其值就不会发生改变了 print(a) # 输出结果 (1,2,3,4) ​ p = {3,3,45,5,5,51,2,1,1} print(p) # 集合类型 自动删除重复的数据 集合类型就是吊 ​ b= [1,2,3,4] b[0] = 4 print(b) ​ print(type(b)) dict= {'name':"张三",'age':13,'addre ss':"北京市朝阳区"} print(dict) ​ d = 'Hello World!' print(isinstance(d,str)) #isinstance 是一个判断函数 判断是否为某种类型 返回结果true 或者false ​ #python的运算符 以及分支语句 还有 random库 #格式化输出 name = "泷泷" age = 19 address = "你心里" ​ print("我的名字是%s,我今年%d岁了,我在%s"%(name,age,address)) # 有c语言中的%06d 这种的 也有%.2f 或者其它的一系列 填充的东西 ​ ​ # format 方法输出 print(f'我的名字是{name},我几年{age}岁了,我在{address}') ​ # 输入方法 number=int(input("请输入一个数字:")) print(f'你输入的数字为:{number}') # 这里稍微解释下 如何像上面的格式化输出一样 s是 一个浮点数据 {s:.2f} 就能把结果以小数点两位的形式输出出来 #python 支持赋值运算符 # python 中的逻辑运算符 或者语句 也要遵守短路运算符 ​ # python中可以定义外部函数 可以带到随机的效果  import random random.randint(0,2) # 产生0-2之间的随机数 这个可以用于与用户进行猜拳 让电脑输出随机数  ​ #python中的三目运算符 num1 = 1 num2 = 2 max = num1 if num1>num2 else num2 #解释一下 相当于就是if else 把真值放在前面 为假的放在后面 不要跟C语言的三目运算符混淆 ​ max = 1 if 1>2 else 2 print(max) # for 循环的不同之处 # for i in range(0,101): in 后面可以是不一样的东西 比如数组 比如在字典 比如~~~~~~~ 写法就大不相同了 不要被语言限制了头脑 要敢于思考 # break 和 continue 之间的区别 一个直接退出for循环跳到下一次的循环 # while和else 的综合应用 i = 0 while i<10 :   print(i)   i+=1 else :   print("程序正常结束,这次题例用于测试是否正常结束后返回else语句后面的值") # 输出0-9 输出完毕之后正常返回else后面的值 # 这个可以用于检测一些情况是否合法输出完整 后面的else后面的语句也不用是一个固定的输出 也可以是赋值 有奇效  # 用上 continue else语句内容还是照样会出现 要是有break语句的话 else后面的语句就不会输出 因为不是正常结束 、 ​ ​ #王八库 (就是乌龟库 叫i这个名字比较喜感) # import turtle # 专门用来绘制图形图像的 # import time # 让计算机休眠的 这样计算机就有时间去 画图 # turtle.forward(100) #画横线 # time.sleep(12)  # 让计算机休眠 中间不能做其他任何的操作 ​ # import turtle # import time ​ # for i in range (5): #  turtle.pencolor("red") # 用于设置画笔的颜色 #  turtle.forward(200) #  turtle.right(144) # 让线条的方向发生偏转 #  # 这一个整体 能够画出五角心 ​ ​ # len 计算最大索引下标 # 截取操作 变量名称[起始位置] 可以是 起始位置 结束位置 步长为多少 这样就可以配合某种条件方法进行判断一类的活  # 只有冒号的话 相当于复制操作 这种的也可以弄成反向移动 就是 [-4:-1:-1] 就可以实现从后面开始 往前面截取 ​ ​ ​ # 字符串.find(你要查找的子串的位置 可以说是下标 ) 找到 返回下标 没有找到直接返回 -1 ​ # index 跟上面的差不多 但是假如没有找到的话 会直接报错 跟上面的对比的话 在报错层面返回的不一样 ​ ​ ​ # 如何截取文件的名称 或者文件后缀名 filername = input("请输入你要上传的文件的名称:") # 流程化设计 1 第一步我要输入我想要的文件 包括后缀 index = filername.find('.')    # 用 find 将关键下标给计算出来 print("你的文件名称为:",filername[:index]) # 可以利用截取 或者可以说切片的操作 将你想要的文件名 或者其后缀给截取下来 print("你的文件后缀名为:",filername[index:]) # +1 的话 就不是.txt的后缀了 ​ ​ # 字符串各种函数的应用 str1 = 'Hello World' str2 = str1.replace("Hello","longlong") # 假如说有两个Hello 你可以在后面定义其个数 print(str2) ​ #简单来说 就是替换 再重新赋值 ​ #split 简单来说就是按某种标识来切割 比如 longlong-wuzhi-19-2003 可以用’-‘ 来切割 #join 可以把散开的列表用-来拼合起来 这一点跟php里面的那两个函数有点像 这个都是针对列表的 可以说很有作用的东西 # 简单带一下另外两个函数 upper与lower方法 一个全部转换成大写 一个全部转换成小写 #简单提一些上面的两个函数 在用户进行密码登记的时候 可以可以把用户输入的数据进行转换 这样就不用担心 用户因为大小写问题出错 ​ #startswith 检查字符串是否以什么什么字符开头 其实作用是用于检查 避免出错】 #endswith 检查字符串是否以指定的字符来结尾 跟上面的一样 对返回true 错就返回false ​ # 字符串的相加 具体操作是随机数 import random mystr = "qwertyuiopasdfghjklzxcvbnm1234567890" code = "" #空字符串用于后面缝合上去随机数 #for i in range(4): # index=random.randint(0,len(mystr)-1)  # code+=mystr[index] #print(f"你要输入的4位随机数是:{code}") ​ #到目前为止 随机数搞定 其中涉及到字符的相加 随机函数的使用 len函数的使用 要是题目说随机一个数把它 前两位数 和 后两位数组合成一个随机数 可以让给index保存其下标 # 使用字符串你截取对这个大的字符串进行切割 最后再拼接起来 ​ index= random.randint(0,len(mystr)-1) print(index) code+=mystr[index-2:index]  #记住这里要写:而不是, 而且这种截取 左闭合右半开 所以要对下标进行修饰 code+=mystr[index+1:index+3] print(f"你要输入的4位随机数是:{code}") name_list=['Jerry','Tom','LongLong'] # 可以用下标对每个元素进行编号 列表在计算机内存中的存储结构与字符串类似 都是占用一段来连续的内存地址 简单来说就是和字符串是同母异父的兄弟 print(name_list) for i in name_list :   print(i) # 这里面不能写成字符串形式的那种 左边这种循环相当于name_list中的每一个元素给到了变量i 让这个变量i来存储每次循环的值   #列表中有多少个元素,则for循环就会自动的循环多少次    # 在字符串中查找元素 用列表来举例 # fruit_list = ['apple','banana','pear'] # 其中的pear的这种是一个整体 你不能像查找字符串一样 就简单输入一个字符 大哥你把所有的都输入进去可以吗 # print(fruit_list.index('pear')) # 里面的这个pear这个一定要写完整 这个就跟身子缺了一半一样的 你特么一个残缺的身体 你怎么做一个完整的事 你说对不对 ​ people_list = ['刘备','刘备','关羽','张飞','曹操','张三'] # 少了啥都不能少了曹操和张三 print("刘备出现的次数为:",people_list.count("刘备")) # 这个前缀一定要写完 不然你都不知道哪个是哪个的 ​ # in 和 not in 方法 判断指定数据在不在列表中 注意这里是 “判断” 既然牵扯到判断这一类的东西就会牵扯到 真假值 这个也可以用到字典里  # 简单来说就是可以配合着if 来判断类似于字典 列表这一类的有没有重复的值 还是很有必要的 要理解清楚if 和 in 组合使用的奇妙之处 然后就没有然后了 # 比如 if people_list in 数据列表中 就可以查找你想要的结果是否在数据列表中 直接一手惊不惊喜意不意外 爽就完事了 ​ print("以下操作进行是添加数据") #在列表中追加数据 people_list.append("泷泷")  # 直接在后面追加就可以 print(people_list) ​ # 使用extend把两个列表进行合并操作 list1 = ["罗翔","梦梦"] people_list.extend(list1) # 如果要添加的数据是一个列表的话 这些数据它会逐一添加 print([people_list]) ​ # 特殊的情况 假如插入的是一个字符串 # 估计就是专门给列表准备的 适合处理一些序列的数据 要是字符的话 它也会看作是序列的数据 # 比如 ”python“ 它假如插入进去就是逐一添加”p“ ”y“ ~~~~ 就是很麻烦 所以最好不要对字符串进行这样的操作 出来问题别找我 ​ # 在指定的位置插入数据 long_list = ['泷泷','梦梦'] long_list.insert(1,"泷宝") long_list.insert(2,"梦宝") print(long_list) ​ print("以下操作是删除数据") #删除列表中的某个元素  name_list = ['Tom','Jerry','longlong'] del name_list[2] #del 函数 后面跟上列表索引下标就行 print(name_list) ​ list1 = ['吕布','貂蝉','大乔'] # list1.pop() pop函数默认会删除列表中的最后一个元素 也可以配合数字索引下标 ​ #remove 你如果知道要删除元素的值 你可以通过删除“泷泷”这种值的元素直接删除 ​ #清空列表 name_list.clear() #清空所有元素的值 返回一个空列表 ​ print("以下操作是修改数据") ​ #第一种 你可以通过 列表[索引] = 修改后的值 ​ #reverse 可以对列表中的数据进行倒叙排序 简单来说就是 泷泷 梦梦 张三 最后通过函数的改变 直接变成了 张三 梦梦 泷泷 #也可以用其它的操作来改变列表中元素的排列 print(list1[::-1]) ​ #使用sort函数对数据进行排序(针对数值居多) #sort 从小到大 sort(reverse=True) 从小到大 ​ ​ #列表的嵌套 biglsit = [['泷泷','梦梦'],['张三','罗翔'],['泷宝','梦宝']] print(biglsit[2][1],"kiss kiss") #里三层外三层 逻辑来理清楚 #元组 #存储只有一个元素的元组 t1 = (1,) # 记住这里一定要用括号括起来 这是元组的标识 单个元素后面也要跟上一个 ',' 这样计算机就不会认偏 #多元素的元组照着打就行 元组内的数据一旦定义就不能修改  #元组中的数据也可以通过使用count len 一些操作来对其中的数据进行使用  ​ #元组内的数据直接修改会出错 但是元组中要是有列表的元素 那你就可以对列表中的元素进行修改 (记住这个是列表中元素 而不是列表本身) ​ # 比如(10,20,['aa','bb','cc'],50,30) ​ # 你可以 tuple2[2][0]='qqqq' 这样都可以 绝对不会报错 不能直接修改元组内的数据 但是有些特性 可以修改 ​ # 比较重要的一个章节 字典 ​ # 为什么需要字典 这就跟PHP中的name=>Jerry 一样的 比较适合键值对形式对数据进行存储 ​ #字典的实际使用 索引可以是字符串类型的也可以是数值类型的 ​ #有数据的字典 dict1 = {'name':"Tom",'age':'20','sex':'男'} #空字典 dict2 = {} ​ dict3 = dict() #这两种都可以创建空字典  ​ #字典的增加操作 字典中key的值是唯一的 不能重复 person = {} person['name']="赵云" person["age"]=19 print(person) person["name"]="泷泷" print(person) ​ str_dict={} str1 = 'aassddeewwwffffooossss' for i in str1 : #使用遍历字符串中的元素    if i in str_dict :  #找一下这个元素是否在字典中     str_dict[i]+=1  #在的话就+=1 就是记录个数   else :     str_dict[i]=1   #没有的话就赋初值 记住一定要是1 否则你的元素的个数每个都会少个数字 print(str_dict) ​ #字典的操作 [key] = value #字典中没有这个key表示的就是新增操作 #字典中存在这个key表示的就是更新操作 很好理解 也是比较实用的 ​ # 字典的删除操作 其实跟列表差不多 del person['gender'] 就可以 因为字典是键值对形式的 所以索引能包容字符这种的 不像列表一样 只能使用数字索引下标 # person['address'] = '东土大唐' 这样就可以该改变其中的值 ​ ​ #字典的查找操作 cat = {'name':"Tom",'age':5,'address':"美国纽约"} name = cat.get("name","你要查询的key不存在") # 使用get 可以获取字典中某个key的value值 get有第二个参数 可以自己输入未查找到返回值  print("cat的名字是:",name) ​ ​ #使用keys获取字典中所有的key print("cat的所有key的值为:",cat.keys()) ​ #values() 获取所有的value值并返回一个列表 ​ ​ #items 元组和列表的配合 [(),(),()] 最外面是个列表 不过里面的每个都是元组 for key,value in cat.items() :  #返回的是键值对形式的值   print(f"{key}:{value}")   #相当于php数组中的元素 $a as $b 不过python中的有带奇葩 相较于php来说 python是反着来的 完全不按套路出牌 #技巧 pass 执行到有pass的语句的时候直接跳过 ​ ​ #append 在列表的后面追加数据 ​ #学生管理系统 import time students = [{"name":"Tom","age":5,"address":"NewYork"},{"name":"Jerry","age":3,"address":"NewYork"}] while True:   print()   print("*"*25)   print("你好这是泷泷的学生管理系统:")   print()   print("[1]添加学生信息")   print("[2]删除学生的信息")   print("[3]查询所有学生的信息")   print("[5]退出系统")   print("*"*25)   print()   operation = int(input("请输入你要操作的,泷泷将会帮你:"))   if operation == 1 :     student = {}     name=input("请输入学生姓名:")     age=input("请输入学生的年龄:")     address=input("请输入学生的家庭住址:")     student["name"]=name       student["age"]=age     student["address"]=address       students.append(student)     print("你好,泷泷已经帮你添加完毕!")     continue   elif operation == 2 :     name=input("请输入要删除的学生的名字:")     for name in students :       students.remove(name)       print("删除完毕!")       break     else :       print("不好意思没有找到该学生的信息")     continue   elif operation == 3 :     for i in students :       print(i)     else :       print("所有学生的信息输出完毕!")     continue   elif ( operation!=1 and operation!=2 and operation!=3 ) or operation == 5 :     print("本系统检测到你输入了错误的操作,或者输入了[5]退出系统,将在5秒后退出系统!")     time.sleep(5)     break    print("*"*25) print("欢迎下次再找泷泷来帮忙,泷泷这里每时每刻都欢迎你,嘿嘿!") print("*"*25) ​ ​ # 其实还可以升级 我太懒了 懒得写 嘿嘿 # 集合 : 集合和字典的括号是一样的 { } 但是需要注意的是集合是 {1,2,3,4,5,6} 这样一类的形式 字典是{"name":"泷泷"} 这样一类 于是乎在某种情况下 不能随定义空集合 ​ # 我们可以使用函数去完成这一操作 # 创造集合使用 {} 但是不能这样直接的定义空集合 我们一般用到 set() 这个是专门用于空集合定义的 因为{} 是用来创建空字典的 set1 = {10,20,30,40,50,20,30,20} print(set1,end="\t") #集合天生去重而且输出无序 print() ​ #集合的增加操作 ​ #集合中添加单一元素 add set2 = set() #可以这样定义空集合 set2.add("张三") print(set2) ​ #集合中添加序列类型的数据(比如说 字符串 列表 元组 字典) update ​ student = set() list2 = ['泷泷','梦梦','泷宝','梦宝'] student.update(list2)  print(student) ​ #注意这里字符串的添加还是用add比较好原因嘛 很简单 因为它增加的是单一元素 如果用update传输字符串类型的话 字符串中的每一个单一的字符会被分开逐一添加到数据的后面 ​ #集合的删除操作 # 首先登场的是我们的老朋友 remove 不多解释 #discard 删除集合中的指定数据 如果数据不存在也不会报错 简称懒得一批 上面的老朋友都会报错 这个一声不吭 真他妈现实 # pop 懒散之王 使用pop方法是随机删除某个元素 删除什么不知道 删他妈的就完事了 print("集合中的交集,并集,差集") #具体的实例大概可以这么说 比如说 qq群里面 你和谁谁谁有几个共同好友 基本上这就是集合中 交集在语言的运用 ​ st1 = {"小红","小明","小强",} st2 = {"小刚","小明","小夏"} print("交集为:",st1 & st2) print("并集为:",st1 | st2) print("差集为:",st1 - st2) ​ #重点强调下差集的不同 哪个在前面 就会把后者没有的给输出出来 经此而已 无所吊谓 # python中的奇葩方法 enumerate 简单来说就是把字符串、列表、元组转换成key:value的键值对结构 list1 = [10,20,30,40,50] for key,value in enumerate(list1) :   print(f"{key}:{value}") #这个键值对形式还是蛮厉害的  #items 元组和列表的配合 [(),(),()] 最外面是个列表 不过里面的每个都是元组 items也可以达到类似的效果   ​ #推导式 比较牛逼的写法 list1 = [i for i in range(10)] #for 前面的i 是每次需要返回的值 list2 = [i for i in range(10) if i%2==0]  #最前面的是返回的值 print(list2) list3 = [(i,j) for i in range(1,3) for j in range(0,3)] print(list3) # 总结 这种[结果 + 推导结果] 输出的是结果 推导结果前面是什么样的 最后就会是什么样的结果 ​ #字典推导式 #把两个序列合并在一起 [key:value + 推导过程] #list1 = ["name","age","gender"] #list2 = ["Tom",20,:male] #person ={list1[i]:list2[i] for i in range(3)} 最后输出 person的结果即可 ​ #提取字典中的目标数据 counts = {'BMP':286,"HP":125,"DELL":201,"Lenovo":199,"ACER":99} counts = {key:value for key,value in counts.items() if value>200} #用到了上面的读取函数 把所有读取到的数据转换成键值对的形式 print(counts) #python函数的使用 # 基本上是 跟C语言差不多 只是换了个头 def 函数() 大致是这个逻辑 函数中可以传参 可以干一些事 对于集成化很有帮助  #return 返回值 ​ #重点 在python中函数需要先定义再使用 ​ def return_num():   return (1,2) #python 函数理论上只能返回一个值 但是我们可以借助元组同时返回多个结果 当然你输出出来也是元组 也不能返回两个return 不过你可以把这些在一排返回回来 ​ #如果一个函数没有返回值 那这个函数 会默认返回一个 None 就是本来事要返回一个值 return 返回的 可是 它没有return 转而输出了一个print 语句 ​ ​ #函数内部可以用 三引号的形式 类似于 Java中的 /** 可以使用这个来描述注解 def max_num(num1,num2,num3):   """  max_nummax_num: 这个函数主要用于求出三个数的最大值    num1 (_type_): 数字1    num2 (_type_): 数字2    num3 (_type_): 数字3  """   list_ = [num1,num2,num3]   return max(list_) max_num=max_num(1,2,3) print(max_num) ​ ​ # python中全局变量的声明 可以尝试在函数中使用 global 将函数中的局部变量 声明成 全局变量 ​ ​ # 关键字参数(python 中特有)  ​ def user_info(name,age,address):   print(f"我的名字{name},今年{age}岁了,家在{address}")    user_info(name="Tom",age=23,address="美国纽约") # 原来直接传参数 要形参和实参一一对应 一个个都不能打乱 # 把这种值放在变量内这种的形式你就可以随便传递实参 反正都是变量 让他们自己去找就行了 ​ #可以在形参的位置设置一个默认值 要i是没有传递这个参数就是默认值 要是传递了这个参数就是实参的值 ​ #传参数 懒惰写法  # def user_info(*args) : # *号后面的名字可以随意改动 这个带星号的 可以无限接受参数 就是能接受很多个参数 没有你想不到只有它传不到    # print()     # def user_info(**args) : # 两个星号接受的是字典类型的类型的值 键值对形式的值 ​ ​ ​ # 偷懒参数 def func(*args,**kwargs) : #       print(args) #       print(kwargs) #func(10,20,30,num1=40,num2=50) #可以一次性混合传递 既能接受元组类型的数据,也可以接受字典类型的数据 #就是可以混合的传递参数 你想咋传就咋传 ​ ​ #也可以先定义再传递值 也就是 dict=[1,2,3] # fun(*dict) 这样的也是可以的  ​ ​ # a,b =(b,a) 括号可写可不写 右边的值也可以是一个列表或者说字典 ​ ​ #重点 字典的拆包会不同 #字典拆包 # dict1 = ["name":"小明","age":18] # a,b=dict1 这样读取输出 print(a) 只会输出键值对形式的 想要获取value的值 你要print(dict1[a]) 才能读取到字典中的value值 ​ # pass 简单来说 就是伤害面板的python # python 基础加强 list1 = [] #先定义一个空列表 for i in range(5): #循环5次 因为是个二维列表   list2 = [] # 定义另一个空列表   for j in range(5): # 循环5次因为每个列表中有5个元素     list2.append(i*j) #依次往后追加元素   list1.append(list2) #将一个列表当成元素追加到另外一个列表中 print(list1) #最后输出列表 ​ #推导式写法 list1 = [[i*j for j in range(5)] for i in range(5)] ​ ​ # 将列表中每个元素的都增加100 list3 = [1,2,3,4,5,6,7,8,9] list4 = [] for h in list3 :   list4.append(h+100) print(list4) ​ #推导式写法 # list3 = [1,2,3,4,5,6,7,8,9] # list4 = [h+100 for h in list3] #print(list4) ​ list5 = ['A','B','C'] list6 = ['X','Y','Z'] list7 = [] for t in list5 :   for k in list6 :     list7.append(t+k) print(list7) ​ # 推导式写法  # list5 = ['A','B','C'] # list6 = ['X','Y','Z'] # list7 = [t+k for t in list5 for k in list6] 测试 完美实现 ​ ​ # 你想在程序中 输出50% 想输出后面的% 号 ​ ​ # 重点 在字典中 key如果是数字类型 你比如说前面的是1 后面的是1.0 他们在字典中就是同一个key 千万不要这么写 数据的值会被改变的 ​ ​ # id print(id(a)) 显示内存地址 a = 10 b=a 这时候a b 指向的是同一个地址 要是这时候 a = 100 此时a 和 b 共有的地址 a 原来的就会直接赋予给 b 简单来说就是a原来的东西 直接送给b了 # 相当于a和b 两人一起筹钱买了个手机 后面a 又得到了100块 刚好够买一部新的手机 a就说 原来的手机(地址)送你了 我去用新手机(新地址)去了 简单粗暴的理解 ​ ​ #可变类型与非可变类型解释 # 简单来说就是 a = [1,2,3] 然后你a[2]=4 一旦定义之后 只要你不增加或者减少它的长度一般来说就是原来的地址 要是你一旦改了它的长度 它就不是原来的东西了 ​ #通俗的讲的话就是 你们学校的督导来检查你班级的学生人数 你们班是45人 你督导查人肯定是看人数够不够 谁会看你里面都是什么人 只要人数是齐的就行 这是前者“可变类型” 、 #”非可变类型“就是 你督导过来差人了 发现人数多了 它就会认为你是一个新的班级 要给你打上个新的标签(地址) 所以一一旦定义之后 你该内部的值 不会改变其值(地址) 但是一但让两人同时使用一个名字(地址) 或者添加长度 或者删除长度 它就不是原来的它了所以地址会发生改变 ​ ​ # lambda 表达式 # 定义匿名函数 # 函数名(变量名) = lambda 参数(可能很多) : 表达式(返回的啥) fn1 = lambda a,b,c=100 : a+b+c #可以有默认值、 # 可以不定长传参 也可以定长传参 print(fn1(10,20)) print(fn1(10,20,30)) # 三目运算符 很简单 if 和else 为真则前面 为假则后面 fn2 = lambda a,b : a if a>b else b print(fn2(12,7)) ​ # 字典排序  #students.sort(key=lambda x :x['name'] reverse=True) sort 简单来说就是将列表中的三个字典通过遍历的方式取出 # x 就是每个字典 key = kambda x 这句话是读取键值 :x["name"] 后面这个才是真正排序的条件 # reverse=True 降序排序 要是不写默认就是升序排序 ​ ​ # 文件的基本操作 三步骤 1.打开文件 2.读写文件 3.关闭文件 第二步看情况 你可以不读写文件都行 ​ #open() 打开函数 #open(name,mode) 前者文件名 后者权限 # 只读权限 "r" readonly # 写入权限 "w" write(只写权限)  # 追加权限 "a" append 代表在文件的尾部追加内容 ​ # w 和 a :如果文件不存在就创建文件 ###如果文件存在 w就是先清空再写入 a,是直接在末尾追加 ​ # 打开文件 f = open("Python.txt","r",encoding="utf-8") # 你可以访问文件 不过你只有读取的权限              #代表以utf-8的编码格式读取文件 # 文件写入 # f.write("Hello world") content = f.read() #括号里面的参数可以写成 读取数据的长度 把文件里面的内容给到content 这个变量 #关闭文件 print(content) #打印文件内容  f.close() #关闭文件 ​ # readlines()方法  ​ ​ ​ # 文件路径 1.绝对路径 2.相对路径 # 绝对路径 : C:\Python\python.txt 弊端:一旦固定了 文件不能随时移动 迁移会比较麻烦 # 相对路径 不用从盘符开始 参考对象是当前文件 所以你直接创建python.txt 会在同级看到 ​ ​ # mode 就是文件的读取权限  # 简单的说一下 r 只读权限 但是r+ 会不一样 会有 读写的权限 + 就是赋予读取的权限 # f.write("Hello world") 文件写入就用它就行 ​ # f.readline() 读取文件的第一行 然后会把指针向下移动 全部输出 这个很重要 可以读取excel 或者word 或者记事本类型的文档 # 还是蛮好玩的 创造性很高 但要学会合理的使用  # 结合 for i in f.readlines() print(i) 就可以把每行的内容独行显示出来 ​ ​ # 移动光标 f.seek(offset[开始的偏移量 就是从什么位置开始读],whence[表示从哪个位置开始 0是从头开始 1代表从当前位置开始]) # 看的话先看后面 在文件开头和文件中间的位置 偏移量就是当前位置向后偏移 但是你的文件假如是从末尾开始 它就是向前偏移 ​ # 文件备份 #while True : # content = old_f.read(1024) 读取的大小 一次读取太多文件计算机容易卡死 # if len(content) == 0: 当读取的为空时 就是文件读完了 #   break  # new_f.write(content) #写入操作 #记得最后把两个文件都给关了 占用内存 #old_f.close() #new_f.close() # 文件和文件夹操作 ​ # os模块 # os.函数名() # os.rename(你现在文件的文件名,新的文件名) # os.remove(你要删除的文件名) ​ #os.mkdir(新文件夹名称) #os.fetcwd() 获取当前的目录名称 有带像Linux里面的pwd #os.chdir(切换后的目录名称) 切换目录 你可以当作是 linux的cd命令 #os.listdir(目标目录) 获取指定文件下面的文件名称返回的是一个列表哦 可以看作是Linux里面的ls命令 #os.rmdir(目标目录) 删除一个指定名称的文件夹 但是这个文件夹必须是空的 就是里面没有其他的东西(文件)的那种 ​ # shutil 模块  # shutil.rmtree("要删除的文件夹的路径") ​ #os模块是Python标准库中一个重要的模块,里面提供了对目录和文件的一般常用操作。而Python另外一个标准库——shutil库, # 它作为os模块的补充,提供了复制、移动、删除、压缩、解压等操作,这些 os 模块中一般是没有提供的。但是需要注意的是:shutil # 模块对压缩包的处理是调用 ZipFile 和 TarFile这两个模块来进行的。 ​ ​ 简单来说就是 os是个基础的模块 shutil 它的模块化比较强  一个用于基础 一个用于补充 # python中的异常 # 异常 描述 # BaseException 所有异常的基类 # SystemExit 解释器请求退出 # KeyboardInterrupt 用户中断执行(通常是输入^C) # Exception 常规错误的基类 # StopIteration 迭代器没有更多的值 # GeneratorExit 生成器(generator)发生异常来通知退出 # StandardError 所有的内建标准异常的基类 # ArithmeticError 所有数值计算错误的基类 # FloatingPointError 浮点计算错误 # OverflowError 数值运算超出最大限制 # ZeroDivisionError 除(或取模)零 (所有数据类型) # AssertionError 断言语句失败 # AttributeError 对象没有这个属性 # EOFError 没有内建输入,到达EOF 标记 # EnvironmentError 操作系统错误的基类 # IOError 输入/输出操作失败 # OSError 操作系统错误 # WindowsError 系统调用失败 # ImportError 导入模块/对象失败 # LookupError 无效数据查询的基类 # IndexError 序列中没有此索引(index) # KeyError 映射中没有这个键 # MemoryError 内存溢出错误(对于Python 解释器不是致命的) # NameError 未声明/初始化对象 (没有属性) # UnboundLocalError 访问未初始化的本地变量 # ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象 # RuntimeError 一般的运行时错误 # NotImplementedError 尚未实现的方法 # SyntaxError Python 语法错误 # IndentationError 缩进错误 # TabError Tab 和空格混用 # SystemError 一般的解释器系统错误 # TypeError 对类型无效的操作 # ValueError 传入无效的参数 # UnicodeError Unicode 相关的错误 # UnicodeDecodeError Unicode 解码时的错误 # UnicodeEncodeError Unicode 编码时错误 # UnicodeTranslateError Unicode 转换时错误 # Warning 警告的基类 # DeprecationWarning 关于被弃用的特征的警告 # FutureWarning 关于构造将来语义会有改变的警告 # OverflowWarning 旧的关于自动提升为长整型(long)的警告 # PendingDeprecationWarning 关于特性将会被废弃的警告 # RuntimeWarning 可疑的运行时行为(runtime behavior)的警告 # SyntaxWarning 可疑的语法的警告 # UserWarning 用户代码生成的警告 ​ ​ ​ #不想错误后面的代码被终止 也不希望终端提示相关的错误 #可以使用异常捕获 ​ #很好的一个规避错误(可能会出错) ​ #try: # f = open("python.txt","r") # print(f,read()) # f.close() #except: # f = open("python.txt","w") # f.close() ​ #先执行代码 try下面的代码如果说执行报错的话 就执行 except后面的语句 就是凡是都留个后门 有句古话:留的青山在不怕没柴烧 (好像窜台了) ​ # 牛逼的写法 同时捕获多个错误 # try: # print(8/0) # f = open("python.txt","r") # except (ZeroDivisionError [除(或取模)零 (所有数据类型)], ArithmeticError[所有数值计算错误的基类]) : # 凡是这个括号里面写的一些东西 计算机如果察觉到这些东西出错 它会直接制止错误 简称自动拦截 ​ #终极无敌牛逼的捕获 #try: # print(8/0) #except Exception as e : #Exception 使用异常类来捕获所有的异常 这个类定义别名 e #   print("捕获所有的异常") 或者print(e) ​ # 后面加上else 表示如果没有异常要执行的代码 ​ # 加上finally 表示无论有咩有异常都要执行的代码 比如关闭文件 关闭数据库的链接等 ​ # raise 抛出自定义异常 # number = 6 # if number <= 7 : #  raise Exception("number小于7") #再也不是if 里面加上个print这种了 而是 直接系统出错 当然这个是用户自己定义的让他出错 # python中模块和包的概念\ # 模块: 内置模块和自定义模块 # 模块的导入方式 import 模块名 # from 模块名 import 功能名 # from 模块名 import* # import 模块名 as 别名 # from 模块名 import 功能名 as 别名 ​ # from math import * 一次性导入所有 # from math import sqrt,floor 导入其中的几个 不全部导入进去(前者占用空间 ) ​ # 导入模块定义别名 简单来说就是改个名字  #比如 import time as s s.sleep() 这样就可以使用时间函数 当然 使用大驼峰命名法比较好 也可以同时导入多个函数 多个语句 ​ # 自定义模块 你创建一个.py结尾的文件 这个文件最好能完成一些任务 你在另一个文件夹使用的时候就可以直接 import 刚刚的那个文件夹 就可以把那个文件当个一个模块 这就是自定义模块 你可以直接导入 能达成一定的效果 \ #不过 你想要自定义模块所能完成的任务更多 功能更加齐全的话 你就要写多点 写的更加的完整点 import longlong # 导入自定义模块 完成任务 print(longlong.sum_num(12, 23)) ​ """ 我在longlong.py 文件中 输出了一句print(__name__) 果是在这个longlong.py文件中运行的话 只会输出__main__ 但我要是在main里导入这个文件 使用这个文件中的东西 这个__name__ 就会实时输出 __main__ 这个引用的文件名 就是我能知道我引用了什么文件 名字是什么 """ ​ ​ ​ ​ def sum_num(num1,num2):   return num1+num2 #print(__name__) ​ #在模块文件中测试 单纯的在本页面测试程序有没有问题 在其他文件中引用文件的话 __name__ 就是文件名 不是__main__就不会触发底下这句子 nice if __name__ == '__main__' :   print(sum_num(12, 23)) ​   #多模块导入会出现一点小问题 要是多个模块中有同一个方法的话 你 from 模块名 import* 找谁?   # 还有就是 你自定义文件的模块名 假如跟系统的重名的话 你import 导入进来的就是你自己的模块 那你还玩个得 ​ """ 怎么知道你应用了什么文件 比如我创建了一个random文件 系统也有这样一个文件 如何查看到底引用了啥 你可以输入 print(random.__file__) print(random.randint(0,100)) 你就可以知道它到底是引用了你创建的文件 还是这个pycharm 自带的文件 """ ​ """ 魔术变量 __all__ 导入时这能导入这个模块列表中的元素 __all__ = ['func1'] 这样只会导入func1 def func1():  print("我是func1方法")    def func2():  print("我是func2方法") """ ​ ​ """ 在项目代码中导入包package !!!使用import导入 import 包名.模块名 # 不过使用起来就会多写一点 包名.模块名.方法名() !!!使用from导入包 # 模块的方法就会简单很多 模块名.方法名 """ """ python 继承关系 ​ class B(object):  def show(self):    print("这是B类中的show方法") class A(B): #这里继承了B类的放法 B类是A类的父亲  pass ​ a = A a.show() ​ #这些就可以实现同步的输出 ​ #python中可以实现多个继承 简直不要太牛逼 class cat(Animal,cat_s) 可以同时继承两个 其实相当于同时有了两个父亲 哈哈哈 真的是绝 """ ​ """ 子类中你不想使用父类的方法 你可以直接重写方法 ​ #还得是super # super().__init__(self,brand,color,model) 你这样可以直接继承父类的方法和属性 这个是强制的 就是使用父类的东西 但是可以加上自己的东西 还是很不错的、    selt.batttery = battery """ ​ # 比较特殊的MRO 你可以通过类名.__mro__ 或者是类名.mro() 就可以获得类的层次结构 # 就是说你这个是继承谁的 这个继承的又是继承的谁的 它会把这一系列的都输出出来 ​ """ 类方法 你可以直接 @classmethod 这个可以告诉解释器这是个类方法 有对象的方法 对象的属性 但是类也可以拥有属性 所以可以直接 Tool.show_tool_count() 来直接调用这个类的属性 或者说这个类独有的方法 ​ ​ """ 私有属性和私有方法的方式其实很简单:在属性名和方法名前面加上两个下划线即可 “--” 私有方法不能直接访问 """ class Gril :   def __init__(self,name):     self.name = name     self.__age = 19 # 虽然私有属性不能直接访问 但是你可以直接设置公有方式来返回其值 简单来说 我不能让你直接接手这个属性 怕乱设置   #这里可以设置权限 让不满足条件的人止步 保证了数据的安全   #定义公有属性 用户可以直接在外部更改其值 要是发工资的话 用户可以自己去修改其值 这还得了 这样的公司请告诉我 我马上来这个公司面试   def get_age(self) :     return self.__age ​   def set_age(self,age):     self.__age = age ​ xiaomei = Gril("泷泷") xiaomei.set_age(19) #用户自己传值 自己的私有 print(xiaomei.name) print(xiaomei.get_age()) ​ # __私有方法 def __func1(self) : #       print # ~~~~~ 很多的私有方法 # def withdraw(self): #   self.__func1() ​ Python中的staticmethod是一个装饰器,用于将一个方法转换为静态方法。静态方法是不需要实例化类就可以调用的方法,它们与类有关联,但不依赖于类的实例。静态方法可以在类中使用,也可以在类的实例中使用。使用staticmethod装饰器可以将一个方法转换为静态方法,使其可以在类和类的实例中使用。 classmethod 是 Python 中的一种方法装饰器,用于修饰类方法。类方法的第一个参数是类本身,而不是实例,因此可以通过类而不是实例来调用类方法。类方法常用于定义类级别的操作,如工厂方法。 语法:

python笔记 (学习系列第二篇笔记 这篇会比较长)的评论 (共 条)

分享到微博请遵守国家法律