一、集合
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
常用操作:
s = set([3,5,9,10]) #创建一个数值集合 t = set("Hello") #创建一个唯一字符的集合a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) t.add('x') # 添加一项 s.update([10,37,42]) # 在s中添加多项 # 使用remove()可以删除一项: t.remove('H') len(s) # set 的长度 x in s # 测试 x 是否是 s 的成员 x not in s # 测试 x 是否不是 s 的成员 s.issubset(t) # s <= t 测试是否 s 中的每一个元素都在 t 中 s.issuperset(t) # s >= t 测试是否 t 中的每一个元素都在 s 中 s.union(t) # s | t 返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t) # s & t 返回一个新的 set 包含 s 和 t 中的公共元素 s.difference(t) # s - t 返回一个新的 set 包含 s 中有但是 t 中没有的元素 s.symmetric_difference(t) # s ^ t 返回一个新的 set 包含 s 和 t 中不重复的元素 s.copy() # 返回 set “s”的一个浅复制
二、文件操作
1、对文件操作流程
(1)打开文件,得到文件句柄并赋值给一个变量
(2)通过句柄对文件进行操作
(3)关闭文件
代码:
f = open('lyrics') #打开文件first_line = f.readline()print('first line:',first_line) #读一行print('我是分隔线'.center(50,'-'))data = f.read()# 读取剩下的所有内容,文件大时不要用print(data) #打印文件f.close() #关闭文件
2、文件打开的模式:
r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】常用
w+,写读 清空追加写
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
rb
wb
ab
3、循环读取文件:
f = open(‘file’,encoding=’utf-8’,’r’)for line in f : print(line)
4、常用的方法
f = open(‘file’,encoding=’utf-8’,’r’)f.tell() # 获得文件指针位置f.seek(5) # 将指针定位到5f. truncate(10) # 从文件头开始读取10个字符f.close() # 关闭文件句柄
5、输出不换行
import sys,timefor i in range(20)sys.stdout.write(‘#’) time.sleep(0.1)
6、with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open('log','r') as f:
xxxxxx
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
with open('log1') as obj1, open('log2') as obj2:
三、函数
1、定义方式
def sayhi():#函数名 print("Hello, I'm nobody!") return 0sayhi() #调用函数
2、位置参数、默认参数、关键字参数、可变参数
位置参数:调用函数时根据函数定义的参数位置来传递参数。
def print_hello(name, sex):print 'hello %s %s, welcome to python world!' %(name, sex)# 两个参数的顺序必须一一对应,且少一个参数都不可以# print_hello('huihui', ‘男’)
关键字参数:用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
# print_hello(‘huihui’, sex=’男’)# print_hello(‘男’, name= huihui’)# print_hello(name= huihui’, sex=’男’)# print_hello(sex=’男’, name= huihui’)
以上都是可以的
有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的
默认参数:用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)
# 正确的默认参数定义方式--> 位置参数在前,默认参数在后
def print_hello(name, sex=’男’):
xxxxx
# 调用时不传sex的值,则使用默认值1
# print_hello(‘huihui’)
# 调用时传入sex的值,并指定为2
# print_hello(‘huihui’, ‘女’)
可变参数:定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
*args
def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式
print(name,age,args)
stu_register("Alex",22)
#输出
#Alex 22 () #后面这个()就是args,只是因为没传值,所以为空
stu_register("Jack",32,"CN","Python")
#输出
# Jack 32 ('CN', 'Python')
**kargs
def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
print(name,age,args,kwargs)
stu_register("Alex",22)
#输出
#Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空
stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
#输出
# Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}
同时使用*args和**kwargs时,必须*args参数列要在**kwargs前
3、返回值
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
如果未在函数中指定return,那这个函数的返回值为None
4、递归
def calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2))calc(10)
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
5、匿名函数
匿名函数就是不需要显式的指定函数
#这段代码
def calc(n):
return n**n
print(calc(10))
#换成匿名函数
calc = lambda n:n**n
print(calc(10))
冒号:之前的表示这个函数的参数。
匿名函数不需要return来返回值,表达式本身结果就是返回值。
6、高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def add(x,y,f):
return f(x) + f(y)
res = add(3,-6,abs)
print(res)
结果:9