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.如何用文件
向操作系统发送打开文件的请求
r:原生打开文件,不转义
f=open(r'D:\tools\a.txt',mode='r')
f=>应用程序中的一个值=>OS打开的文件a.txt=>硬盘中的一块空间
data=f.read()
总结:文件处理步骤
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:只追加写
控制操作文件内容模式有两种:(不能单独使用,必须与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
    2).调用函数
    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'
 
 
原文地址:https://www.cnblogs.com/dingchuan/p/9325941.html