• 内置函数 匿名函数 递归函数


    今天学习内容如下:

    1.通常C/C++中,"/ " 算术运算符的计算结果是根据参与运算的两边的数据决定的,比如:6 / 3 = 2 ; 6,3都是整数,那么结果也就是整数2;6.0 / 3.0 = 2.0 ; 6.0,3.0是浮点数,那么结果也是浮点数2.0,跟精确的说,只要" / " 两边有一个数是浮点数,那么结果就是浮点数在Python2.2版本以前也是这么规定的,但是,Python的设计者认为这么做不符合Python简单明了的特性,于是乎就在Python2.2以及以后的版本中增加了一个算术运算符" // "来表示整数除法,返回不大于结果的一个最大的整数,而" / " 则单纯的表示浮点数除法,但是,为了折中,所有2.X版本中,也是为了向后兼容,如果要使用" // ",就必须加上一条语句:from __future__ import divisio一看到这句," / "就表示 浮点数除法,返回浮点结果;" // "表示整数除法。但是,预计在Python3.0发布时,就没有这种折中情况了,," / "就一定表示 浮点数除法,返回浮点结果;" // "表示整数除法

    2.复习进度条

    import time
    for i in range(0,101,2):
        time.sleep(0.1)
        char_num = i//2
        per_str = '
    %s%%  : %s
    ' %(i, '*' * char_num)     #此处作用是字符串太长换行
        if i == 100 else '
    %s%% :%s' %(i,'*'*char_num)#
        print(per_str,end ='',flush = True)
    print(123)
    # for i in range(10):
    #
    #     s = 'ss%s
    '%i
    #     print(s,end = '')
    View Code

     3.内置函数

    # exec('print(123)')
    # eval('print(123)')
    # print(eval('1+2+3'))# 有返回值6
    # print(exec('1+2+3'))#没有返回值None
    # exec和eval都可以执行 字符串类型的代码
    # eval有返回值  —— 有结果的简单计算
    # exec没有返回值   —— 简单流程控制
    # eval只能用在你明确知道你要执行的代码是什么
    # code = '''for i in range(10):
    #     print(i*'*')'''
    # exec(code)
    
    
    # code = 'for i in range(10):print(i)'
    # # compilel = compile(code,'','exec')
    # # exec(compile)
    # exec(code)
    
    # code = '1 + 2 + 3'
    # compile2 = compile(code,'','eval')
    # print(eval(compile2))
    # eval(compile2)
    # print(eval(code))
    
    #
    
    # name #执行后name变量有值
    # "'pythoner'"
    
    
    
    # 复数 —— complex
    # 实数 : 有理数
    #         无理数
    # 虚数 :虚无缥缈的数
    # 5 + 12j  === 复合的数 === 复数
    # 6 + 15j
    
    # 浮点数(有限循环小数,无限循环小数)  != 小数 :有限循环小数,无限循环小数,无限不循环小数
    # 浮点数
        #354.123 = 3.54123*10**2 = 35.4123 * 10
    # f = 1.781326913750135970
    # print(f)
    
    # print(bin(10))
    # print(oct(10))
    # print(hex(10))
    
    # print(abs(-3))
    # print(divmod(2,3))# div除法 mod取余
    # print(divmod(3,5))
    
    # print(round(2.4545))
    # print(round(2.8546655444,5))
    # print(pow(2,5))
    # print(pow(5,4))
    # print(pow(1,4,1))
    # print(pow(2,4,2))#前两个数幂运算除以三个数取余
    
    # ret = sum([1,2,3,4,5,6],10)
    # print(ret)
    
    print(min(1,2,3,4))
    print(min(1,2,3,4,-3))
    print(min(1,2,3,4,-3,key = abs))
    print(min([1,2,3,4]))
    print(max(1,2,3,4))
    print(max(1,2,3,4,-3))
    print(max(1,2,3,4,-3,key = abs))
    print(max([1,2,3,4]))
    View Code
    # list = [1,2,3]
    # l = list.reverse()
    # print(l)
    # # print(list)
    
    # list = [1,2,3]
    # l = reversed(list)
    # print(l)
    # print(l.__next__())
    
    # l = [1,2,3,4,4,5,8]
    # s = slice(1,7,2)
    # print(s)
    # print(l[s])
    # print(l[1:7:2])
    
    # print(format('test', '<10'))
    # print(format('test', '>40'))
    # print(format('test', '^40'))
    
    # 网络编程 只能传二进制
    # 照片和视频也是以二进制存储
    # html网页爬取到的也是编码
    
    # b_array = bytearray('你好',encoding = 'utf-8')
    # print(b_array)
    # print(b_array[0])
    # b_array[1]=255
    # print(b_array)
    
    
    # print(ord('a'))
    # print(ord('1'))
    # print(chr(97))
    # print(ord('好'))
    
    print(repr(1))
    print(str(1))
    print(repr('1'))
    print(str('1'))
    name = 'egg'
    print('你好%r'%name)
    
    name = 'egg'
    print('你好%s'%name)
    View Code
    # print(all(['a','','e']))
    # print(all(['a','e']))
    # print(all(['','e']))
    #
    # print(any(['a','','e']))
    # print(any(['a','e']))
    # print(any([0,'e']))
    #
    
    # l = [1,2,3,4]
    # s = [1,2,3,4]
    # m = [1,2,3,[4,5]]
    # n = {1:2,3:4}
    # for i in zip(l,s,m,n):
    #     print(i)
    #
    
    # def func(x):
    #     # return x % 2 == 1
    #     if x > 10:
    #         return x
    # ret = filter(func,[1,23,4,5])
    # print(ret)
    # for i in ret:
    #     print(i)
    
    # def is_not_empty(s):
    #     return s and len(s.strip()) > 0
    # ret = filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
    # print(ret)
    # for i in ret:
    #     print(i)
    
    # filter 执行了filter之后的结果集合 <= 执行之前的个数
            #filter只管筛选,不会改变原来的值
    # map 执行前后元素个数不变
          # 值可能发生改变
    # from math import sqrt
    # def func(num):
    #     res = sqrt(num)
    #     return res % 1 == 0
    # ret = filter(func,range(1,101))
    # for i in ret:
    #     print(i)
    
    # ret = map(abs,[12,-3,4,5])
    # print(ret)
    # for i in ret:
    #     print(i)
    
    # l = [1,23,4,-5,-6,6]
    # # print(l.sort(key = abs)) # 在原列表的基础上进行排序
    # # print(l)
    #
    # print(sorted(l,key = abs,reverse = True))# 生成了一个新列表 不改变原列表 占内存
    # print(l)
    
    
    l = ['  ', '2','34','dfsdsdffsd']
    print(sorted(l,key = len))
    View Code

    4.匿名函数

    # def add(x,y):
    #     return x+y
    # add = lambda x,y:x+y
    # print(add(1,2))
    #
    # dic = {'key1':1,'key2':20,'key3':3}
    # print(max(dic,key = lambda a:dic[a]))
    
    #两道练习题目
    # 1.下面程序的输出结果是:
    # d = lambda p:p*2
    # t = lambda p:p*3
    # x = 2
    # x = d(x)
    # x = t(x)
    # x = d(x)
    # print(x)
    # 2.现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
    
    # ret = zip(('a','b'),(('c'),('d')))
    # # def func(x):
    # #     return {x[0]:x[1]}
    # res = map(lambda x:{x[0]:x[1]},ret)
    # # for i in ret:
    # #     print(i)
    # print(list(res))
    
    
    # 3.以下代码的输出是什么?请给出答案并解释。
    # def multipliers():
    #     return [lambda x:i*x for i in range(4)]
    # print([m(2) for m in multipliers()])
    # 请修改multipliers的定义来产生期望的结果。
    
    def func():
        return 'ss'*i
    for i in range(4):
        func()
    
    print(func())
    # def multipliers():
    #     return [lambda x:0*x,lambda x:1*x,lambda x:2*x,lambda x:3*x]
    # print([m(2) for m in lambda x:0*x,lambda x:1*x,lambda x:2*x,lambda x:3*x])
    
    
    
    # dic={'k1':10,'k2':100,'k3':30}
    # def func(key):
    #     return dic[key]
    # print(max(dic,key=func))   #根据返回值判断最大值,返回值最大的那个参数是结果
    # print(max(dic,key=lambda key:dic[key]))
    # max([1,2,3,4,5,-6,-7],key=abs)
    
    # ret = map(abs,[-1,2,-3,4])
    # for i in ret:
    #     print(i)
    
    # def func(x):
    #     return x**2
    # ret = map(func,[-1,2,-3,4])
    # for i in ret:
    #     print(i)
    #
    # ret = map(lambda x:x**2,[-1,2,-3,4])
    
    
    # def func(x):
    #     return x>10
    #
    # res = filter(func,[5,8,11,9,15])
    # for i in res:
    #     print(i)
    
    
    # min max filter map sorted —— lambda
    
    # d = lambda p:p*2
    # t = lambda p:p*3
    # x = 2
    # x = d(x) #x = 4
    # x = t(x) #x = 12
    # x = d(x) #x = 24
    # print(x)
    
    # ret = zip((('a'),('b')),(('c'),('d')))
    # ret = map(lambda t:{t[0]:t[1]},ret)
    # print(list(ret))
    
    #现有两元组(('a'),('b')),(('c'),('d')),
    # 请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
    
    # max min sorted filter map
    # 匿名函数 == 内置函数
    # zip
    # ret = zip((('a'),('b')),(('c'),('d')))
    # res = map(lambda tup:{tup[0]:tup[1]},ret)
    # print(list(res))
    
    # def multipliers():
    #     return [lambda x:i*x for i in range(4)]
    # print([m(2) for m in multipliers()])
    View Code

     5.练习题

    # 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
    name=['alex','wupeiqi','yuanhao','nezha']
    # def func(item):
    #     return item+'_sb'
    # ret = map(func,name)   #ret是迭代器
    # for i in ret:
    #     print(i)
    # print(list(ret))
    
    # ret = map(lambda item:item+'_sb',name)
    # print(list(ret))
    
    # 4.用filter函数处理数字列表,将列表中所有的偶数筛选出来
    # num = [1,3,5,6,7,8]
    # def func(x):
    #     if x%2 == 0:
    #         return True
    # ret = filter(func,num)  #ret是迭代器
    # print(list(ret))
    #
    # ret = filter(lambda x:x%2 == 0,num)
    # ret = filter(lambda x:True if x%2 == 0 else False,num)
    # print(list(ret))
    
    # 5.随意写一个20行以上的文件
    # 运行程序,先将内容读到内存中,用列表存储。
    # 接收用户输入页码,每页5条,仅输出当页的内容
    
    # with open('file',encoding='utf-8') as f:
    #     l = f.readlines()
    # page_num = int(input('请输入页码 : '))
    # pages,mod = divmod(len(l),5) #求有多少页,有没有剩余的行数
    # if mod:           # 如果有剩余的行数,那么页数加一
    #     pages += 1    # 一共有多少页
    # if page_num > pages or page_num <= 0:   #用户输入的页数大于总数或者小于等于0
    #     print('输入有误')
    # elif page_num == pages and mod !=0:    #如果用户输入的页码是最后一页,且之前有过剩余行数
    #     for i in range(mod):
    #         print(l[(page_num-1)*5 +i].strip())  #只输出这一页上剩余的行
    # else:
    #     for i in range(5):
    #         print(l[(page_num-1)*5 +i].strip())  #输出5行
    
    # 6.如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格
    # portfolio = [
    #     {'name': 'IBM', 'shares': 100, 'price': 91.1},
    #     {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    #     {'name': 'FB', 'shares': 200, 'price': 21.09},
    #     {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    #     {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    #     {'name': 'ACME', 'shares': 75, 'price': 115.65}
    # ]
    
    # 6.1.计算购买每支股票的总价
    # ret = map(lambda dic : {dic['name']:round(dic['shares']*dic['price'],2)},portfolio)
    # print(list(ret))
    
    # 6.2.用filter过滤出,单价大于100的股票有哪些
    # ret = filter(lambda dic:True if dic['price'] > 100 else False,portfolio)
    # print(list(ret))
    # ret = filter(lambda dic:dic['price'] > 100,portfolio)
    # print(list(ret))
    View Code

    6.递归函数

    初识递归

    递归的定义——在一个函数里再调用这个函数本身

    现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

    刚刚我们就已经写了一个最简单的递归函数。

    def story():
        print('sdf')
        story()
    story()
    View Code

    递归的最大深度——997

    正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997

    我们可以通过这种方式来修改递归的最大深度

    import sys
    sys.setrecursionlimit(500)
    def foo(n):
        print(n)
        n += 1
        foo(n)
    foo(1)
    View Code

    7.二分查找算法

    # 我们学习的算法 都是过去时
    # 了解基础的算法 才能创造出更好的算法
    # 不是所有的事情都能套用现成的方法解决的
    # 有些时候会用到学过的算法知识来解决新的问题

    # 二分查找算法 必须处理有序的列表
    # l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    # 5000000 4999998
    # 代码实现
    # 二分查找算法 必须处理有序的列表
    l = [1,2,3,4,5,6,7,8,9,10]
    def find(l,aim):
        mid_index = len(l)//2
        if l[mid_index] < aim:
            new_1 = l[mid_index+1 :]
            find(new_1,aim)
        elif l[mid_index] > aim:
            new_1 = l[:mid_index]
            find(new_1,aim)
        else:
            print('找到了',mid_index,l[mid_index])
    
    find(l,4)
    简单版二分法
    def find(l,aim,start = 0,end = None):
        end = len(l) if end is None else end
        mid_index = (end -start)//2+start
        if start <= end:
            if l[mid_index] < aim:
                return find(l,aim,start = mid_index+1,end = end)
            elif l[mid_index] > aim:
                return find(l, aim, start=start, end=mid_index-1)
    
            else:
                return mid_index
        else:
            print('找不到')
    l = [1,2,3,4,5,6,7,8,9]
    t = find(l,5)
    print(t)
    # print(l.index(4))
    升级版二分法

     8.菲波那切数列

    def fib(n):
        if n == 1 or n == 2:
            return 1
    
        return fib(n-1) + fib(n-2)
    
    
    print(fib(50))
    View Code

    9.阶乘

    def func(n):
        if n == 1:
            return 1
        return n*func(n-1)
    print(func(5))
    View Code
  • 相关阅读:
    查看CLOUD系统级IIS日志
    采购订单设置采购部门为缺省值
    单据头数据复制到单据体
    CLOUD设置过滤方案不共享
    BZOJ 4773: 负环 倍增Floyd
    LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维
    BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精
    一些常用公式/技巧
    BZOJ 4517: [Sdoi2016]排列计数 错排 + 组合
    BZOJ 3162: 独钓寒江雪 树的同构 + 组合 + 计数
  • 原文地址:https://www.cnblogs.com/shangchunhong/p/9232402.html
Copyright © 2020-2023  润新知