第三章 知识点总结

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)

 





















posted on 2019-03-14 20:01  zl666张良  阅读(124)  评论(0)    收藏  举报