本节知识点
- 集合及其操作
- 文件操作
- 函数与函数式编程
- 递归
一.集合及其操作
集合(set):把不同的元素组成一起形成集合,是python基本的数据类型。下面是set的基本操作:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#set_1 = set([123,345,678]) #创建set
l1 = [11,22,33,44,55]
l2 = [33,44,55,66]
l1_s = set(l1) #将列表转换成set
l2_s = set(l2)
#####关系测试
#交集:取出两者相同的部分
print(l1_s.intersection(l2_s)) #set([33, 44, 55])
print(l1_s & l2_s) #set([33, 44, 55])
#并集:两者合并起来去重
print(l1_s.union(l2_s)) #set([33, 66, 11, 44, 22, 55])
print(l1_s | l2_s) #set([33, 66, 11, 44, 22, 55])
#差集:两者之间一方有而另一方没有的
print(l1_s.difference(l2_s)) #set([11, 22])
print(l1_s - l2_s) #set([11, 22])
#子集 or 父集:两者有相互包含的关系
print(l1_s.issubset(l2_s)) #子集判断 False
print(l1_s.issuperset(l2_s)) #父集判断 False
#对称差集:去除交集之后剩下的集合元素
print(l1_s.symmetric_difference(l2_s)) #set([66, 11, 22])
print(l1_s ^ l2_s) #set([66, 11, 22])
#二者是否有交集
print(l1_s.isdisjoint(l2_s)) #返回True表示二者无交集,False表示有交集 False
基本操作:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
l1_s = set([123,456,891,22,33])
#add操作:单独添加一个集合元素的操作(集合也是无序的)
l1_s.add(888)
#update操作:添加多个集合元素
l1_s.update([333,1243,45,2332])
#remove()操作:删除其中的一项
l1_s.remove(45)
#len操作:确定元素个数
print(len(l1_s))
#in操作:成员判断操作
print "x" in l1_s #False
"x" not in l1_s
#pop操作:删除任意的一个,并返回删除的元素
print l1_s #set([33, 123, 456, 333, 1243, 22, 888, 891, 2332])
print(l1_s.pop()) #33
#discard在指定删除不存在的元素时不会报错(返回None),然而remove会报错
print(l1_s.discard("sdadasd")) #None
二.文件操作
###文件读取操作
#data = open("yesterday",encoding="utf-8").read() #读取所有的内容
# f = open("yesterday",encoding='utf-8')
# data = f.read()
# data2 = f.read()
# print(data)
# print("-----》》》",data2)
###文件写入操作
#写入操作:如果文件不存在则会创建新文件,否则会覆盖原来的文件
# f =open("yesterday","w",encoding='utf-8')
# f.write("我勒个去!!!")
# f.close()
###文件追加操作
f = open("yesterday","a",encoding='utf-8') #追加操作:不能执行读操作
f.write("呵呵呵呵呵\n呵呵呵呵!!!!")
f.close()
读取操作:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
f = open("yesterday","r",encoding='utf-8')
for i in range(5):
print(f.readline()) #读取前5行
for line in f.readlines(): #readlines()将文件按照列表读取
print(line.strip()) #去掉空格和换行
比较高效的读取方式:
count = 0
for line in f:
if count == 9: #读取到第九行,并打印
print("------分割线---------")
count += 1
continue
print(line.strip())
count += 1
其他方法:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
f = open("yesterday","r",encoding='utf-8')
print(f.tell()) #读取文件行位置(按字符个数计数的)
#print(f.readline()) #按行读取
print(f.read(5)) #读取前5个字符
print(f.tell())
f.seek(0) #seek只能够按照字符所在位置返回,不能够按行返回
print(f.encoding) #打印文件编码
print(f.fileno()) #返回文件在内存中的编号
print(f.name) #打印文件名称
#f.seekable() #用于终端设备文件读取的移回
print(f.readable()) #判断文件是否可读
print(f.writable()) #判断文件是否可写
print(f.flush()) #将内容从内存刷到硬盘
f.truncate(10) #截断
文件读写进阶:
打印进度条程序:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys,time
for i in range(50):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)
with操作:
with open("yesterday",'r',encoding='utf-8') as f\
,open("yesterday2",'w',encoding='utf-8') as f_new:
编码问题:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
#python 2.7的编码问题
#在cmd上可以,pycharm上不行
print(sys.getdefaultencoding())
s="哈喽啊!!"
s_to_gbk = s.decode('utf-8').encode('gbk')
print(s_to_gbk)
python3的写法:
#!/usr/bin/env python
# -*- coding:gbk -*-
import sys
print(sys.getdefaultencoding())
s = "哈哈哈,好屌啊!!"
s_to_gbk = s.encode('gbk')
print(s_to_gbk)
三、函数式编程
函数和过程:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 函数
def fun1():
'''testing'''
print("in the func1")
return 0
# 过程:没有return这个的函数
def func2():
'''testing2'''
print("in the funct2!")
x = fun1()
y = func2()
print x #0
print y #None
位置参数和关键字调用的使用:
1 2 3 4 5 6 7 8 9 |
|
默认参数的使用
def test(x,y=2):
print(x)
print(y)
参数组的应用 :
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 第一种参数组:接受N个位置参数转换成元组的方式
def test(*args):
print(args)
test(2, 3, 45) # 解决实参不固定的情况下就需要使用参数组来解决这个问题(*args)
#,输出为元组(2, 3, 45)
test(*[1, 2, 34, 5, 6, 432, 23]) # 结合列表 (1, 2, 34, 5, 6, 432, 23)
test([1, 2, 34, 5, 6, 432, 23]) #([1, 2, 34, 5, 6, 432, 23],)
# 第二种参数组
def test1(x, *args):
print(x)
print(args)
test1(1, 2, 3, 4, 56, 8, 79, 0) # 可以传递任意的参数值,传多少都可以
#1
#(2, 3, 4, 56, 8, 79, 0)
test1([1, 2, 34, 5, 6, 432, 23])
# [1, 2, 34, 5, 6, 432, 23]
# ()
test1(*[1, 2, 34, 5, 6, 432, 23])
# 1
# (2, 34, 5, 6, 432, 23)
# 第三种参数组:前俩中都是能转成不同形式(半元组和全元组形式),将N个关键字参数转换成键值对形式存放
# 可以接受字典的参数组
def test2(**kwargs):
print(kwargs)
# test2(name="alex",age=8,sex="male") #将N个关键字参数转换成键值对形式存放
test2(**{'name': 'wanghui', 'age': 22})
#{'age': 22, 'name': 'wanghui'}
# 结合位置参数使用
def test3(name, age=23, **kwargs): # 默认参数要放到参数组之前,否则会报错
print(name)
print(kwargs)
# test3('wanghui','cdfv','ewwqd') #这样错误
test3('wanghui', gender="male")
# wanghui
# {'gender': 'male'}
# 结合第一种参数组实验
def test4(name, age=22, *args, **kwargs):
print(name)
print(args)
print(kwargs)
# 结果会返回一个空的元组,因为后面的关键字参数被转成了字典,由于不存在位置参数,所以元组为空
test4('wanghui', age=25, hobby='IT', birthday=1991)
# wanghui
# ()
# {'hobby': 'IT', 'birthday': 1991}
高阶函数:变量可以指向函数
1 2 3 4 5 6 7 |
|