Python大神成长之路: 第三次学习记录 集合 函数 装饰 re

时间:2022-02-19 23:38:53
学习记录day03
 
字符串可以直接切片,But字符串不可修改
字符串修改:生成了一个新的字符串
LIst修改,在原基础上修改(原内存上)
 
 
集合是一个无序的,不重复的数据组合,它的主要作用如下:
 
去重,把一个列表变成集合,就自动去重了
关系测试,测试两组数据之前的交集、差集、并集等关系
dict\list\set.. 全用 x in ..计算,,dict.has_key等已废
 
文件:
fp = open() #文件句柄,文件句柄里存的内容: 文件信息、在磁盘上的开始位置、内存等
fp.tell() 查看当前位置
fp.seek(30) 跳到30
for line in fp:
print(line) ###可以直接这样。。

  

###
fp.flush() 强制刷到磁盘,默认是Buffer满了刷
r+ 读写(也没什么卵用,可读,追加写),w+ 写读(没卵用),a+ 追加读
rb 二进制格式打开。网络传输
wb 二进制格式写入。fp.write("".encode())
进度条:
for i in range(50):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.1)

  

文件:增删改·
循环写入一个新文件,需要修改的行替换后写入
for line in fp:
    if "helooxxx" in line:
        line = line.replace()
    fp2.write(line)    

  

 
with语句
 
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
 
with open('log','r') as f:
...
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
 
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
 
with open('log1') as obj1, open('log2') as obj2:
pass
 
开发规范:一行最好不要超过80个字符
 
编码转换:encode decode
#-*-encoding:utf8 -*-
s= "你好"
s.decode("utf-8"):Utf8转到unicode
s.encode("gbk") unicode 转到 gbk

  

 
decode 转码成Unicode, encode:unicode编码到其他编码
 
unicode utf8可以直接打印,GBK必须转换。
将GBK转换为utf-8: 1、GBK-->Unicode--->UTF-8,s.decode("gbk").encode("utf-8")
========================
========================
函数:
编程方法:1、面向对象;2、面向过程;3、函数式编程
 
参数: 位置参数调用:与形参一一对应、关键字调用:与顺序无关
关键字参数不能写在位置参数前面
 
 
ef f(x, *args):
#tuple
    print args
f(1,2,3,"h","a")
f([1,2,3])
f(*[8,3,"b"])
def f4(**kwargs):
#Dictionary: 把N个关键字转换为字典方式
    print(kwargs)
 
f4(name="Alex", age=8, sex="N")

  

作用域:
list tuple dictionary 可以直接在内层函数中使用,其他变量则不行。函数内的list\tuple\dictionary无法到上层使用
全局与局部变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
=======================
递归函数:自爆
函数式编程(Erlang,Haskell, ): 如:y=2x, x确定后,一定有一个与之对应的值
函数: y=f(2,4), if a>7...
当然我们还是用面向对象。
===================
高阶函数:
参是一个函数的,叫高阶函数
=======================
 
 
 
 
list_1 = [1,6,5,4]
list_1 = set(list_1)
list_2 = set([8,9,5,10,1])
print (list_1, list_2)
print(list_1.intersection(list_2)) #交集
print(list_1.union(list_2)) #并集
#in list_1 but not in list_2
print(list_1.difference(list_2)) #差集, list_1里有但2里没有
list_3 = set([1,6])
print(list_1.issubset(list_3)) #子集
print(list_1.issuperset(list_3)) #父集
##对称差集,去掉交集后
print(list_1.symmetric_difference(list_2))
print("-----")
list_4 = set([90])
print(list_1.isdisjoint(list_4)) #是否没有交集
 
####集合运算2#:
print(list_1,list_2)
print(list_1 | list_2) #并集
print(list_1 & list_2) #交集
print(list_1 - list_2) #差集
print(list_1 ^ list_2) #对称差集
 
list_1.add('x')
list_1.update(["a","b","c","x"])
 
print(list_1)
print ("a" in list_1)

  

 
装饰器:
定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能。
原则:1、不能修改被装饰的函数的源代码
2、不能修改被装饰的函数的调用方式
Python内存自动回收机制。
到底怎么个回收法呢? 有一个定时器,会不断的扫描这些字符串、值等,如果发现某个没有被引用,则回收掉。如:del(var1) 删除的是var1这个变量名,这个变量对应的值回收的两种情况1、程序结束;2、定时扫描到值没有任何地方引用。
 
嵌套函数: 在函数内再定义函数
def foo():
print('in the foo')
def bar():
print('in the bar')
 
高阶函数 + 嵌套函数 ---> 装饰器
@auth #index = auth(index)
def index()
 
生成器:
#列表生成式
b=[i*2 for i in range(1000000)] ##会生成列表,速度慢
b=(i*2 for i in range(10000000)) ##瞬间完成,并不会真的生成列表,在取值的时候才会生成
生成器:只有在调用时才会生成相应的数据。只记住当前位置。只有一个__next__(),python2.7:next()
 
b.__next__()
next(b)
def fib(max):
n, a, b = 0, 0 ,1
while n < max:
#print(b)#
yield b ###生成器
a, b = b, a+b
n +=1
return "--------------------done"
 

 

re

re.sub() 替换

re.match()

re.find() final

re.search()

 

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行

'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)

'$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以

'*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']

'+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']

'?'     匹配前一个字符1次或0次

'{m}'   匹配前一个字符m次

'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']

'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'

'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c

 

 

'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的

'\Z'    匹配字符结尾,同$

'\d'    匹配数字0-9

'\D'    匹配非数字

'\w'    匹配[A-Za-z0-9]

'\W'    匹配非[A-Za-z0-9]

's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'

 

'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}

 

 

re.split(r’\\’, r’a\b\c’)    

或者:

re.split(‘\\\\’, r’a\b\c’)

 

re.search(‘a’, r’a\A\abc’, flags=re.I).  忽略大小写

多行:

re.search(‘2’, ‘abc\n1234’, flags=re.M)

re.search(‘2’, ‘abc\n1234’, flags=re.S)

^ 以开头、 不包含