最近python学习逐渐开始接触一些比较难的内容了。
学习笔记9.22.2019
1、文件操作:创建,写内容,读文件;read():可以指定读几个字符
f=open('test.txt','r',encoding='utf-8')
# f.write('无aabbcc')
ret=f.read(2)
print(ret)
f.close()
2、seek()和tell()
f=open('test.txt','r',encoding='utf-8')
# f.write('aabbcc')
# print(f.tell()) #按字节判断当前指针位置
# ret=f.read(2) #按字符来拿数据
# print(f.tell())
f.seek(3)#指定当前指针位置,一个中文占三个字节
print(f.read())
f.close()
3、truncate():改写文件,只留下指针前面的部分
f=open('test.txt','r+',encoding='utf-8')
f.seek(3)
f.truncate()
f.close()
9.27.2019这一节课要学的内容
迭代器:是访问集合元素的一种方法,便于访问较大的文件
生成器:一个函数返回一个迭代器(包含yield语法),保持中断的状态,回来再进入这个循环
装饰器:
递归:
算法基础:二分查找,二维数组转换
正则表达式
1、迭代器
Eg:
Names=iter([‘alex’,’jack’,’list’])
Print(names)
Prin(names.__next__())
- 生成器
Eg:
def cash_money(amount):
while amount>0:
amount -=100
yield 100
print("又来取钱了")
atm=cash_money(500)
print(atm.__next__())
print(atm.__next__())
print('回家')
print(atm.__next__())
$使用yield实现单线程中的异步并发效果
import time
def consumer(name):
print("%s准备吃包子啦!"%name)
while True:
baozi=yield
print("包子[%s]来了,被[%s]吃了!"%(baozi,name))
def producer(name):
c=consumer('A')
c2=consumer('B')
c.__next__()
c2.__next__()
print("老子准备做包子了")
for i in range(10):
time.sleep(1)
print("做了2个包子")
c.send(i)
c2.send(i)
producer('alex')
装饰器(给已经实现的功能扩展别的功能)实现(没看明白。。)
def login(func):
def inner(arg):
print("passed user vertification")
func(arg)
return inner
@login
def TV(name):
print("welcome [%s] to tv page!"%name)
TV('alex')
最简单的一个例子:
def w1(main_func):
def outer(*request,**kargs):
print('before')
main_func(*request,**kargs)
print('after')
return outer
@w1
def show():
print('show')
show()
#@w1的用处:执行w1,并把自己装饰的函数的函数名当做参数;show函数重新定义,w1(show)返回值(可以只掌握这个最简单的装饰器)
10.3.2019递归:直接或间接的调用自身算法;必须有一个明确的递归结束条件;递归次数过多会造成栈溢出。
斐波那契数列的例子:(打印出0-30间的斐波那契数列)
def func(arg1,arg2,stop):
if arg1==0:
print(arg1,arg2)
arg3=arg1+arg2
print(arg3)
if arg3<stop:
func(arg2,arg3,stop)
func(0,1,30)
算法基础:二分查找
def binary_search(data,find_n):
mid=int(len(data)/2)
if len(data)>1:
if data[mid]>find_n:
print("data is in the left of %s"%data[mid])
binary_search(data[:mid],find_n)
elif data[mid]<find_n:
print("data is in the right of %s"%data[mid])
binary_search(data[mid:],find_n)
else:
print("data is %s"%data[mid])
else:
print("cannot find the data")
if __name__=='__main__':
data=list(range(1,600000))
binary_search(data,65535)
算法二维数组旋转:
生成二位数组:
Data=[[col for col in range(4)] for row in range(4)]
Print(data) #生成4*4的二维数组
for r_index,row in enumerate(data):
for c_index in range(r_index,len(row)):
tmp=data[r_index][c_index]
data[r_index][c_index]=data[c_index][r_index]
data[c_index][r_index]=tmp
for r in data:
print(r)
#实现转置二维数组
正则表达式
import re
m=re.match("abc","abcdef")
print(m.group())#返回匹配的东西
Eg2:
import re
# m=re.match("abc","abcdef")
# m=re.match("[0-9]","334789abcsd5fd") #匹配一次
m=re.match("[0-9]{0,10}","334789abcsd5fd")#匹配0-10次
m=re.match("[0-9]{6}","334789abcsd5fd")#匹配6次
if m:
print(m.group())
运行结果:334789
Eg3:
import re
m=re.findall("[0-9]{1,10}","334789abcsd5fd")
if m:
print(m)
结果:
['334789', '5']
Eg4:
import re
m=re.findall("[a-zA-Z]{1,10}","334789abcsd5fd")
if m:
print(m)
运行结果:['abcsd', 'fd']
Eg5:
import re
m=re.findall("[1-9a-zA-Z]{1,10}","334789abcsd5fd")
if m:
print(m)
运行结果:['334789abcs', 'd5fd']
Eg6:
import re
m=re.findall(".*","334789abcsd5fd")#.*匹配0次或多次
if m:
print(m)
运行结果:['334789abcsd5fd', '']
m=re.findall(".+","334789abcsd5fd")#.+匹配1次或多次
if m:
print(m)
运行结果:['334789abcsd5fd']
例子:
开发一个计算器,计算1-2*((60-30+(-40/5)*(9-2*5/7+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
实现加减乘除和括号优先级解析,不能使用现有函数计算,可使用递归和正则表达式。(这个实验有点难度,参考了别的大佬的代码-_-||)
import re #导入正则表达式
def func(a): #func函数实现总的计算框架,包含了下面定义的几个函数
while True:
if '*' in a:
c=a.split('*') #同级运算的乘除要按顺序来,若乘法前面是除法,应该先算除法
if '/' in c[0]:
a=div(a)
else:
a=mul(a)
elif '/' in a:
a=div(a)
else:
a=add(a)
return a
def mul(a): #定义乘法运算
b=re.search(r'd+.?d**-?d*',a) #正则表达式,前面的r代表后面只需跟原生字符串,例如:可以匹配2.3*-5
if b:
b=b.group()
l=b.split('*')
c=float(l[0])*float(l[1])
res=re.sub(r'd+.?d**-?d+.?d*',str(c),a,1)#用计算后的值替换原来式子里的部分值
return res
def div(a): #定义除法运算
b=re.search(r'd+.?d*/-?d+.?d*',a) #匹配含有除法的式子
if b:
b=b.group()
l=b.split('/')
c=float(l[0])/float(l[1])
res=re.sub(r'd+.?d*/-?d+.?d*',str(c),a,1)
return res
def add(a): #定义加法运算,减法可以看做特殊的加法
if '--' in a:
a=a.replace('--','+')
b = re.findall(r'-?d+.?d*',a) #找出所有正数或负数
c=0
for i in b:
c+=float(i)
return c
def calculate(): #定义接收输入的函数
a=''.join(input('请输入计算公式:').split())
while True:
if '(' in a:
b=re.search(r'(([^()]+))',a) #找出最小的括号单位式子
if b:
c=b.group()
d=func(c)
a=re.sub(r'(([^()]+))',str(d),a,1)
else:
print(func(a))
break
calculate() #调用主函数