成都双流 网站建设江苏盐城有做淘宝网站的吗

当前位置: 首页 > news >正文

成都双流 网站建设,江苏盐城有做淘宝网站的吗,软件开发设计文档,网站怎么做必须交钱吗面向过程Python简介Python和Java的解释方式对比Java#xff1a;源代码 - 编译成class - Jvm解释运行Python#xff1a;源代码 - Python解释器解释运行我经常和身边的Java开发者开玩笑说#xff1a;“Java真变态#xff0c;别的语言都是要么直接编译要么直接解释…面向过程Python简介Python和Java的解释方式对比Java源代码 - 编译成class - Jvm解释运行Python源代码 - Python解释器解释运行我经常和身边的Java开发者开玩笑说“Java真变态别的语言都是要么直接编译要么直接解释Java太另类了又编译又解释的……”直接解释和编译后解释其实最大的区别就是源代码的安全性。如果是直接解释源代码那么源代码没有安全性可言也就是任何一个人都可以打开源代码一看究竟任何人都可以随意修改源代码。事实上Python和Java的解释方式是相同的只是我们表面上看Python是直接解释源代码而实际上python解释器只会加载字节码。细心的小伙伴肯定发现了这一点当我们import某个模块时总是会在模块所在的目录创建一个pycache目录里面存放着被加载模块的字节码文件。编译源代码有以下作用源代码保护算法保护/ 防止用户篡改源代码解释器加载代码速度加快安装好py之后会有几个文件如下IDLE是py自带的一种简单的开发环境Python版本号这个是python的交互式命令行程序Python版本号 Manuals是官方技术文档APIPython版本号Module Docs是已安装模块的文档Python输出open(可以指定文件将数据输出到对应文件中,a)a是以读写的方式创建如果文件不存在的话就创建存在的话就在文件后面追加fpopen(D/text.txt,a)print(helloworld,filefp)fp.close转移字符什么是转义字符就是反斜杠想要实现转移功能的首字母当字符串中包含反斜杠、单引号和双引号等有特殊用途的字符时必须使用反斜杠对这些字符进行转移反斜杠\ \ 这里都用空格隔开了不然中间会转移单引号\ 可以适用于单引号里面加单引号双引号: \ 换行:\n回车\r 退一个格\b hello\bworld 输出hellworld水平制表符\t一个制表符占位置4个字符hello\t这样占3个因为hell算1个制表符0算一个剩下3个字符算一个制表符退格\b 原字符不希望字符串中的转义字符起作用就用元字符就是在字符串前面加上r或R如print(rhello\nworld) 中间不能有空格否则报错注意最后一个字符不能写一个反斜线 \ 能写两个print(rhelloWorld\ ) 错误这里为了demo写了两个\才显示一个\Python基本类型关键字importkeywordpring(keyword.kwlist)变量的定义name哈哈哈哈哈print(标识,id(name))print(类型,type(name))print(值,name)输出标识 2717730201040 内存地址,可以用id()输出内存地址也就是标识类型 class str值 哈哈哈哈哈十进制–默认的进制八进制–以0b开头二进制–以0o开头、十六进制–0x开头浮点数进行浮点数计算的时候会因为二进制的底层问题导致不精确我们要小心不用深究解决方案导入模块decimal#3.4000000000000004print(1.22.2) #导入Decimal之后 输出3.4fromdecimalimportDecimalprint(1.22.2) #3.4布尔型true表示1false表示0字符串单引号双引号 三引号 , -无论单双都是String类型#单双引号换行自动会加 \ 否则报错三引号不用加这是唯一区别str1哈哈 \ 哈哈哈str2哈哈 \ 哈哈str3哈哈哈哈哈 数据类型转换str()将其它数据类型转换为字符串int()将其它数据类型转换为整数文字类和小数类字符串-小数串是无法转换为字符串无法转换为整数浮点数转换为整数抹零取整float()将其他数据类型转换为浮点数文字类无法转换为整数整数类转成浮点数末尾为.0Python中的注释和输入注释在代码中代码的功能进行说明提升代码的可读性注释分为三种类型的注释单行注释以#开头直到换行结束多行注释并没有单独的多行注释标准将一到三引号之间的代码称为多行注释afdafdagdagd中文编码声明注释在文件的开头加上中文声明注释用来指定文件的编码格式如 #coding:gbkjava中单行注释 为 // 多行注释为 /** /input它的类型是一个String类型 可以将输出的内容直接转换aint(input( 请输入一个加数))presentinput(随便输入)print(present,type(present))输出随便输入aa class str运算符//表示整除运算11%25整除注意一正一负向下取整9//-4-322表示2的2次方%取模一正一负的余数被除数-除数商9%-49-(-4)(-3)-3赋值运算符从右到左执行a,b,c20,30,40分别给abc赋值abc20表示ab进行交换a,bb,a比较运算符一个是赋值称为比较运算符比较对象用的是 is / is not说明它们的标识id是否相同布尔运算符and两个都为true的时候才为trueor只有只有一个为true即为truenot运算数为true结果为false运算为false结果为truein 和 not instrhelloworldprint(w in str) #trueprint(w not in str) #falseprint(z in str) #falseprint(z not in str) #true位运算符位与 : 对应数位都是1结果才是1否则为0底层转换为二进制每右边开始每一位进行比较4: 0 0 0 0 0 1 0 0 8: 0 0 0 0 1 0 0 0结:0 0 0 0 0 0 0 0位或|对应数位都是0结果数位才是0否则为1左移运算符 高位溢出舍弃低位补0向左移动一位相当于乘以2 左移一位 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 低位补0右移运算符 低位溢出舍弃高位补0相当于除以2 右移一位 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 –0 低位截断对象的布尔值print(bool(0.0))#falseprint(bool(None))#falseprint(bool())#falseprint(bool())#falseprint(bool([])) #空列表print(bool(list())) #空列表print(bool(()))#空元组print(bool(tuple()))#空元组print(bool({})) #空字典print(bool(dict())#空字典print(bool(set()))#空集合print(以上布尔值全为false其它对象的布尔值都为true)分支结构单分支结构money1000minusint(input(请输入金额))if moneyminus: money-minus print(money)双分支结构if 条件表达式: 条件执行体1else 条件执行体2多分支结构if 条件表达式1: 条件执行体1elif 条件表达式2 条件执行体2elif 条件表达式N:[else:] #这个[]中的内容是可写可不写的多分支else是可以省略的 条件执行体N1嵌套分支if 条件表达式: if 条件表达式: elif 条件表达式 else: else: if 条件表达式: else:条件表达式num_aint(input(请输入第一个整数))num_bint(input(请输入第二个整数))print(str(num_a),大于等于,str(num_b) if (num_anum_b) else str(num_a)小于str(numb))#这里注意整数和字符串想加是出错的#这里注意整数和字符串想加是出错的需要转换才能进行–java这里可以自动识别相加python不行输出请输入第一个整数3请输入第二个整数13 大于等于 1pass语句pass语句什么都不做只是一个占位符用在语法上需要占位的地方什么时候用先搭建语法结构没想好代码怎么写的时候写pass语法不报错哪些语句一起使用if语句的条件执行体for-in语句的循环体定义函数时的函数体if answery: passelse: pass内置函数range()range()函数用于生成一个整数序列创建range对象的三种方式range(stop)-创建一个[0,stop]之间的整数序列步长为1range(start,stop)-创建一个[start,stop)之间的整数序列步长为1range(start,stop,step)-创建一个[start,stop)之间的整数序列步长为step返回值是一个迭代器对象range类型的优点不管range对象表示的整数序列有多长所有range对象占用的内存空间都是相同的因为仅仅需要存储startstop和step只有当用到range对象时才会去计算序列中的相关元素in与not in判断整数序列中是否存在不存在指定的整数#第一种创建方式rrange(10) #[0,1,2,3,4,5,6,7,8,9]默认从0开始默认相差1为步长print®#range(0,10)print(list®)#用于查看range对象中的整数序列 –list是列表的意思#第二种创建方式# [1, 2, 3, 4, 5, 6, 7, 8, 9]rrange(1,10)print(list®)#第三种创建方式#[1, 3, 5, 7, 9]rrange(1,10,2)print(list®)print(10 in r) # falseprint(10 not in r)# true循环结构循环的分类whilefor -in语法结构while 条件表达式条件执行体(循环体)if是判断一次条件为True执行一次while是判断N1次条件为True执行N次for-in循环in表达从字符串、序列等中依次取出又称遍历for-in遍历的对象必须是可迭代对象for-in的语法结构for 自定义的变量 in 可迭代对象循环体循环体内不需要访问自定义变量可以将自定义变量替代为下划线for item in Python: print(item) # 分别打印Python的各个字母for i in range(10): print(i) # 打印1-9的数字#如果在循环体中不需要使用自定义变量可以将其设置为,以下打印5次for _ in range(5): print(人生苦短我用python)sum 0 #用于存储偶数和for item in range(1,100): if item%2 0: sum itemprint(1-100之间的偶数和为,sum)水仙花数for item in range(100,1000): single item % 10 ten item // 10 % 10 hundred item // 100 if(hundred3ten3single*3item): print(item)java的这样输入//如153-java有明确的类型标注不用和py一样//取整int x a/100;//结果取整 分解出百位数 1int y a/10%10;//分解出十位数 5int z a%10;//个位数 3输出153370371407流程控制语句break经常和if一起用for item in range(3): pwd input(请输入密码) if pwd 888: print(success) break #执行成功跳出for循环 else: print(fail)continue用于结束当前循环进入下一次循环通常和if一起使用else语句与else语句配合使用的三种情况if…else: if条件不成立时执行elsewhile…else: 没有碰到break时执行elsefor…else: 没有碰到break时执行elsewhile…elsea 0while a 3: pwdinput(please input your password:) if pwd 123: print(密码正确) break else: print(密码错误)else: print(sorry三次均输入错误)打印矩形for i in range(1,4): for j in range(1,5): print(,end \t) #不换行输出 print()* * * * * * * * * * * * 九九乘法表for i in range(1,10): # 9行不包括10 for j in range (1,10): if(ji): print(str(j) * str(i) str(j*i),end\t) print()输出1 * 1 1
1 * 2 2 2 * 2 4
1 * 3 3 2 * 3 6 3 * 3 9
1 * 4 4 2 * 4 8 3 * 4 12 4 * 4 16
1 * 5 5 2 * 5 10 3 * 5 15 4 * 5 20 5 * 5 25
1 * 6 6 2 * 6 12 3 * 6 18 4 * 6 24 5 * 6 30 6 * 6 36
1 * 7 7 2 * 7 14 3 * 7 21 4 * 7 28 5 * 7 35 6 * 7 42 7 * 7 49
1 * 8 8 2 * 8 16 3 * 8 24 4 * 8 32 5 * 8 40 6 * 8 48 7 * 8 56 8 * 8 64
1 * 9 9 2 * 9 18 3 * 9 27 4 * 9 36 5 * 9 45 6 * 9 54 7 * 9 63 8 * 9 72 9 * 9 81 拓展python里的end是print函数中的参数为末尾end传递一个字符串这样print函数不会在字符串末尾添加一个换行符而是添加一个字符串其实这也是一个语法要求表示这个语句没结束。二重循环中的break和continue二重循环中的break和continue用于控制本层循环continue跳过本次循环体中剩下尚未执行的语句立即进行下一次的本循环条件判定可以理解为只是中止(跳过)本次循环接着开始下一次本循环的条件语句break:如果有两层for循环第二层循环中有if…break,跳出的是第二层for循环继续执行第一层的下一个条件语句列表为什么需要列表变量可以存储一个元素而列表是一个大容器可以存储N多个元素程序可以方便地对这些数据进行整体操作列表相当于其它语言中的数组变量存储的是一个对象的引用而列表存储的是多个对象的引用列表的创建用 [] 或者内置函数list()创建元素之间用分割列表元素按顺序有序培训索引映射唯一一个数据列表可以存储重复元素任意类型混存根据需要动态分配和回收内存和java不同的是从后往前采用的是负数索引比如第一个0的索引它同时也是负数最后一个索引java索引从0开始无负数如果列表中有多个元素只返回列表中相同元素第一个元素的索引在指定索引进行查找lst[hello,world,99,hello]print(lst.index(hello,1,3)) #1-3不包括3这里会报错找不到索引获取列表中的多个元素语法格式列表名[start : stop : step]切片的结果原列表片段的拷贝切片的范围[start,stop)step默认为1,简写为[stop,step] lst[10,20,30,40,50,60,70,80]print(原列表,id(lst))# 原列表 3184358125248lst2lst[1:6:1]print(切的片段:,id(lst2))# 切的片段: 3184361791744print(lst[1:6]) # 默认步长为1 [20, 30, 40, 50, 60]print(lst[1:6:])# [20, 30, 40, 50, 60]print(lst[1:6:2]) # [20, 40, 60]print(lst[:6:2]) # [10, 30, 50]print(lst[1::2]) # [20, 40, 60, 80]print(———-step步长为负数的情况—————–)print(lst[::-1]) # [80, 70, 60, 50, 40, 30, 20, 10] 相当于start7最后一个元素print(lst[6:0:-2])# [70, 50, 30]列表元素的判断及遍历for 迭代变量 in 列表名: 操作print(10 in lst) #Trueprint(10 not in lst) #False遍历for item in lst: print(item)列表元素的增删改操作增加append()在列表的末尾添加一个元素extend()在列表的末尾至少添加一个元素insert()在列表的任意位置添加一个元素切片在列表的任意位置添加至少一个元素id没变说明append是在同一个列表中添加元素每一个元素的id不同但这个列表的id不变lst[10,20,30]print(添加元素之前,lst,id(lst)) #添加元素之前 [10, 20, 30] 1732983054336lst.append(40)print(添加元素之后,lst,id(lst)) #添加元素之后 [10, 20, 30, 40] 1732983054336添加列表将lst2作为一个元素添加到lst1的末尾lst2[hello,world]lst.append(lst2)print(lst) #[10, 20, 30, 40, [hello, world]]用extend()添加列表lst2[hello,world]lst.extend(lst2)print(lst) # [10, 20, 30, 40, hello, world]在任意位置上添加一个元素lst [10,20,30]lst.insert(1,90)print(lst) #[10, 90, 20, 30, 40]切片lst.insert(1,90)print(lst) # [10, 20, 30, 40]lst3[True,False,hello] # [10, 90, 20, 30, 40]lst[1:]lst3print(lst) # [10, True, False, hello]列表元素的删除操作remove()一次删除一个元素重复元素只删除第一个元素不存在抛出ValueErrorpop() 删除一个指定索引位置上的元素指定索引不存在抛出IndexError不指定索引删除列表中最后一个元素切片一次至少删除一个元素clear()清空列表del删除列表lst[10,40,50,60]new_listlst[1:3]print(原列表,lst) # 原列表 [10, 40, 50, 60]print(切片后的列表,new_list) # 切片后的列表 [40, 50]#不产生原列表中的对象而是删除原列表中的内容lst[1:3][]print(lst) # [10, 60]del lstprint(lst) # name lst is not defined 既然删除了那么就没有定义列表元素的排序操作常见的两种方式调用sort()方法列表中所有元素默认按照从大到小顺序进行排序指定reverseTrue进行降序排序默认是False调用内置函数sorted()可以指定reverseTrue进行降序排序原列表不发生改变id不会变sort()是对原列表进行排序sorted()是对新列表进行排序列表生成式列表生成式简称 生成列表的公式语法格式[ i * i for i in range(1,10) ]i * i 表示列表元素的表达式自定义 for后面的 i 表示自定义变量range(1,10)表示可迭代对象lst[i for i in range(1,10)] #会产生一个1-9的整数序列所以用[]括起来这个列表中存的是产生的整数序列产生的整数序列是i所以在for之前加上iprint(lst) #[1, 2, 3, 4, 5, 6, 7, 8, 9] 字典字典是Python内置的数据结构之一class dict与列表一样是一个可变的序列进行增删改以键值对的方式存储数据字典是一个无序的序列第一个放进去不一定在第一个位置它底层会用hash计算键进行放入字典会浪费较大的内存是一种空间换时间的数据结构无序不可重复字典中的可以是不可变对象scores{张三: 100, 李四 : 98}根据key找value类似于java中的Map也都是无序不可重复 重复即覆盖字典的创建最常用的方式使用花括号scores{ 张三 : 100, 李四 : 98}使用内置函数dict()dict(name jack , age 20)取值与使用get()取值的区别[]如果字典中不存在指定的key抛出keyError异常get()方法取值如果字典中不存在指定的key并不会抛出KeyError而是返回None可以通过参数设置默认的value以便指定的key不存在时返回scores{张三: 100, 李四 : 98}scores.get(哈哈,99) #99是在查找哈哈不存在时候返回99key的判断in 指定的key在字典中存在返回Truenot in指定的key在字典中不存在时返回True字典的删除del scores[张三]字典的新增scores[jack]90 没有则新增有则value覆盖字典的清空clear获取字典视图的三个方法获取字典视图keys()获取字典中所有key类型class dict_keys也可以将其转换为列表listkeysvalues()获取字典中所有value类型class dict_valuesitems获取字典中所有的keyvalue对scores{张三:100,李四:98,王五:45}# 获取所有的keykeys scores.keys()print(keys) # dict_keys([张三, 李四, 王五])print(type(keys)) # class dict_keysprint(list(keys)) # [张三, 李四, 王五]# 获取所有valuevaluesscores.values()print(values) # dict_values([100, 98, 45])print(type(values)) # class dict_valuesprint(list(values)) # [100, 98, 45]# 获取所有的key-value对itemsscores.items()print(items) # dict_items([(张三, 100), (李四, 98), (王五, 45)])print(list(items)) # 这个小括号称为元祖[(张三, 100), (李四, 98), (王五, 45)]字典元素的遍历scores{张三:100,李四:98,王五:45} for item in scores: print(item,scores[item],scores.get(item)) # scpres.get()和scores[]都是根据key获取value输出张三 100 100李四 98 98王五 45 45字典生成式内置函数zip()用于将可迭代的对象作为参数将对象中对应的元素打包成一个元祖然后返回由这些元组组成的列表items[Fruits,Books,Others]prices[96,78,85]d {item : price for item,price in zip(items , prices)}print(d) # {Fruits: 96, Books: 78, Others: 85}# d {item.upper() : price for item,price in zip(items , prices)} item.upper()会全部变成大写元组python内置数据结构之一是一个不可变序列不可变序列与可变序列不可变序列字符串、元组没有增删改操作字符串、元组增删改内存地址发生改变java中的String同样也是不可变序列private final char value[]; // 不可变指的是内存地址不能修改可变序列列表、字典可以增删改对象地址不发生改变class tuple创建方式直接小括号t (Python , hello)也可以省略小括号t ‘Python’ , hello使用内置函数tuple()t tuple( (Python , hello) )注意只包含一个元组的元素需要使用逗号t (10 , )否则会被当成字符串空列表创建lst []lst1 list ()空字典d {}d2 dict ()空元组t4 ()t5 tuple()lst []lst2 list()d {}d2 dict()t ()t2 tuple()print(空列表, lst ,lst2)print(空字典, d,d2)print(空元组 , t, t2)输出空列表 [] []空字典 {} {}空元组 () ()注意元组中存储的是对象的引用如果元组中对象本身是不可变对象则不能再引用其它对象如果元组中的对象是可变对象则可变对象的引用不允许改变但数据可以改变t (10 ,[20,30],9)print(t)print(type(t)) # [20, 30]print(t[1]) # 元组是不能再修改新的地址t[1].append(100) #列表是可变序列是可以添加元素的但是id是不变的元组的遍历元组是可迭代对象所以可以用for in 遍历t (10 ,[20,30],9)for item in t: print(item)集合Python提供的内置数据结构与列表、字典一样都属于可变类型的序列集合{key}是没有value的字典-{key : value}不能重复重复即覆盖通过hash(dataA)哈希进行计算第一个放未必在第一个位置创建方式直接{} 和字典区别就是没有value使用内置函数set()集合的相关操作in 或者 not in调用add()方法一次添加一个元素调用update()方法至少添加一个元素 ,里面可以添加集合可以添加列表元组等集合元素的删除操作调用remove()方法一次删除一个指定元素如果指定元素不存在抛出KeyError调用discard()方法一次删除一个指定元素如果指定元素不存在不抛异常调用pop()方法一次只删除一个任意元素它是随机删除的调用clear()方法清空集合集合之间的关系两个集合是否相等可以使用运算符或!进行判断一个集合是否是另一个集合的子集可以调用方法issubset进行判断B是A的子集一个集合是否是另一个集合的超集可以调用方法issuperset进行判断A是B的子集两个集合是否没有子集可以调用方法isdisjoint进行判断 disjoin-adj不相交的v拆散s {10,20}s2 {20,10}s3 {10}print(ss2) #Trueprint(s.issubset(s2)) # Trueprint(s2.issubset(s)) # Trueprint(s.issubset(s3)) # Falseprint(s.issuperset(s3)) # Trueprint(s3.isdisjoint(s)) # Falsexxxxxxxxxx s {10,20}s2 {20,10}s3 {10}print(ss2) #Trueprint(s.issubset(s2)) # Trueprint(s2.issubset(s)) # Trueprint(s.issubset(s3)) # Falseprint(s.issuperset(s3)) # Trueprint(s3.isdisjoint(s)) # Falses {10,20}s2 {20,10}print(ss2) #True集合的数学操作交集A和B共有的 并集A和B所有元素加一起的差集s1.difference(s2)是求集合s1和s2的差集即求在s1中同时不在s2中的元素集合该方法的返回值是二者差集。对称差集s1.symmetric_difference(s2)是求集合s1和s2的对称差集即s1和s2的并集减去二者的交集该方法的返回值是二者的对称差集。集合生成式也就是用于生成集合的公式{i * i for i in range(1,10)}将{}改为[] 就是列表生成式没有元组生成式-不可变序列列表、字典、元组、集合总结字符串的创建和驻留机制在Python中字符串是基本数据类型 java中String是引用数据类型什么是字符串驻留机制仅保存一份相同且不可变字符串的方法不同的值被存放在字符串的驻留池中Python的驻留机制对相同的字符串只保留一份拷贝后续创建相同字符串时不会开辟新空间而是把该字符串的地址赋给新创建的变量(不会创建新的空间而是指向已经创建的空间)a Pythonb Pythonc Pythonprint(a,id(a)) # Python 1365644283120print(b,id(b)) # Python 1365644283120print(c,id©) # Python 1365644283120Java和Python中等于的区别Python中is用于判断两个变量引用对象是否为同一个,用于判断引用变量的值是否相等Java只有值传递所以对于来说不管是比较基本数据类型还是引用数据类型的变量其本质比较的都是值只是引用类型变量存的值是对象的地址。java中的equals()方法用来比较两个对象的内容是否相等public boolean equals(Object obj) { return (this obj);字符串的驻留机制驻留机制的几种情况交互模式-命令窗口字符串的长度为0或1时无论是标识符与否都驻留符合标识符的字符串字符串只在编译时驻留而非运行时[-5,256]之间的整数数字s s1 print(s is s1) # Trues2 %s3 %print(s2 is s3) # Trueprint(ab) # True aPythonprint(a is b) # True bPythond abc% # 非标识符 标识符字母数字下划线e abc%print(de) # Trueprint(d is e) # False 在PyCharm中运行时True要在交互模式a abcb ab c # b的值是在运行之前就已经连接完毕了c .join([ab,c]) # c是在程序运行的时候通过join方法连接的会开辟新的空间没有驻留print(type(a)) # class strprint(type(b)) # class strprint(type©) # class strprint(a is b) # Trueprint(a is c) # False# [-5 - 256]之间的数字也是驻留的a -5b -5print(a is b) # Truea -6b -6print(a is b) # False # 感觉两个内存地址这样太浪费空间了所以我们可以让它存储一个空间a abc%b abc%print(a is b) # Falseimport syssys.intern(a)print(a is b) # TruePyCharm对字符串进行了优化原本不驻留的PyCharm进行了驻留驻留机制的优缺点当需要值相同的字符串时可以直接从字符串池中来使用避免频繁的创建和销毁提升效率和节约内存因此拼接字符串和修改字符串是会比较影响性能的在需要进行字符串拼接时建议使用str类型的join方法而非因为join()方式是先计算出所有字符串的长度然后再拷贝只new一次效率比效率高由于字符串是不可变对象当使用“”连接字符串的时候每执行一次“”操作都会申请一块新的内存然后复制上一个“”操作的结果和本次操作的有操作符到这块内存空间中所以用“”连接字符串的时候会涉及内存申请和复制join在连接字符串的时候首先计算需要多大的内存存放结果然后一次性申请所需内存并将字符串复制过去。在用连接字符串时结果会生成新的对象而用join时只是将原列表中的元素拼接起来因此在连接字符串数组的时候会考虑优先使用join。字符串的常用操作字符串的查询操作的方法index():查找子串substr第一次出现的位置如果查找的字符串不存在抛出ValueErrorrindex():查找子串substr最后一次出现的位置如果查找的子串不存在抛出ValueErrorfind()查找子串substr第一次出现的位置不存在返回-1rfind()查找子串substr最后一次出现的位置如果查找的子串不存在返回-1rreserve v.n.adj都表示相反的、逆转、背面的意思建议用find方法不跑异常字符串的大小写转换操作的方法upper(): 把字符串所有字符都转成大写字母lower()把字符串中所有字符都转成小写字母swapcase()大小写转换大写变小写小写变大写capitalize()把第一个字符转换为大写其余转小写title第一个转大写每个单词首字母大写其余小写字符串内容对齐操作的方法center()居中对齐第一个参数指定宽度第二个参数指定填充符第二个参数是可选的默认是空格如果设置的宽度小于实际宽度则返回源字符串ljust()左对齐第一个参数指定宽度第二个参数指定填充符第二个参数是可选的默认是空格如果设置的宽度小于实际宽度则返回源字符串rjust()右对齐第一个参数指定宽度第二个参数指定填充符第二个参数是可选的默认是空格如果设置的宽度小于实际宽度则返回源字符串zfill()右对齐左边用0填充该方法只接受一个参数用于指定字符串的宽度如果指定的宽度小于等于字符串的长度返回字符串本身s hello,Pythonprint(s.center(20,*)) # *hello,Python*# 共指定20个字符减去原有12个居中对齐左右补充 print(s.ljust(20,)) # hello,Python*******print(s.rjust(20,)) # ******hello,Pythonprint(s.zfill(20)) # 00000000hello,Pythonprint(-666888.zfill(8)) # -0666888字符串的劈分split():从字符串左边开始劈分默认的劈分字符是空格字符串返回值的值是一个列表以通过参数sep指定劈分字符串是的劈分符通过参数maxsplit指定劈分字符串时的最大劈分次数在经过最大次劈分之后剩余的子串会单独作为一部分、rsplit()从字符串的右边开始劈分默认的劈分字符是空格字符串返回的值是一个列表以通过参数sep指定劈分字符串是的劈分符通过参数maxsplit指定劈分字符串时的最大劈分次数在经过最大劈分之后剩余的子串会单独作为一部分s hello world Pythonprint(s.split()) # [hello, world, Python]s1 hello|world|Pythonprint(s1.split(sep|)) # [hello, world, Python] 这是已经分割的print(s1.split(sep|,maxsplit1)) # [hello, world|Python]# rsplit同理判断字符串操作的方法isidentifier()判断指定的字符串是不是合法的标识符isspace()判断指定的字符串是否全部由空白字符组成(回车、换行、水平制表符)isalpha()判断指定字符是否全部由字母组成汉字也算unicode编码就会这样isdecimal()判断指定字符是否全部由十进制的数字组成isnumeric()判断指定的字符串是否全部由数字组成isalnum()判断指定字符串是否全部由字母和数字组成s hello,Pythonprint(1.,s.isidentifier()) # False 有 只要非数字字母下划线都非标识符print(2.,hello_123.isidentifier()) # Trueprint(3.,\t.isspace()) # Trueprint(4.,abc.isalpha()) # Trueprint(5.,张三.isalpha()) # Trueprint(6.,张三1.isalpha()) # Falseprint(7.,123四.isdecimal()) # Falseprint(8,123.isnumeric()) # Trueprint(9,123哈哈哈.isalnum()) # True字符串操作的其它方法字符串替换replace() 第一个参数指定被替换的子串第二个参数指定替换子串的字符串该方法返回替换后得到的字符串替换前的字符串不发生变化调用该方法时可通过第三个参数指定最大替换次字符串的合并join() 将字符串合并成一个字符串如果是字典则只连接key注意如果有数字什么的不能连接只能连接字符串s hello,Pythonprint(s.replace(Python,Java)) # hello,Javas1 hello,Python,Python,Pythonprint(s1.replace(Python,Java,2)) # hello,Java,Java,Pythonprint(|.join(lst)) # hello|Java|Pythonprint(.join(lst)) # helloJavaPythont (hello,Java)print(.join(t)) # helloJava字符串的比较操作运算符,,,,,!比较规则从第一个字符依次比较下去直到两个字符串中的字符不相等时其比较结果就是两个字符串的比较结果两个字符串中的所有后续将不再比较比较原理比较的是ordinal value(原始值)调用内置函数ord可以得到指定字符的ordinal value 与内置函数ord对应的是内置函数chr调用内置函数chr时可以指定oridnal value可以得到对应的字符字符串的切片操作字符串是不可变类型不具备增、删、改等操作切片操作都将产生新的对象和列[]列表一样[start,end,step]s[:5]它会从0开始且且到4不包含5s[6:]它会从6开始切刀最后s hello,Javas1 s[:5]print(s1)s2 s[6:] # helloprint(s2) # Javaa 666888print(a[::2]) #668格式化字符串为什么要格式化字符串因为很多相同操作占取空间大量重复操作比如:身份证号 现居家庭住址等等 格式化字符串的两种方式%作占位符%s表示字符串%i或%d表示整数%f表示浮点数{}作占位符%叫做定义的格式化字符串%是固定符号 (name,age)是实际值# %占位符name 张三age 20print(我叫%s,今年%d岁% (name,age)) # 我叫张三,今年20岁# {}格式化操作print(我叫{0},今年{1}岁.format(name,age) ) # 我叫张三,今年20岁# f-stringprint(f我叫{name},今年{age}岁) # 我叫张三,今年20岁# %10d10表示宽度print(%10d % 99) # 99# %f表示浮点数%.3是小数点后三位小数print(%.3f % 3.1415926)# %10.3f同时表示宽度和精度print(%10.3f % 3.1415926)#3.142 总宽度是10小数点后三位# 用{}形式也能注册 ,.3表示的一共是三位数print({0:.3}.format(3.1415926))# .3f表示3位小数print({0:.3f}.format(3.1415926))# 同时设置宽度# print({:10.3f}.format(3.1415926))为什么需要字符串的编码转换str在内存中以UNICODE表示将计算机中的内容传送到你的电脑上去这时候就需要字节进行传输这时候就需要将str转换成二进制数据传送到你的电脑上你的电脑再进行转换成str进行展示编码将字符串转换为二进制数据bytes解码将bytes类型的数据转换成字符串类型注意编码格式和解码格式要相同s 解码编码操作# 编码print(s.encode(encodingGBK)) # GBK这种编码格式中一个中文是二个字节print(s.encode(encodingUTF-8)) # UFT-8这种编码格式中一个中文是三个字节## 解码# byte代表就是一个二进制数据 字节类型的数据byte s.encode(encodingGBK) # 编码# print(byte.decode(encodingUTF-8 )) # 解码 报错用什么编码用什么解码byte s.encode(encodingUTF-8)print(byte.decode(encodingUTF-8)) # 解码编码操作输出b\xbd\xe2\xc2\xeb\xb1\xe0\xc2\xeb\xb2\xd9\xd7\xf7b\xe8\xa7\xa3\xe7\xa0\x81\xe7\xbc\x96\xe7\xa0\x81\xe6\x93\x8d\xe4\xbd\x9c解码编码操作函数什么是函数函数就是执行特定任务和以完成特定功能的一段代码为什么需要函数复用代码隐藏实现细节提高可维护性提高可读性便于调试函数的创建def 函数名 ([输入参数]) : 函数体[return xxx]函数名需要遵循字母、数字、下划线# 这里的ab是形式参数-形参形参的位置是在函数的定义处def calc(a,b): c ab return cprint(calc(10,50)) # 60 这里的10,50称为实际参数的值简称实参print(calc(b50,a10)) #左侧的变量名称为关键字参数自动找a和b定义函数取奇偶数def fun(num): odd [] # 存奇数 even [] # 存偶数 for i in num: if i%2: odd.append(i) else: even.append(i) return odd,evenlstfun([10,21,33,66,88,99])print(lst) # ([21, 33, 99], [10, 66, 88])如果函数没有返回值【函数执行完毕之后不需要给调用处提供数据】 return可以省略不写函数的返回值如果是1个直接返回类型函数的返回值如果是多个返回的结果为元组函数的参数定义函数定义默认值参数函数定义时给形式参数设置默认值只有与默认值不符的时候才需要传递实参def fun(a,b10) print(a,b)fun(100) #只传一个参数b采用默认值fun(20,30) #30将默认值10替换个数可变的位置参数定义参数时可能无法事先确定传递的位置实参的个数时使用可变的位置参数使用定义个数可变的位置形参只能定义一个def fun( args,*a):这样报错结果为一个元组def fun(*args): # 函数定义时的 可变的位置参数 print(args) fun(10)fun(10,30)fun(30,405,50)结果(10,) 注意元组有 逗号否则为字符串了(10, 30)(30, 405, 50)个数可变的关键字形参定义函数时无法事先先确定传递的关键字实参的个数时使用可变的关键字形参使用定义个数可变的关键字形参只能定义一个def fun(** args, a):这样报错结果为一个字典def fun1(args): print(args)fun1(a10) # {a: 10}fun1(a20,b30,c40) # {a: 20, b: 30, c: 40}print源码它是一个形式可变的位置参数所以print(这里写几个都没问题)def print(self, *args, sep , end\n, fileNone): 注意在一个函数定义过程中既有个数可变的关键字形参也有个数可变的位置形参要求个数可变的位置形参放在个数可变的关键字形参之前def fun(args1*arg2):在函数调用时的参数传递称为位置传参def fun(a,b,c): print(a,end\t) print(b,end\t) print(c,end\t)fun(10,20,30) # 10 20 30 函数调用时的参数传递称为位置传参lst [11,22,33]# fun(lst) #报错fun(*lst) # 11 22 33 在函数调用时将列表中的每个元素都转换为位置实参传入dic {a:111,b:222,c:333}# fun(dic) #报错fun(dic) # 111 222 333 在函数调用时将字段的键值对都转换为关键字实参传入# 个数可变的关键字传参def fun4(args): print(args)fun4(a666,b888) # {a: 666, b: 888}函数传参其它类型def fun5(a,b,,c,d): print(a) print(b) print© print(d)fun5(a10,b20,c30,d40) # 10 20 30 40# fun5(10,20,30,d40) # 错误 前两个参数采用的是位置实参传递cd只能采用关键字传递fun5(10,20,c30,d40) # 10 20 30 40# 这些也都是可以的def fun5(a,b,,c,d,args): print(args)fun5(1,3,c3,d4,e4) # {e: 4}def fun(*args,args2): passdef fun(*args,args2): passdef fun(a,b10,*args,**args2): pass变量的作用域程序代码能访问该变量的区域根据变量的有效范围可分为局部变量在函数内定义并使用的变量只在函数内部有效局部变量使用global声明这个变量就会成为全局变量全局变量在函数体外定义的变量可作用函数内外def fun(): global age # 声明global在外部也可以使用了 age20 print(age) # 20fun()print(age1) # 21递归函数什么是递归函数在函数体内调用了函数本身递归的组成部分递归调用与递归终止条件递归的调用过程每递归调用一次函数都会在栈内存分配的一个栈帧每执行完一次函数都会释放相应的空间递归的优缺点优点占用内存多效率低下缺点思路和代码简单斐波那契数列形如1 1 2 3 5 8..每一项都前两项之和# 斐波那契数列def fib(n): if n 1 or n 2: return 1 else: return fib(n-1)fib(n-2)print(fib(3)) # 2# 输出前四项数组for i in range(1,5): print(fib(i)) # 1 1 2 3Python的异常处理机制Bug的常见类型Python提供了异常处理机制可以在异常出现时即时捕获然后内部“消化”让程序继续运行多个except结构捕获异常的顺序按照先子类后父类的顺序为了避免遗漏可能出现的异常可以在最后增加BaseExceptiontry…except…else结构如果try块中没有抛出异常则执行else块如果try中抛出异常则执行except块try…except…else..finally结构finally块无论是否发生异常都会被执行能常用来释放try块中申请的资源案例1try: a int(input(请输入第一个整数)) b int(input(请输入第二个整数)) result a/b print(结果为,result)except ZeroDivisionError: print(对不起除数不能为0)except ValueError: print(只能输入数字串)print(程序结束)案例2try: a int(input(请输入第一个整数:)) b int(input(请输入第二个整数:)) result a/bexcept BaseException as e: print(出错了,e)else: print(计算结果为,result)finally: print(谢谢你的使用)Python中常见的异常ZeroDivisionError 除或取模零所有数据类型IndexError序列中没有此索引indexKeyError映射中没有这个键NameError未声明/初始化对象没有属性SyntaxErrorPython语法错误ValueError传入无效的参数traceback使用traceback模块打印异常信息import tracebacktry: a 1/0except: traceback.print_exc()输出这些日志信息放到日志文件里面还是有用的Traceback (most recent call last): File F:\pythonProject1\venv\test.py, line 3, in module a 1/0ZeroDivisionError: division by zero面向对象类和对象一切皆对象和java一样各编程语言一样的思想规范类名首字母大写和java一样创建的规范python3创建类的时候可以不带括号也可以带也可以显示继承object如果带个()空括号其实也是隐士的继承了object。这三种方式是相等的。class Student: pass类的组成类属性类中方法外被该类所有对象共享类方法classmethod修饰使用类名直接访问的方法静态方法staticmethod使用类名直接调用类属性、类方法、静态方法都是用类名直接调用实例方法# 创建的语法class Studnet: native_pace 吉林 # 类属性 # 初始化方法 这个self赋值时候不用写赋值name和age即可self默认带 def init(self,name,age): # 将局部变量的值赋值给实体属性self.name称为实例属性 self.name name self.age age # 实例方法 # self 为这个方法名name,age的为实例属性 def eat(self): # 这个self这里必写self单词可以变但程序员习惯self print(学生在吃饭)# 在类外定义的称为函数类之内称为方法 # 类方法 classmethod def cm(cls): print(类方法) # 静态方法中不能写self注意 staticmethod def sm(): print(静态方法)# 类之外定义的称为函数在类之内定义的称为方法def drink(): print(喝水)对象的创建和java一样对象的创建又称为类的实例化语法实例名类名()如stu Student()实例对象会有个类指针指向类对象类名.方法名(类的对象),实际上就是方法定义处的selfStu1 Student(张三,20)Student.eat(stu1)动态绑定属性和方法Python是动态语言在创建对象之后可以动态地绑定属性和方法stu1 Studnet(张三,20)stu2 Studnet(李四,30)print(id(stu1)) # 和stu2不同print(id(stu2))print(——–为stu2动态绑定性别属性———–)stu2.gender 女 # 这点和java不一样java没有成员变量(属性-字段)是不能指定的# Student中没有 gender属性 能动态绑定性别 ,只属于stu2自己print(stu2.gender) # 女def show(): print(定义在类之外的称函数)stu1.show show()stu1.show # 定义在类之外的称函数stu2.show # 报错 没有胃stu2动态绑定show方法,在对象上之后函数就称为方法了面向对象的三大特征封装提高程序的安全性将数据属性和行为方法包装到类中。在方法内部对属性进行操作在类对象的外部调用方法。这样无需关心方法内部的具体实现细节从而隔离了复杂度在Python中没有专门的修饰符用于属性的私有如果该属性不希望在类对象外部被访问前面使用两个-继承提高代码的复用性如果一个类没有继承任何类默认继承objectPython支持多继承java不支持多继承定义子类时必须在其构造函数中调用父类的构造函数多态提高程序的可扩展性和维护性封装class Student: def init(self,name,age): self.name name self.age age def show(self): print(self.name,self.age)stu Student(张三,20)# 在类外部使用name、ageprint(stu.name) # 张三# print(stu.age) # 报错print(dir(stu)) # dir()可以查看类的所有属性和方法 里面找到一个_Studentageprint(stu._Student__age) # 这样也能访问但是不建议这种访问方式class Student2: def init(self,age): self.set_age(age) def get_age(self): return self.age # 不希望在外面使用所以加上两个 def set_age(self,age): if 0age120: self.age age else: self.age 18stu1 Student2(150)stu2 Student2(30)print(stu1.get_age()) # 18print(stu2.getage()) # 30继承class Person(object): #object默认不写也行 def init(self,name,age): self.name name self.age age def info(self): print(姓名{0},年龄{1}.format(self.name,self.age))# 定义子类class Student(Person): def init(self,name,age,score): super().init(name,age) self.score score def info(self): super.info()# 还想用父类的info()可以super. print(self.score)# 重写# 测试stu Student(Haha,20,1001)stu.info() # 从父类中继承的方法 重写后就是Student的方法了object类object类是所有类的父类因此所有类都有object类的属性和方法内置函数dir()可以查看指定对象的所有属性Object有一个 str_ ()方法用于返回一个对于“对象的描述”对于内置函数str()进程用于print()方法帮我们查看对象的信息所以我们经常会对__str _进行重写而不是输出内存地址重写strclass Student: def init(self,name,age): self.namename self.ageage def str(self): return 我的名字是{0},今年{1}岁.format(self.name,self.age)stuStudent(Haha,20)print(stu) # 我的名字是Haha,今年{20}岁 默认调用str()这样的方法多态指的是一类事物有多种形态一个抽象类有多个子类因而多态的概念依赖于继承不同的子类对象调用相同的方法产生不同的执行结果多态可以增加代码的灵活度Python中虽然没有数据类型但是具备多态特征class Animal: def eat(self): print(eating…)class Dog(Animal): def eat(self): print(dog gnawing…)def fun(obj): obj.eat()fun(Animal()) # eating…fun(Dog()) # # dong gnawingJava是静态强类型语言Python是动态语言静态语言和动态语言关于多态的区别静态语言实现多态的三个必要特征继承方法重写父类引用执行子类对象动态语言的多态的多态崇尚“鸭子类型”当看到一只鸟走起来像鸭子、游泳像鸭子收起来也像鸭子那么这鸟就可以被称为鸭子在鸭子类型中不用对象是什么类型到底是不是鸭子只关心对象的行为特殊方法和特殊属性特殊属性_ dict __ 获得类对象或实例对象所绑定的所有属性和方法__ len __()通过重写它让内置函数len()的参数可以是自定义类型特殊方法_add _()通过重写它让内置函数len()的参数可以是自定义类型_new _()用于创建对象_init() 对创建的对象进行初始化class A: def init(self,name,age): self.name name self.age agex A(Jack,18)print(x.dict) #{name: Jack, age: 18}print(x.class) # class main.A 所属的类class B(A): passprint(B.base) # class main.A # 类的基类,如果多继承谁在前输出谁print(B.bases) # (class main.A,) 输出其父类类型的元素print(B.mro) # 继承层次结果 B继承A继承object (class main.B, class main.A, class object)print(A.subclasses())#子类列表 [class main.B]a 20b 100c a bd a.add(b) #等同于print©print(d)class Student: def init(self,name): self.name name def add(self, other): # 必须在这里写stu1.__add(stu2)这样也报错 return self.name other.name def len(self): # 必须写在这里才能计算长度 return len(self.name)stu1 Student(张三)stu2 Student(李四)s stu1 stu2 # 写了add方法才能加否则报错print(s) # 张三李四lst [1,2,3,4,5]print(len(lst)) # 5print(lst.len()) # 5print(stu1.len()) # 2new执行是优先于init的。new后的对象会给__ init _中的self类的浅拷贝与深拷贝变量的赋值操作只是形成两个变量实际上还是指向同一个对象浅拷贝Python拷贝如果没特殊说明的话一般都是浅拷贝拷贝时对象包含的子对象的内容不拷贝因此源对象与拷贝对象会引用同一个子对象深拷贝使用copy模块的deepcopy函数递归拷贝对象中包含的子对象源对象和拷贝对象所有的子对象也不相同源对象和拷贝对象的所有子对象也要重新拷贝一份浅拷贝class CPU: passclass Disk: passclass Computer: def init(self,cpu,disk): self.cpu cpu self.disk diskcpu1 CPU()cpu2 cpu1 # 这个是赋值操作print(cpu1,cpu2) # 内存地址一样# main.CPU object at 0x000001A54423FF40 main.CPU object at 0x000001A54423FF40print(———————-)disk Disk() # 创建一个硬盘computer Computer(cpu1,disk) # 创建一个计算机类的对象# 浅拷贝import copycomputer2 copy.copy(computer)print(disk)# # main.Disk object at 0x000001E1026AF3D0print(computer,computer.cpu,computer.disk)# computer2和computer内存地址不同子对象的内存地址是相同的-Disk和CPU# main.Computer object at 0x000001A543EF4850 main.CPU object at 0x000001A54423FF40 main.Disk object at 0x000001A54423F3D0print(computer2,computer2.cpu,computer2.disk)# main.Computer object at 0x000001A5442928F0 main.CPU object at 0x000001A54423FF40 main.Disk object at 0x000001A54423F3D0print(—————————)# 深拷贝computer3 copy.deepcopy(computer)print(computer,computer.cpu,computer.disk)print(computer3,computer.cpu,computer3.disk)# 打印的内存地址各不同computer、cpu、disk都拷贝了一份内存地址变化了# main.Computer object at 0x00000265D67B3E80 main.CPU object at 0x00000265D67B3FD0 main.Disk object at 0x00000265D67B3EB0# main.C深拷贝多态对于动态语言关注对象的行为静态语言继承、方法重写、父类引用指向子类对象模块英文为Modules一个模块可以包含N多个函数在Pyhton中一个扩展名.py的文件就是一个模块使用模块的好处方便其它程序和脚本的导入并使用避免函数名和变量名冲突提高代码的可维护性提高代码的可重用性自定义模块创建模块新建一个.py文件名称尽量不要与Python的自带的标准名称相同导入模块import 模块 [as 别名]from 模块名称 import 函数/变量/类import math # 导入数学模块 每一个模块都有id、type以及它的值组成print(id(math))print(type(math))print(math)print(math.pi) # 3.141592653589793#2051647076960#class module#module math (built-in)print(dir(math))from math import piprint(pi) # 这是能直接输出的print(pow(2,3)) # 如果不导入math只导入from math import pi 是不能使用的以主程序形式运行在每个模块的定义中都包括一个记录模块名称的变量 name _,程序可以检查该变量以确定它们在哪个模块中执行如果一个模块不是被导入到其它程序中执行那么它可能在解释器的顶级模块中执行。顶级模块的 _ name _变量的值为 _main _# 开发时间2023/2/11def add(a,b): return abif name main: print(add(10,20)) # 只有当运行这个calc2的时候才会执行这个主程序语句可防止其它程序调用此类运行这个Python中的包Python中的包包是一个分层次的目录结构它将一组功能相近的模块组织在一起包中包含N多个模块作用代码规范避免模块名称冲突包与目录的区别创建之后默认包含__ init __ .py文件的目录称为包目录里通常不包含_init _ .py文件包的导入import 包名.模块名import只能导入包名、模块名用from 能导入包、模块、函数名、变量名 pageage1.module_A import ma比如创建python软件包在下面新建pageage1,下面创建2模块-module_A.py/moduleB.py在外面创建demo.pyimport pageage1.module_A as ma# 现在就可以使用pageage1.module_A的内容了(别名叫ma)Python中常用的内置模块模块名描述sys与Python解释器及其环境操作相关的标准库time提供与时间相关的各种函数的标准库os提供了访问操作系统服务功能的标准库calendar提供与日期现相关的各种函数的标准库urllib用于读取来自网上服务器的数据标准库json用于使用序列号和反序列化对象re用于在字符串中执行正则表达式匹配和替换math提供标准算术运算函数的标准库decimal用于进行准确控制精度、有效位数和四舍五入的十进制运算logging提供灵活的记录事件、错误、警告和调试信息等日志信息的功能简单的代码实现import sysimport timeimport urllib.requestimport math# getsizeof是获取占用字节数print(sys.getsizeof(20)) # 28print(sys.getsizeof(21)) # 28print(sys.getsizeof(True)) # 28print(sys.getsizeof(False)) # 24print(time.time()) # 对应秒数 1676127718.0125294print(time.localtime(time.time())) # 将秒转成本地时间time.struct_time(tm_year2023, tm_mon2, tm_mday11, tm_hour23, tm_min1, tm_sec58, tm_wday5, tm_yday42, tm_isdst0)print(urllib.request.urlopen(http://ww.baidu.com).read())print(math.pi)第三方模块Python如此强大离不开第三方模块第三方模块的安装pip install 模块名在线安装方式-cmd安装-也是使用最多的方式第三方模块的使用import 模块名安装导入之后我们就可以使用在cmd窗口我们可以输入python进入python交互模式此时import使用已经安装的模块如果能使用证明安装成功编码格式编码格式介绍文件的读写原理文件读写操作文件对象常用的方法with语句上下文管理器目录操作常见的字符编码格式Python的解释器使用的是Jnicode(内存)py文件在磁盘上使用UTF-8存储外存py默认是UTF-8它是变长编码1-4个字节表示1个字符英文1个字节汉字3个字节文件读写原理读写俗称IO操作-先进先出如管道一般文件到内存称为读内存到文件称为写读写之后需要关闭资源文件读写操作内置函数open()创建文件对象语法规则file open(filename,[,mode,encoding])file 是被创建的文件对象open是创建文件对象的函数filename是要创建或打开的文件名称mode打开模式为只读模式file open(a.txt,r) # 读中括号是可选写不写都行print(file.readlines()) # readlines读取的是一个列表file.close()encoding默认文本文件中字符的编写格式为gbk所以我们在编译器中常见一打开乱码并提示reload gbk常用的文件打开模式文件的类型按文件中数据的组织形式文件分为以下两大类文本文件存储的是普通“字符文本默认为unicode:字符集可以使用记本事程序打开二进制文件把数据内容用“字节”进行存储无法用记事本打开必须使用专用的软件打开举例mp3音频文件jpg图片.doc文档等打开模式描述rread only以只读模式打开文件,文件的指针将会放在文件的开头wwrite only以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在文件的开头a以追加模式打开文件如果文件不存在则创建文件指针在文件开头如果文件存在则在文件末尾追加内容文件指针在原文件末尾b以二进制方式打开文件不能单独使用需要与共它模式一起使用rb,或者wb以读写方式打开文件不能单独使用需要与其它模式一起使用a文件对象的常用方法方法名说明read([size])从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾即一次读取文件所有内容readline()从文本文件中读取一行内容readlines()文本文件中的每一行都作为单独的字符串对象并将这些对象返回到列表中返回write(str)将字符串str内容写入文件writelines(s_list)将字符串列表s_lst写入文本文件不添加换行符seek(offset[,whence])把文件指针移动到新的位置offset表示相对于hencel的位置offset:为正往结束方向移动为负往开始方向移动whence(从何处)不同的值代表不同含义0:从文件头开始计算默认值1:从当前位置开始计算2:从文件尾开始计算tell()返回文件指针的当前位置第一个字母是0也就是从0开始flush()把缓冲区的内容写入文件但不关闭文件close()把缓冲区的内容写入文件同时关闭文件释放文件对象相关资源-close()之后就不能写内容了flush之后能closefile open(a.txt,r)file seek(2) # a.txt有中国两字。一个字占取2字节(gbk)从国开始读如果在pyCharm中写的txt,可能就是utf-8了不是2字节print(file.read()) # 国# tellprint(file.tell()) # 会把当前所有内容打印出指向最后一个位置。如seek(2)跳过了2如果打印hello的话只会出现llowith语句with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的写文件时建议使用with语句形式上下文为表达式结果为上下文管理器实现了__ enter__ () 方法和 __ exit()方法 称为这个类遵守上下文管理协议这个类的实例对象称为上下文管理器图描述如下# open(logo.png,rb) with之后as之前为上下文表达式结果为上下文管理器–同时创建一个运行时上下文–自动调用enter()方法并将返回值赋值给src_filewith open(logo.png,rb) as src_file:# as src_file:可选项上下文管理器对象的引用[可选项]src_file.read() # with语句体# 离开运行时上下文自动调用上下文管理器的特殊方法exit()with open(a.txt,r) as file: print(file.read()) # 不用再手动close关闭了因为离开with语句时会自动释放资源# 开发时间2023/2/12# MyContentMgr实现了特殊方法enter(),exit__()称为该类对象遵守了上下文管理器协议该类对象的实例对象称为上下文管理器class MyContentMgr(object): def enter(self): print(enter方法被调用执行了) return self def exit(self, exc_type, exc_val, exc_tb): print(exit方法被调用执行了) # print(show方法被调用执行了,10) 即使产生异常也会调用exit方法称为自动关闭资源 def show(self): # 实例Method print(show方法被调用执行了)# MyContentMgr这个类遵守上下文管理协议它的对象就称为上下文管理器把这个对象赋给file去存储# 相当于file MyContentMgr()这时候就可以通过file调用它的方法# with里面的所有缩进都称为with语句体with MyContentMgr() as file: # 这个with语句体执行之后就会自动跳出上下文管理器调用exit方法 file.show() # exit方法被调用执行了目录操作os模块是Python内置的与操作系统功能和文件系统相关的模块该模块中的语句的执行结果通常与操作系统有关在不同的操作系统上运行得到的结果可能不一样。os模块与os.path模块用于对目录或文件进行操作既然是和os有关的那么可以调用os有关的文件不需要安装它是自带的模块os模块操作目录相关函数函数说明getcwd()返回当前的工作目录(文件目录)listdir(path)返回指定路径下的文件和目录信息mkdir(path[,mode])创建目录makedirs(path1/path2…[,mode])创建多级目录rmdir(path)删除目录removedirs(path1/path2……)删除多级目录chidr(path)将path设置为当前工作目录import os# 调用记事本# os.system(notepad.exe)# 直接调用可执行文件# os.startfile(C:\Users\79382\AppData\Local\Google\Chrome\Application\chrome.exe)os.path模块操作目录import 导入os.path函数说明abspath(path)用于获取文件或目录的绝对路径exists(path)用于判断文件或目录是否存在如果存在返回True否则返回Falsejoin(path,name)将目录与目录或者文件名拼接起来splitext()分离文件名和扩展名basename(path)从一个目录中提取文件名dirname(path)从一个路径中提取文件路径不包括文件名isdir(path)用于判断是否为路径import os.path print(os.path.abspath(demo13.py)) # F:\pythonProject1\venv\Scripts\demo13.py print(os.path.exists(demo13.py)) # False print(os.path.join(E:\Python,demo13.py)) # E:\Python\demo13.py print(os.path.split(E:\vipython\chap15\demo13.py)) # (E:\vipython\chap15, demo13.py) print(os.path.splitext(demo13.py)) # (demo13, .py) print(os.path.basename(E:\vippython\chap15\demo13.py)) # demo13.py print(os.path.dirname(E:\vippython\chap15\demo13.py)) # E:\vippython\chap15 print(os.path.isdir(E:\vippython\chap15\demo13.py)) # False 因为demo13.py是文件 获取当前目录下的指定文件 import os path os.getcwd() # 获取当前目录下的所有文件 lst os.listdir(path) for filename in lst: # 获取所有以py结尾的文件if filename.endswith(.py):print(filename) 获取当前目录下的指定文件包括子目录 import os path os.getcwd()

os.walk()可以遍历指定目录下所有的文件

lst_files os.walk(path) print(lst_files) # 获取的是一个对象

这个迭代器对象返回来的是一个元组

for dirpath,dirname,filename in lst_files:print(dirpath)print(dirname)print(filename)print(————)for dir in dirname:print(os.path.join(dirpath,dir))for file in filename:print(os.path.join(dirpath),file)print(——————————)微信公众号索奇之家 一起探索软件、编程、数码等众多知识