Day03:集合、文件处理和函数基础
上节课复习:
1.总结
可变/不可变:
可变类型:list,dict
不可变类型:int,float,str,tuple
存值的个数:
存一个值:int,float,str
存多个值:list,dict,tuple
访问方式:
只能通过变量名直接访问:int,float
可以通过索引访问(有序/序列):str,list,tuple
可以通过key访问:dict
for:重复取值
while:重复做事
2.字符编码
内存中统一使用unicode,特点是:
1.兼容万国字符
2.与其他国家编码都有对应关系
保证不乱码的关键:
1.采用的字符编码表能够兼容你要存放的字符
2.字符用什么编码标准存放的,就该用什么编码标准取解码
python2:ASCII
python3:utf-8
在文件头:
#coding:gbk
python3: str类型是unicode编码的
python2: str类型是unicode.encode('文件头指定的编码')之后的结果
x=u'你':存成unicode
今日内容:
1.集合
2.文件处理
3.函数
1.什么是函数
2.为何用函数
3.函数的分类,如何用函数
4.定义函数
5.调用函数
6.形参与实参的详细作用(!!)
7.函数对象
8.函数嵌套
9.名称空间与作用域(!!)
一.集合
类型:
作用:
1.去重
2.关系运算(集合设计之初用于关注群体间的关系,而非个体)
定义:逗号分隔开多个元素
注意:
1.每一个元素都必须是不可变类型
2.集合内的元素不能重复
3.集合内元素无序,不支持索引
优先掌握:
1.集合的定义及注意点
2.集合的关系运算
3.len, in, not ,in
4.for循环遍历集合
需要掌握:
1.集合的去重以及局限性
2.往集合内添加或删除元素,add,update,pop,remove,discard
1 pythoners=['tom','alex','andy','rocky','lily'] 2 linuxers=['walter','tao','karen','andy','alex'] 3 l=[] 4 for item in pythoners: 5 if item in linuxers: 6 l.append(item) 7 print (l)
输出: # ['alex', 'andy']
1 #去重 2 #局限性: 3 #1.不能保证原来的顺序 4 #2.不能针对可变类型去重 5 l=[1,1,1,1,'andy','tom'] 6 s=set(l) 7 print(s) 8 l=list(s) 9 print(l)
输出:
{1, 'andy', 'tom'}
[1, 'andy', 'tom']
1 l=[1,1,1,1,'andy','tom'] 2 for item in s: 3 print(item)
输出:
1
andy
tom
1 #需求: 2 #1.列表内的元素有可变类型 3 #2.去重之后要保证原来的顺序 4 info=[ 5 {'name':'andy','age':'18'}, 6 {'name':'tom','age':'23'}, 7 {'name':'alex','age':'36'}, 8 {'name':'andy','age':'18'}, 9 {'name':'andy','age':'20'} 10 ] 11 l=[] 12 for dic in info: 13 if dic not in l: 14 l.append(dic) 15 info=l 16 print(info)
输出:
[{'name': 'andy', 'age': '18'}, {'name': 'tom', 'age': '23'}, {'name': 'alex', 'age': '36'}, {'name': 'andy', 'age': '20'}]
1 #关系运算 2 pythoners={'tom','alex','andy','rocky','lily'} 3 linuxers={'walter','tao','karen','andy','alex'} 4 5 #1.求既报名linux又报名oython的学员名单 6 print(pythoners&linuxers) 7 #2.只报名python, 没有报名linux的学员名单,即集合pythoners-linuxers,差集 8 print(pythoners-linuxers) 9 #3.只报名linux, 没有报名python的学员名单,即集合linuxers-pythoners,差集 10 print(linuxers-pythoners) 11 print(linuxers.difference(pythoners)) 12 #4.求所有报名学员名单,求并集 13 print(pythoners|linuxers) 14 print(pythoners.union(linuxers)) 15 #5.求没有同时报名两门课程的学院奖名单,对称差集 16 print(pythoners^linuxers)
输出:
{'andy', 'alex'}
{'rocky', 'lily', 'tom'}
{'karen', 'walter', 'tao'}
{'karen', 'walter', 'tao'}
{'tao', 'rocky', 'lily', 'tom', 'karen', 'andy', 'walter', 'alex'}
{'tao', 'rocky', 'lily', 'tom', 'karen', 'andy', 'walter', 'alex'}
{'karen', 'tao', 'walter', 'rocky', 'lily', 'tom'}
1 #集合的其他方法: 2 s1={1,2,3,4,5,} 3 s1.add(6) 4 print(s1) 5 s2={3,4} 6 s1.difference(s2) 7 #差集取到后更新s1的值 8 s1.difference_update(s2) 9 print (s1) 10 #删除某个值 11 s1.discard(2) 12 print(s1) 13 #验证是否有共同部分 14 s3={6,7} 15 print(s1.isdisjoint(s3)) 16 #删除 17 print(s1.pop()) #随机删除 18 s1.discard(33333)#指定元素,若不存在也不报错 19 s1.remove(333)#指定元素,若不存在则报错 20 #更新 21 s1.update('hello') 22 print(s1)
输出:
{1, 2, 3, 4, 5, 6}
{1, 2, 5, 6}
{1, 5, 6}
False
1
{5, 6}
二.文件处理
1.什么是文件文件是操作系统为应用程序或用户提供的一个操作硬盘的虚拟单位
2.为什么要用文件
应用程序中需要经常将内存的数据永久保存下来,而应用程序又无法直接操作硬盘,只能通过操作系统提供的单位去间接地操作硬盘
3.如何用文件
f=open(r'D:\tools\a.txt',mode='r')
f=>应用程序中的一个值=>OS打开的文件a.txt=>硬盘中的一块空间
总结:文件处理步骤
1.打开文件
2.读/写文件
3.关闭文件
上下文自动管理工具,code1运行完后会自动关闭文件并可以同时打开很多文件。
wirh open(r'D:\tools\a.txt',mode='r') as f,\
open (r'D:\tools\b.txt',mode='r') as f1:
code1
文件的打开模式:
r:只读模式(默认的)
w:只写模式
a:只追加写
t:text文本模式(默认的),该模式下操作文件内容的单位都是字符串,该模式只适用于文本文件
强调:该模式下必须指定encoding="某种字符编码"
b:bytes二进制模式,该模式下操作文件的内容单位都是bytes,该模式适用于所有就类型的文件
1 #r模式 2 with open('a.txt',mode='rt',encoding='uth-8') as f: 3 data1=f.read() 4 print('First:',data1) 5 data2=f.read() 6 print('Second',data2) 7 8 print(f.readable()) 9 print(f.writable()) 10 f.write('hello') 11 12 line1=f.readline() 13 print(line1,end='') 14 print('===>') 15 line2 = f.readline() 16 print(line2,end='') 17 18 l=f.readlines() 19 print(1,type(1))
输出:
First: 你好啊
aa
wco
Second
1 #w模式:只写模式 2 #文件不存在则创建一个空文件,并且文件指针跳到文件的开头 3 #文件存在,会将内容清空,并且文件指针调用到文件开头 4 #强调:1.如果每次打开都是重新打开文件,那么文件内容总会被清空 5 # 2.如果在打开文件不关闭的情况下,连续写入,本次写入会跟着上次写入 6 with open('b.txt',mode='wt',encoding='utf-8') as f: 7 print(f.readable) 8 list=['\naa\n','bb\n','cc\n','dd\n'] 9 f.write('你好') 10 f.write('我的天') 11 for line in list: #法一:for写入 12 f.write(line) 13 #f.writelines(list) #法二:批量写入
输出:
<built-in method readable of _io.TextIOWrapper object at 0x0000019D984F4990>
1 #a模式:只追加写模式 2 #文件不存在则 3 with open('b.txt',mode='at',encoding='utf-8') as f: 4 print(f.readable()) 5 print(f.writable()) 6 f.write('你好\n') 7 f.writelines(['aaa\n','bbb\n'])
输出:
False
True
1 #b模式:bytes二进制模式,该模式下操作文件内容单位都是bytes. 2 #强调:一定不能指定encoding参数 3 with open('1.mp4',mode='rb') as f: 4 data=f.readline() 5 print(data,type(data)) 6 7 with open('d.txt',mode='rb') as f: 8 data=f.read() 9 print(data,type(data)) 10 res=data.decode('utf-8') 11 print(res) 12 13 with open('d.txt','wb') as f 14 f.write('hahahahah') 15 16 #遍历文件内容的方式 17 with open('d.txt',mode='rt',encoding='utf-8') as f: 18 for line in f: 19 print(line,end='') #取消默认换行符
1 #文件内指针操作(掌握) 2 #f.seek:单位统一是字节 3 #第一个参数:控制移动的字节数 4 #第二个参数:控制移动的参照物,值可以是0,1,2 5 #0:参照文件开头(b和t模式都能用) 6 #1:参照当前位置(只能在b模式用) 7 #2:参照文件末尾(只能在b模式用) 8 with open('a.txt','rt',encoding='utf-8') as f: 9 f.seek(3,0) #单位是字节 10 print(f.read()) 11 f.read() 12 f.seek(0,0) 13 print('第二次',f.read())
输出:
hggg
第二次 ddd
hggg
1 #参照当前位置 2 #储备:read(n) 3 #read的n在t模式下代表字符个数 4 #read的n在b模式下代表字节个数 5 #其余都是字节 6 7 with open('a.txt','rt',encoding='utf-8') as f: 8 s=f.read(1)#指针在第三个bytes 9 print(s) 10 f.seek(6.0) 11 print(f.read())
输出:
d
ggg
1 #文本编辑器修改文件原理: 2 #优点:修改期间硬盘上同一时刻只有一份数据 3 #缺点:占用内存过高 4 with open('a.txt',mode='rt',encoding='utf-8') as f: 5 data=f.read() 6 new_data=data.replacce('a','b') 7 print(new_data) 8 9 with open('a.txt',mode='wt',encoding='utf-8') as 10 f.wirte(new_data) 11 12 #一行一行地读,一行一行地改: 13 #以只读方式打开源文件,以写模式打开一个临时文件 14 #然后for循环读取一行行内容,每读一行改一行,将修改结果写入临时文件,直至遍历完 15 #删除源文件,将临时文件重命名为原文件名 16 #缺点:占用2份硬盘空间 17 with open('a.txt',mode='rt',encoding='utf-8') as src_f:\ 18 open('.a.txt.swap',mode='rt',encoding='utf-8') as tmp_f:\ 19 for line in src_f: 20 if 'alex' in line: 21 line=line.replace('alex','alexsb') 22 temp_f.write(line) 23 print(line) 24 os.remove('a.txt') 25 os.remove('.a.txt.swap','a.txt')
1.什么是函数
函数是具备某一功能的工具
函数的使用必须遵循先定义后调用的原则
事先准备工具的过程即函数的定义
拿来就用即函数的调用
函数分为两大类:
a.内置函数
b.自定义函数
2.为何要用函数
2.1 程序的组织结构不清晰,可读性差
2.2 日积月累,冗余代码太多
2.3 程序的可扩展性极差
3.怎么用
1).定义函数:只检测语法,不执行代码
a.语法
def 函数名(参数1,参数2,参数3)
"""
文档注释
"""
code1
code2
code3
...
return 返回值
b.
c.定义函数的三种方式
无参函数
def func1(): #func1=函数的内存地址
print('hello1')
有参函数
def func2(x,y):
print('hello1')
空函数
def func3()
pass
a.语法:函数名()
b.调用函数的过程
i,根据函数名找到函数的内存地址
ii,函数的内存地址加括号触发函数体代码的运行
c.调用函数的三种方式
i,语句
ii,表达式形式
iii,当作参数传给其他函数
3).函数的返回值
函数体代码运行的一个成果
什么时候用函数的返回值?
如何用返回值
return 值:
1. 返回值没有类型限制
2. 返回值没有个数限制
逗号分隔多个值时,返回一个元组
没有return,默认返回None
1 #示范一 2 def bar(): 3 print('from bar') 4 def foo(): 5 print('from foo') 6 bar() 7 foo()
输出:
from foo
from bar
1 #示范二 2 def foo(): 3 print('from foo') 4 bar() 5 def bar(): 6 print('from bar') 7 foo()
输出:
from foo
from bar
1 #示范三 2 def foo(): 3 print('from foo') 4 bar() 5 foo() 6 def bar(): 7 print('from bar')
输出:
from foo
from bar
1 #函数调用:表达式形式 2 def max(x,y): 3 if x>y: 4 return x 5 else: 6 return y 7 res=max(1,2) 8 print(res)
输出:
2
1 #函数调用:当作参数传给其他函数 2 def max(x,y): 3 if x>y: 4 return x 5 else: 6 return y 7 res=max(max(1,2),3) 8 print(res)
输出:
3
1 #return是函数结束的标志 2 #函数内可以有多个return,但只要执行一次,函数体则结束 3 def f1(): 4 print(1) 5 return 'aa' 6 print(2) 7 return 'bb'