day7
一、回顾
1、列表和字典在循环里边尽量不要删除元素,很麻烦
2、元组:如果元组里边只有一个逗号,且不加逗号,次元素是什么类型,就是什么类型。
二、集合
1 ''' 2 集合:可变的数据类型,它里边的元素,是不可变数据类型;无序,不重复 3 {} 4 ''' 5 #错的: 6 # set1 = set({1, 2, 3}) 7 # set2 = {1, 2, 3, [2, 3], {'name': "alex"}} 8 9 # 对的 10 set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry', 'barry'} 11 # 增add、update 12 # add 13 # set1.add('女神') 14 # update 15 # set1.update('abv') 16 17 # 删 18 # pop:随机删除 19 # set1.pop() # 返回删除的元素 20 # remove:按照元素删除 21 # set1.remove("alex") # 没有元素会报错 22 # set1.clear() 23 24 # 查 25 # for i in set1: 26 # print(i) 27 28 # 集合 29 set1 = {1, 2, 3, 4, 5} 30 set2 = {4, 5, 6, 7, 8} 31 32 # 交集 33 # print(set1 & set2) 34 # print(set1.intersection(set2)) 35 36 # 并集 37 # print(set1 | set2) 38 # print(set2.union(set1)) 39 40 # 反交集 41 # print(set1 ^ set2) 42 # print(set1.symmetric_difference(set2)) 43 44 # 差集 45 # print(set1 - set2) 46 # print(set1.difference(set2)) 47 48 # 子集:返回True 或者 False 49 # set1 = {1, 2, 3} 50 # set2 = {1, 2, 3, 4, 5, 6} 51 # print(set1 < set2) 52 # print(set1.issubset(set2)) 53 # 超集:返回True 或者 False 54 # print(set1 > set2) 55 # print(set1.issuperset(set2)) 56 57 # 去重 58 # li = [1,2,33,54,2,33,54,66,7,8,6,1] 59 # li = set(li) 60 # li = list(li) 61 # print(li) 62 63 # 冻住集合,变为不可变类型 64 s = frozenset('barry')
day8
1、文件操作
1 # 绝对路径D:\测试.txt 2 # f = open('D:\测试.txt', mode='r', encoding='gb2312') 3 # contert = f.read() 4 # print(contert, type(contert)) 5 # f.close() 6 7 # 只读r 8 # f = open('log', mode='r', encoding='utf-8') 9 # contert = f.read() 10 # print('{}\n{}'.format(contert, type(contert))) 11 # f.close() 12 13 # 只读rb 14 # f = open('测试', mode='rb') 15 # contert = f.read() 16 # print('{}\n{}'.format(contert, type(contert))) 17 # f.close() 18 19 20 # 写w:没有的话创建,有的话覆盖原文件 21 # 没有创建 22 # f = open('log', mode='w', encoding='utf-8') 23 # f.write('骑兵步兵') 24 # f.close() 25 # 覆盖 26 # f = open('log', mode='w', encoding='utf-8') 27 # f.write('经典拉扣设计的啦') 28 # f.close() 29 30 # 写wb: 31 # f = open('log', mode='wb') 32 # f.write('大手大脚拉开手机'.encode('utf-8')) 33 # f.close() 34 35 # 追加 36 # a 37 # f = open('log', mode='a', encoding='utf-8') 38 # f.write('\n追加文字"啦啦啦啦啦啦"') 39 # f.close() 40 41 # ab 42 # f = open('log', mode='ab') 43 # f.write('追加文字"啦啦啦啦啦啦"'.encode('utf-8')) 44 # f.close() 45 46 47 # 读写'r+':先读,再写 48 # f = open('log', mode='r+', encoding='utf-8') 49 # print(f.read()) 50 # f.write('\n读写“哈哈哈”') 51 # f.close() 52 53 # 读写r‘+’:先写再读 这种方式会重头开始写,然后一个字符一个字符的覆盖原有内容 54 # f = open('log', mode='r+', encoding='utf-8') 55 # f.write('aaa') 56 # print(f.read()) 57 # f.close() 58 59 # 写读:w+ 60 # f = open('log', mode='w+', encoding='utf-8') 61 # f.write('aaa') 62 # f.seek(0) 63 # print(f.read()) 64 # f.close() 65 66 67 # 功能详解 68 f = open('log', mode='r+', encoding='utf-8') 69 # content = f.read(3) # 前三个字符 70 # f.seek(14) # 按照字节进行跳转光标 71 # f.tell() # 告诉你光标的位置 72 # f.readable() # 判断是否可读 73 # f.readline() # 一行一行的读 74 # print(f.readlines()) # 每一行当成列表中的元素,添加到list中 75 # f.truncate(3) # 截取前三个 76 # for line in f: 77 # print(line) 78 # f.close() 79 80 # 追加查看 81 # f = open('log', mode='a+', encoding='utf-8') 82 # f.write('\n追加文字李二') 83 # f.seek(f.tell()-9) 84 # print(f.read(2)) 85 # f.close() 86 87 #with 循环 88 # with open('log', mode='a', encoding='utf-8') as l, \ 89 # open('测试', mode='a', encoding='utf-8') as c: 90 # l.seek(6) 91 # l.write('咚') 92 # c.seek(6) 93 # c.write('咚')
2、解码
1 s = 'abf' 2 b = s.encode('utf-8') 3 print(b) 4 #byte --->str decode 解码 5 s1 = b.decode('gbk') 6 print(s1)
day9
1、复习
1 # 文件处理 2 3 # 打开文件 4 # open(‘路径’,mode'打开方式',encoding'编码方式') 5 # 打开方式 r w a r+(可读可写) w+(可写可读) a+(可追加可读) b 6 # r+ 打开文件直接写 和读完再写 7 # 编码方式:一般用utf-8 8 # 操作文件 9 # 读: 10 # read:一次性读 11 # readlines:一次性读 12 # readline:一行一行读 13 # 不知道哪里结束 14 # 视频、图片是 用rb打开 文件是bytes,可以按照字节读 15 # for循环 --> 最好 16 # 写: 17 # write: 18 # 光标 ——> 文件指针 19 # seek ——> 指定光标移动到某个位置 20 # tell ——> 获取光标位置 21 # truncate ——> 截取文件 22 # 关闭文件 23 # close 24 # 修改文件 25 # 文件python没有提供 26 27 28 # 修改文件方法 29 # with open('小护士班主任',encoding='utf-8') as f,open('小护士班主任.bak','w',encoding='utf-8') as f2: 30 # for line in f: 31 # if '星儿' in line: #班主任:星儿 32 # line = line.replace('星儿','啊娇') 33 # #写文件 34 # f2.write(line) #小护士:金老板 35 # 36 # import os 37 # os.remove('小护士班主任') #删除文件 38 # os.rename('小护士班主任.bak','小护士班主任') #重命名文件
2、返回值
1 # def my_main(): 2 # return "返回值" 3 4 # 返回值三种情况: 5 # 1、没有返回值:①不写return ②只写return ③ return None 6 # ① 7 # def func(): 8 # l = ['老大', '老二'] 9 10 # ②只写return,没有返回值 11 # def func(): 12 # l = ['老大', '老二'] 13 # return 14 15 16 # 2、返回一个值:可以返回任何数据类型,只要返回了就可以接受 17 # def func(): 18 # return [1, 2, 3, 4] 19 # print(func()) 20 21 22 # 3、返回多个值:可以用多个变量接收、也可以用一个变量接受,会接受一个元祖 23 # def func(): 24 # return 1, 2 25 # 26 # 27 # a, b = func() 28 # print(a, b) 29 # 参数,定义时候的参数叫做形参,传入参数叫做实参 30 # def my_len(形参) 31 # print('6') 32 # my_len('实参')
3、函数的参数问题
1 # 没有参数 2 # 定义参数和调用参数的括号都不写内容 3 # 有一个参数 4 # 传什么就是什么 5 # 有多个参数 6 # 按照位置传参 7 # def my_sum(a, b): 8 # res = a + b 9 # return res 10 # my_sum(1, 2) 11 12 # 按照关键字传参 13 # def my_sum(a, b): 14 # res = a + b 15 # return res 16 # my_sum(b = 2, a = 1) 17 18 # 混着用:必须先按照位置传参,再按照关键字传参 19 # def my_sum(a, b): 20 # res = a + b 21 # return res 22 # my_sum(1, b = 2) 23 24 # 动态传参 25 # def func(*args): 26 # print(args) 27 # l = [1,2,3,4,5] 28 # func(*l) 29 # def func(**kwargs): 30 # print(kwargs) 31 # d = {'a':1,'b':2} 32 # func(**d) 33 34 # 站在形参角度 35 # 位置参数:必须传,且有几个参数就传几个值 36 # 默认参数:可以不传,不传的话使用默认值 37 38 # def classmate(name, sex='男'): 39 # print('%s : %s' % (name, sex)) 40 # classmate('二哥') 41 # classmate('小孟', '男') 42 # classmate('大猛', '男') 43 # classmate('朗哥', '女') 44 45 # 动态参数:可以接受任意个参数*args必须在**kwargs之前 46 # ①*args:接收的是按照位置传参的值,组织成一个元祖 47 # ②**kwargs:接收是按照关键字传参的,组成一个字典 48 # def my_sum(*args): 49 # n = 0 50 # for i in args: 51 # n += i 52 # return n 53 # print(my_sum(1, 2, 3, 4)) 54 # 形参参数的定义顺序:位置参数,*args,默认参数,**kwargs 55 56 57 # 函数的注释 58 def func(l,b): 59 """ 60 61 :param l: 62 :param b: 63 """
day10
1、复习和作业讲解
2、默认函数陷阱
1 def qqxing(l = []): 2 l.append(1) 3 print(l) 4 5 6 qqxing() 7 qqxing([]) 8 qqxing() 9 qqxing() 10 11 # 如果默认参数的值是一个可变数据类型,那么每一次调用函数的时候,如果不传值就公用这个数据类型的资源
3、函数的命名空间
1 # 函数进阶 2 3 # 命名空间个作用域 4 5 # 内置的命名空间 6 # 就是python解释器一启动就可以使用的名字存置命名空间中 7 # 内置命名在启动python解释器的时候被加载进内存里 8 # 全局命名空间 9 # 实在程序从上到下被执行的过程中依次被加载进内存的 10 # 放置了我们设置的所有变量和函数命 11 # 局部命名空间 12 # 就是函数内部的名字 13 # 就是调用函数的时候 才会产生这个命名空间,随着函数执行的结束,这个名称空间就消失了 14 15 # 在局部:可以使用全局、内置命名空间中的名字 16 # 在全局:可以使用内置命名空间的名字,但是不能使用局部 17 # 再内置:不能使用局部和全局的名字的 18 19 20 # 作用域 21 # 全局作用域 -- 作用在全局 -- 内置和全局名字空间中的名字都属于全局作用域 -- locals 22 # 局部作用域 -- 作用在局部 -- 函数(局部名字空间中的名字属于局部作用域) -- globals 23 a = 1 24 b = 2 25 def func(): 26 x = 'aaa' 27 y = 'bbb' 28 print(locals()) 29 func() 30 print(globals()) 31 # globals:永远打印全局的名字 32 # locals:输出什么,根据locals所在的位置 33 34 35 # a = [1,2] 36 # def dunc(): 37 # a.append(3) 38 # dunc() 39 # print(a) 40 41 # 对于不可变数据,在局部可以查看全局作用域中的变量 42 # 但是不能修改 43 # 如果想要修改,需在程序的一开始添加global生命 44 # 如果在一个局部(函数)内声明一个global变量,那么这个变量在局部的所有操作对全局的变量有效
4、函数的嵌套和作用域链
1 # def max(a, b): 2 # return a if a > b else b 3 # 4 # 5 # def the_max(x, y, z): # 函数的嵌套调用 6 # c = max(x, y) 7 # return max(c, z) 8 # 9 # 10 # print(the_max(1, 2, 3)) 11 12 13 # nonlocal 只能用于局部变量,找上层中离当前最近一层的局部变量 14 15 # 闭包 16 a = 1 17 18 19 def outer(a): 20 21 def inner(): 22 nonlocal a 23 a += 1 24 print(a) 25 # print(inner.__closure__) # 点有这个不返回None就会就是闭包 26 return inner 27 28 29 inner = outer(5) 30 31 inner() 32 33 # import urllib # 模块,就是一个python文件 34 # from urllib.request import urlopen 35 # urlopen('')