第三章 知识点总结
1、集合——可以修改的 元组不可以动
# 通过set给列表去重
list1 = [1, 2, 3, 4, 1, 2, 6, 7, 2, 1]
list2 = [4, 5, 6, 7, 3, 2]
set3 = (1, 2)
# 去重
print(list(set(list1)))
# 交集
print(set(list1).intersection(set(list2)))
print(set(list1) & set(list2))
# 并集
print(set(list1).union(set(list2)))
print(set(list1) | set(list2))
# 差集
print(set(list1) - set(list2))
print(set(list1).difference(set(list2)))
# 对称差集
print(set(list2).symmetric_difference(set(list1)))
# 子集 父集
print(set(list1).issuperset(set3))
print(set(set3).issubset(set(list1)))
set4 = {1, 2, 3, 4, 5, 6}
# 增加
set4.add("7")
print(set4)
set4.update([8, 9, 0])
print(set4)
# 删除
set4.remove(6)
set4.discard("9")
print(set4)
# 判断是否在集合中
print(8 in set4)
2、文件操作
(1)操作流程
打开——操作——关闭 就这三步
f = open("hello", encoding = "utf-8") # 拿到文件句柄
(2)有文件指针
f = open("hello", encoding="utf-8")
data = f.read()
print(data)
print("==================================")
data2 = f.read()
print(data2)
结果显示:
And so much pain my eyes refused to see
还有那么多痛苦 我的双眼却视而不见
There are so many songs in me that won't be sung
我有太多歌曲永远不会被唱起
I feel the bitter taste of tears upon my tongue
我尝到了舌尖泪水的苦涩滋味
The time has come for me to pay for yesterday
终于到了付出代价的时间 为了昨日
When I was young
当我年少轻狂
==================================
原因是:文件句柄,读到文件最后,指针就在最下面,所以第二次再去读文件,打印的结果为空。
(3)读、写、追加
1 f = open("hello", encoding="utf-8") 2 data = f.read() 3 print(data) 4 print("==================================") 5 data2 = f.read() 6 print(data2) 7 8 追加内容 9 f = open("hello", "a", encoding="utf8") 10 f.write("\n你这个巴\n") 11 12 写内容 13 f = open("hello", "w", encoding="utf8") 14 f.write("你这个巴!")
(4)通过文件句柄遍历文件
1 # 循环文件内容 效率较高且比较省内存的方法 2 f = open("hello", "r", encoding="utf8") #生成文件句柄 3 for line in f: 4 print(line.strip())
1 # 循环文件内容 效率较高且比较省内存的方法 2 f = open("hello", "r", encoding="utf8") #生成文件句柄 3 count = 0 4 for line in f: 5 count += 1 6 if count == 10: 7 print("\033[31;1m我这行没了!\033[1m".center(60, "=")) 8 continue 9 print(line.strip() + "这是第%d行"%count)
(5)打印进度
1 import sys, time 2 3 for i in range(0, 10): 4 sys.stdout.write("#") 5 sys.stdout.flush() 6 time.sleep(0.2)
(6)tell及seek的用法
1 # tell 查看指针在哪里 2 f = open("hello", "r", encoding="utf8") 3 f.readline() 4 print(f.tell()) 5 6 # seek指针移到哪里 7 f.seek(0) #回到文件首部 8 print(f.read())
(7)truncate的用法
# tell 查看指针在哪里 f = open("hello", "a", encoding="utf8") #"a" 方式要注意 f.seek(10) #移动到第十个字符 f.truncate(20) #无论移动到哪里 都是从开头算起开始截断
(8)r+模式 能读 能追加 写入的时候是在末尾追加内容
1 f = open("hello", "r+", encoding="utf8") #"a" 方式要注意 2 print(f.readline()) 3 print(f.readline()) 4 print(f.readline()) 5 print(f.tell()) 6 f.write("============================================") # 写就是在最后追加 7 print(f.readline()) # 继续从上次的指针出继续打印
(9)rb模式 wb模式 二进制进行读和写
1 f = open("hello2", "rb", encoding="utf8") 2 for line in f: 3 print(line.strip()) 4 5 ff = open("hello2", "wb") 6 ff.write("我爱北京天安门".encode("utf-8"))
(10)替换文件内容
1 # 替换文件内容后写入新的文件 2 f = open("hello", "r", encoding="utf8") 3 f_new = open("hello_new", "w", encoding="utf8") 4 5 for line in f: 6 if "我" in line: 7 line = line.strip().replace("我", "张飞") 8 f_new.write(line) 9 f.close() 10 f_new.close()
(11)修改文件 将源文件内容修改后写入到新的文件——删除旧文件——将新文件重命名为旧文件名 os模块必须注意
import os f = open("hello", "r", encoding="utf8") f_new = open("hello_new", "w", encoding="utf8") for line in f: if "我" in line: line = line.replace("我", "张飞") f_new.write(line) f.close() f_new.close() os.remove(r"D:\第三章\hello") os.rename(r"D:\第三章\hello_new", r"D:\第三章\hello")
(12)with的应用
作用1:避免忘记关闭文件;
作用2:同时打开多个文件;
1 import os 2 with open("hello", "r", encoding="utf8") as f, \ 3 open("hello2", "w", encoding="utf8") as f1: 4 for line in f: 5 if "张飞" in line: 6 line = line.replace("张飞", "关羽") 7 f1.write(line) 8 os.remove(r"D:\第三章\hello") 9 os.rename(r"D:\第三章\hello2", r"D:\第三章\hello")
3、字符编码+++++++++++++++++++++重中之重
(1)python2中 中间类型是unicode类型
![]()
hello = u'您好'
这个时候hello就是unicode类型的编码
(2)python3中 中间类项是bytes类型
4、函数及函数式编程
(1)为什么使用函数
定义一个函数,方便后期再次应用和调用
(2)return返回值 可以是单个值 可以是多个值 当是多个值的时候结果是个元祖
有返回值的原因是——想要后期用返回值的结果
(3)形参和实参
形参是定义函数时设定的参数
实参是实际参与运算时设定的参数
(4)在给函数传递参数时,可以按位置传递参数,也可以按照关键字传递参数 出现混合参数传递时,关键字参数要在位置参数后面
1 def test(x, y, z): 2 print(x, y, z) 3 4 # 按照位置 5 test(1, 2, 3) 6 7 # 按照关键字传递参数 8 test(x = 6, y = 7, z = 8) 9 10 # 混合传递参数 但是关键字参数要放在位置参数后面,不然会报错 11 test(1, z = 6, y = 8)
(5)默认参数 在赋值时填入参数则按传递参数进行运算;若是不传递参数则是按照默认参数的值进行运算 ;
特点:默认参数非必须传递;
应用场景:软件安装时的默认安装;链接数据的默认端口号;
1 def test(x, y, z, o = 10): 2 print(x, y, z, o) 3 4 # 按照位置 5 test(1, 2, 3, 20) 6 7 # 按照关键字传递参数 8 test(x = 6, y = 7, z = 8) 9 10 # 混合传递参数 但是关键字参数要放在位置参数后面,不然会报错 11 test(1, z = 6, y = 8)
(6)*args和**kwargs的用法
1 # *args **kwargs 的用法 2 def test(x, y, z = 10, *args, **kwargs): 3 print(x, y ,z) 4 print(args) # 得到的结果是元组 5 print(kwargs) # 得到的结果是字典 6 7 test(1, 2, 3, 4, 5, name = "alex", age = 30, sex = "female")
http://www.cnblogs.com/Eva-J/articles/7125925.html
(7)全局变量和局部变量——作用域
1>函数就是其作用域
1 name = "alex" 2 def change_name(l): 3 print("before name %s"%l) 4 l = l.upper() 5 age = 30 6 print("after name %s"%l) 7 change_name(name) 8 print(age) # 就会报错 因为找不到 age只在函数中 9 print(name)
1 name = "alex" 2 def change_name(l): 3 print("before name %s"%l) 4 l = l.upper() 5 age = 30 6 print("after name %s"%l) 7 change_name(name) 8 print(age) # 就会报错 因为找不到 age只在函数中 9 print(name)
2>从局部修改全局变量的值——global 尽量不要这么干 因为你不知道你的函数在多少个地方去调用
在子程序中定义的变量叫局部变量;在程序一开始定义的变量叫全局变量;
5、递归函数
(1)必须要有结束条件;
(2)每次进入更深一层递归时,问题规模相比上次递归要减少;
(3)递归效率不高,递归层次过多会导致栈溢出;
6、global、nolocal的区别和用法
global:是从局部变量修改全局变量。
nolocal: 是从局部变量的内层,修改外层的局部变量。
1 def f1(): 2 a = 1 3 def f2(): 4 nonlocal a 5 a = 2 6 f2() 7 print('a in f1 : ', a) 8 9 f1()
1 name = "fucker" 2 # 定义hello方法 3 def hello(): 4 global name 5 name = "alxe" 6 print("修改完毕") 7 hello() 8 print(name)

浙公网安备 33010602011771号