1、集合
集合是无序的,不重复的数据组合,集合的表示如下:
list_1 = set(list_1)
1.1、交集是两个列表都有元素
list_1 & list_2
1.2、并集是两个列表合并起来并取出重复的元素
list_1 | list_2
1.3、差集是list_1减去和list_2中共有的元素,意思就是我这有你没有的元素
list_1 - list_2
1.4、对称差集是:list_1和list_2中相同的元素去掉
list_1 ^ list_2
1.5、集合中加元素:
list_1.add(999) #加一个元素 list_1.update([888,777,555])集合中加很多元素
1.6、集合中删元素:
list_1.remove(999)
1.7、测试元素是否在集合中:
x in s x no in s
2、文件
2.1、打开文件,变成文件句柄
f = open("test",'r',encoding="utf-8") 只读方式打开
f = open("test",'r+',encoding="utf-8") 读写:可读,可追加
f = open('test','w',enconding="uft-8") 只写模式,文件没有就创建,有的话会直接覆盖掉原有文件的写方式
f = open('test','w+',enconding="uft-8") 写读,还是会有覆盖情况
f = open('test','a',enconding='utf-8') 只写模式,文件没有就创建,不会覆盖的追加模式
2.2、读文件
f.read() 会将整个文件读到内存中,大文件不适合
print(f) 打印出整个文件
first_line = f.readline() 打印出一行
f.close() 关闭文件
2.3、大文件读出来,不用.read()方法
可以将大文件写一行到内存中,读一行出来,经文件变成迭代器:
for line in f:
print(line.strip())
2.4、在打印的时候,第10行输出标注
count = 0
for line in f:
if count == 9:
print(‘-----------分割线------------’)
count += 1
continue #continue下边的代码不会执行,直接跳转到for语句
#break语句,打破了最小封闭for或while循环
print(line.strip())
count +=1
2.5、文件指针
f.seek() 当文件读完之后,指针就会知道内存中最后的位置,可以通过f.seek(0)将指针重新到头来第一个字符的位置
f.seek(10)
f.tell() 指针现在位置
f.flush() 强制刷新,从内存到硬盘
f.read(5) 读出前5个字符
2.6、文件修改,shell sed方法,原理:对原有文件内容进行更改,然后写到新的文件中。
import sys
f = open("test",'r',encoding='utf-8')
f_new = open("test1",'w',endcong='utf-8')
find_str = sys.argv[1]
replace_str = sys.argv[2]
for line in f:
if "hello" in line:
line = line.replace(find_str,replace_str)
f_new.write(line)
f.close()
f_new.close()
从以上看起来,文件的修改貌似只有COPY到另一个文件了,那么用r+是不是就可以解决了。
2.7 、with open打开文件
with open('test','r',encoding='utf-8') as f:
for line in f:
print(line.strip())
当wIth代码执行完毕时,内部会自动关闭并释放文件资源。
with open("test") as f, open('test1') as f1:
pass
可以同时打开多个文件。
3、函数
3.1、函数就是模板,可以调用
def func1()
print("in the func1")
return 0
x=func1()
print("form func1 return is %s" %x)
执行完之后,x是0,因为return返回的是0
3.2、带时间戳的文件读写,函数里调用函数
import time
def logger():
time_format = '%Y-%m-%d %X'
time_current = time.strftime(time_format)
with open('a.txt','a+') as f:
f.write('%s and action ' %time_current)
def test1():
print("test1 starting action..../n")
logger()
3.3、函数中其实返回的是一个元组,可以返回很多元素,但是会变成一整个元组
def test():
print('in the test3')
return 1, 'hello',['world','test2'],{'name':'alex'}
x=test()
3.4、函数中与形参顺序无关,同时关键参数是不能写到位置参数前面,关键参数比如就是 y=2,位置参数就是字符串
def test(x,y)
print(x)
print(y)
test(2,y=1) #y=1是不能写到2之前的
3.5、参数传入
def test(*args) #此种函数只接收位置参数,转换成元组
print(args)
test(1,3) 结果 (1,3)
test([1,2,2,4,5]) 结果 ([1,2,2,4,5])
通过以上可知里边的元素,直接就变成了外挂一个括号
def test2(**kwargs):
print(kwargs)
print(kwargs['name'])
print(kwargs['age'])
print(kwargs['sex'])
test2(name='alex',age=22,sex='F')
输入结果是一个字典,字典可以调用相关的KEY,出来VALUE
def test4(name,age=18,**kwargs):
print(name)
print(age)
print(kwargs)
logger("TEST4")
def logger(source):
print("from %s" %source)
test4('alex',sex='m',hobby='tesla',age=3)
3.6、递归
在函数内部,可以调用其他函数,如果一个函数在内部调用自身,这个函数就叫递归函数
def calc(n):
print(n)
return calc(n+1)
calc(0) 为了防止内存溢出,最多递归999次,意思输出到998就结束了
def calc(n):
print(n)
if int(n/2) > 0:
retrun calc(int(n/2))
print("->",n)
calc(10)