命名空间和作用域
# 我们程序启动的一瞬间做了什么事 # 还有为什么程序启动的一瞬间这些都能用 # print() input() len() 加()就可以调用 # def my_len(): # # pass # my_len() # print() len() # 开始执行之后 # a=1 # b=2 # def func(): # name='gusu' # print(a,b) # print(name) # # # def func2(): # age=18 # 总结: # 永远是局部命名空间可以用 全局的变量 全局命名空间可以用内置命名空间的变量,但是内置的不能用全局的,全局的不能用局部的 # 命名空间: # 内置命名空间:放的源码print len inptu等等 # 全局命名空间:定义在函数外部的所有变量 # 局部命名空间:定义在函数内部的所有变量 # # 作用域: # 全局作用域:内置命名空间,全局命名空间 # 局部作用域:内置命名空间,全局命名空间,局部命名空间 # 记住:使用的时候的特点:永远优先用局部的,没有局部用全局,没有全局永内置 # # 如果我在全局,内置,局部都有,用谁的? 用自己的 # len=1880 # # print(len) # # def func(): # print(len) # func()
函数嵌套
# def func1(): # print('hello') # # def fun2(): # print('start') # func1() # print('stop') # fun2() # 在局部可以查看,但不能修改,修改就报错了,想要引用也是可以的,但是不能直接在函数内部修改全局空间的值 # a=1 # def func(): # a+=1 # print(a) # func() # print(a) # 如果非要改,global 关键字可以修改全局变量的值但是容易造成代码的安全隐患 # 第一种: # a=1 # def func(): # global a # a+=1 # print(a) # func() # print(a) # # 第二种 # a=1 # def func(): # # return a+1 # # func() # print(func()) # nonlocal 关键字 # a=18 # def func(): # a=20 # # def func2(): # nonlocal a # print(a) # func2() # print(a) # func()
文件操作
# dic={ # 'admin':'123456' # 'user2':'6666' # } # dic['老王']='110' # open---打开 #绝对路径:从磁盘的根目录开始一直到文件名 #相对路径:在同一个文件夹下的文件,如果在同一个文件夹中,则相对路径就是这个文件名,如果在上一层,则要../ # open('userinfo',mode='r') #相对路径打开 r相当于读 # open() # print('\n') # print('\\n') 取消\斜杠的转义,\\,或者在路径前面加r #windowns 操作系统默认gbk # f是一个文件句柄,所有和文件相关的操作都要依赖f,也可以叫文件操作符 # f=open('userinfo.py',mode='r',encoding='utf-8')相对 mode='r'不加也可以 # f=open(r'D:\APP\Python\tcl\file\day5\info1.py',mode='r',encoding='utf-8')绝对路径 # print(f.read()) #读取全部信息,encoding依次读所有,文件有多大,占多大内存都一次性读出来 # print(f.readline()) #一次只读一行的文件,依次向下读,但不知道在哪里结束 #admin|123456\n 读取的文件背后是有空格的 # for line in f: #既能够一行一行的读,又可以读完之后自动停止 # line=line.strip() #去空格 # if line:print(line) #如果还有内容就打印出来 # f.close() #关闭文件 # f=open('D:\APP\Python\tcl\file\day5\info1.py',mode='r',encoding='utf-8') # print(f.readline()) # f = open('..\day5\info1.py', mode='r', encoding='utf-8') # print(f.read()) # for line in f: # line=line.strip() # if line:print(line) # f = open('..\day5\info1.py', mode='r', encoding='utf-8') # print(f.write('今天天气不错')) #以写的方式打开一个已经存在的文件,相当于先清空原来的文件 # f1=open('haha',mode='r',encoding='utf-8')#以写的方式打开一个不存在的文件,相当于新建了一个空文件 # f1.write('老王|2131\n') # f1.write('老李|2421\n') # f1.close() # 文件的追加 mode='a' # f1=open('haha',mode='a',encoding='utf-8') # f1.write('老孙|来啦\n') # f1.close() # 以字节的形式读写 'rb' 后面不要加utf_8 # f=open('视频名称','rb') # print(f.read()) #读取慢,因为视频大了 # # 视频文件不能用for循环读 # # f=open('视频名称','rb') # print(f.read(1024)) # 1024=1kb #指定字节每次读多少 # # # 我不知道文件有多大,不知道要读多久 # import os # size=os.path.getsize(''视频名称'相对路径') # print(size) #返回的是字节数 # # # 通过while循环读取视频 # f=open('视频名称','rb') 读取 # while size>1024: # content=f.read(1024) # print(content) # size-=1024 # else: # content=f.read(size) # print(content) # # # 复制视频 # f=open('视频名称','rb') 文件写入 # f1=open('复制视频.mp4','wb') # while size>1024: # content=f.read(1024) # f1.write(content) # size-=1024 # else: # content=f.read(size) # f1.write(content) # # f.close() # f1.close() # f=open('谷苏.MP4','rb') # print(f.read(1024)) # 1024=1kb # import os # size=os.path.getsize('谷苏.MP4') # print(size) # # f=open('谷苏.MP4','rb') # f1=open('复制谷苏.mp4','wb') # while size>1024: # content=f.read(1024) # f1.write(content) # # print(content) # size-=1024 # else: # content=f.read(size) # # print(content) # f1.write(content) # # f.close() # f1.close() # r+ 模式 读写 # f3=open('userinfo.py',mode='r+',encoding='utf-8') # print(f3.read()) # f3.write('小伙子\n') # f3.close() # 坑 # 默认情况下,光标在文件的开头,一般是先读后写才是安全的 # f3.write('小姑娘\n') # print(f3.read()) # f3.close() # w+ # f3=open('userinfo.py',mode='w+',encoding='utf-8') # f3.write('今天天气') # f3.seek(0) #移动光标到开头去 # print(f3.read()) # f3.close() #文件的指针 # 我们在读文件的时候,有个东西在记录我们读的位置,实际上就是文件的指针 # 在每次读取数据的时候,都是文件的指针在记录当前文件读到哪一个位置上了 # seek(n) 光标移动到n的位置,移动单位是byte(字节),所以如果是utf-8的中文部分,中文是3字节 # seek(0) 移动到头 # seek(0,2)移动到结尾,seek的第二个参数表示是从哪个位置开始进行偏移 # 默认是0,表示开头,1表示当前位置,2表示结尾 # tell()是计算光标读过之前的字节的长度 # f5=open('userinfo.py',mode='r',encoding='utf_8') # conent=f5.read() # print(conent) # f5.seek(0) # conent2=f5.readline() # print(conent2) # print(f5.tell()) # f5.close() # # readline(-1) 查看第一行全部信息,可以指定位置 # 文件的修改 先读取源文件,修改文件,新建一个新文件,把数据传到新的文件中,然后删除源文件,并且将新文件命名成旧文件 import os f=open('info1.py',encoding='utf_8') f2=open('c.txt',mode='w',encoding='utf-8') for line in f: us,pwd=line.split('|') if us=='admin': pwd='777\n' f2.write('|'.join([us,pwd])) f.close() f2.close() os.remove(r'info1.py') os.rename(r'c.txt',r'info1.py') # import os # with open('haha',encoding='utf-8')as f, open('a.txt',mode='w',encoding='utf-8')as f2: # for line in f: # us,pwd=line.split('|') # if us=='老李': # pwd='666\n' # f2.write('|'.join([us,pwd])) # os.remove(r'haha') # os.rename(r'a.txt',r'haha')
作业
# 1.有字符串 "k:1|k1:2|k2:3|k3:4" 处理成字典 {'k':1,'k1':2....} # str = "k:1|k1:2|k2:3|k3:4" # str_lst = str.split('|') # # dic1 = {} # for i in str_lst: # key, value = i.split(':') # dic1[key] = int(value) # print(dic1) # 2.写函数,检查传入字典的每一个value长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者 # dic = {"k1":"v1v1","k2":[11,22,33,44]} # dic = {"k1":"v1v1","k2":[11,22,33,44]} # def a(c): # b = {} # for key, value in c.items(): # if len(value) > 2: # b[key] = value[0:2] # else: # b[key] = value # return b # d = a(dic) # print(d) # 3.有如下值li= [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。 # 即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表} # li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] # # dic = {'k1': [], 'k2': []} # for i in li: # if i == 66: continue # if i > 66: # dic['k1'].append(i) # else: # dic['k2'].append(i) # print(dic) # 4.修改文件内容,把文件中的张三都替换成SB # 文件内容如下 # wind|123 # 张三|456 # 人才|678 # import os # f = open('userinfo', encoding='utf-8') # f1 = open('b.txt',mode='w', encoding='utf-8') # 会覆盖之前的文本 # for line in f: # username,pwd = line.split('|') # print(username,pwd) # if username == '张三': # username = 'SB' # sb赋值给username # f1.write('|'.join([username,pwd])) # f.close() # f1.close() # os.remove(r'userinfo') # os.rename(r'b.txt',r'userinfo') # 5.文件a.txt内容:每一行内容分别为商品名字,价钱,个数,求出本次购物花费的总钱数 # apple 10 3 # # tesla 100000 1 # # mac 3000 2 # # lenovo 30000 3 # # chicken 10 3 # with open('a.txt', encoding='utf-8')as f: # sum_n = 0 # for line in f: # if line.strip(): # name, price, count = line.split(' ') # sn = int(price) * int(count) # sum_n = sum_n + sn # print(sum_n) # 6.定义一个函数,传入一个字典和字符串,判断字符串是否为字典中的值,如果字符串不在字典中, # 则把字符串当做key,value自定义添加到字典中,并返回新的字典 # 例子 def add(dic, str_1): if str_1 not in dic: dic[str_1] = '亚索' return dic r = add({'易大师': '剑圣', '蛮三刀': '蛮子'}, '托儿索') print(r) # 7.定义函数:(要求:定义函数处理逻辑。input输入操作在函数之外。) # 将用户输入的所有数字相乘之后对20取余数,返回结果.用户输入的数字个数不确定, # 例如:用户输入 66,88,100,1,2 等等 # num = input('请输入数字:') # def func(str_num): # print(str_num) # my_lst = str_num.split(',') # print(my_lst) # nice = 1 # for i in str_num: # if i.isdigit(): # nice *= int(i) # return nice % 20 # ret=func(num) # print(ret) # 8.一个足球队在寻找年龄在15岁到22岁的女孩做拉拉队员(包括15岁和22岁)加入。编写一个程序,询问用户的性别和年龄, # 然后显示一条消息指出这个人是否可以加入球队,询问10次后,输出满足条件的总人数。 # (要求:定义函数处理逻辑。但是input输入操作在函数之外。在for循环当中,调用input和自己定义的函数) # def func(sex, age): # num = 0 # if sex == '女': # if 15 <= int(age) <= 22: # num += 1 # print('恭喜你可以加入战队') # return num # else: # print('抱歉,你的年龄不符合') # else: # print('抱歉,你的性别不符合') # sum = 0 # for i in range(10): # sex = input('请输入孩子的性别:') # age = input('请输入孩子的年龄:') # ret = func(sex, age) # if ret: # sum += ret # print('一共有{}人符合要求,可以加入啦啦队'.format(sum))