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

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

  • 相关阅读:
    剑指Offer(Java版)第四十六题:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。
    剑指Offer(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
    剑指Offer(Java版)第四十四题:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
    剑指Offer(Java版)第四十三题:输入一棵二叉树,求该树的深度。 从根结点到叶结点依次经过的结点 (含根、叶结点)形成树的一条路径, 最长路径的长度为树的深度。
    剑指Offer(Java版)第四十二题:统计一个数字在排序数组中出现的次数。
    剑指Offer(Java版)第四十一题:输入两个链表,找出它们的第一个公共结点。
    剑指Offer(Java版)第四十题:在数组中的两个数字,如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。 并将P对1000000007取模的结果输出。 即输出P%1000000007
    剑指Offer(Java版)第三十九题:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符, 并返回它的位置, 如果没有则返回 -1(需要区分大小写).
    剑指Offer(Java版)第三十八题:把只包含质因子2、3和5的数称作丑数(Ugly Number)。 例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。 求按从小到大的顺序的第N个丑数。
    【微信支付】退款
  • 原文地址:https://www.cnblogs.com/zyycumt/p/11628268.html
Copyright © 2020-2023  润新知