python学习国庆期间

  最近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__())

  1. 生成器

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函数重新定义,w1show)返回值(可以只掌握这个最简单的装饰器)

 

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()                     #调用主函数

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

猜你喜欢

转载自www.cnblogs.com/zyycumt/p/11628268.html