zoukankan      html  css  js  c++  java
  • python 函数递归,三元表达式解读,匿名一次性函数,模块略解

    跟我一起从0开始入门python吧。双连怪。

    一.函数的递归调用

    引入

    函数的递归调用:就是在调用一个函数的过程种又直接或者间接的把自己给调用了

    # 示例1:直接调用自己
    def foo():
        print('hello')
        foo()
    foo()
    
    # 示例2:间接调用自己
    def bar():
        print('from bar')
        foo()
    def foo():
        print('hello')
        bar()
    foo()
    

    通常我们把这样没有条件判断退出的的递归称之为死递归。

    • 为何死递归会抛出异常???

    • 应为无限的递归会导致内存溢出,所以python设定了最大的递归层数

      import sys  #我们可以调用sys函数去看看。
      print(sys.getrecursionlimit()) #最大递归次数为1000
      print(sys.setrecursionlimit(2000))#我们可以如此修改递归次数
      
    • 所以:不应该无限递归调用下去,应该在满足某种条件下结束递归调用,然后返回

    递归调用应该分为两个阶段

    • 1、回溯(挖井) :一层一层地递归调用下去
    • 2、递推(从井里往外跳):在满足某一条件的情况下结束回溯,然后开始向上一层层返回
    '''
       思路
    salary(5) = salary(4) + 10
    salary(4) = salary(3) + 10
    salary(3) = salary(2) + 10
    salary(2) = salary(1) + 10
    salary(1) = 18
    
    n=1   salary(n) = 18
    n!=1  salary(n) = salary(n-1) + 10
    
    '''
    def salary(n):
        if n == 1:
            return 18
        return salary(n-1) + 10
    res=salary(5)
    print(res)
    
    

    案例一:

    #取出列表中的所有数值
    nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]
    
    
    def func(l):
        for x in l:
            if type(x) is list:
                # 把自身的代码重新再调用一次
                func(x)
            else:
                print(x)
    func(nums)
    

    结果:

    111
    222
    333
    444
    5555
    6666
    777
    888
    9999
    

    案例二:

    nums = [11, 13, 32, 47, 53, 73, 84, 91]
    
    def xun(l,find):
        a=len(l)//2
        if len(l)==0:
            print('数值不存在')
            return
        if find>l[a]:
            b=l[a+1:]
            xun(b,find)
        elif find<l[a]:
            c=l[:a]
            xun(c,find)
        else:
            print('数值存在')
    
    xun(nums,54)
    

    结果:

    数值不存在
    

    二.三元表达式

    三元表达式: 表达式1 if 条件 else 表达式2

    '''
    未使用三元表达式之前
    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    '''
        
        
    x=111
    y=222
    #三元表达式使用之后
    res=x if x > y else y
    #   元     元       元
    print(res)
    

    三.匿名函数

    • 匿名函数即没有名字的函数
    • 特点:没有名字意味着只能用一次,用完之后就是垃圾,所以匿名函数只用于临时使用一次的场景
    • 示例
    a={'沙雕英雄传':55,'青青大草原':36,'爱情36集':108}
    
    
    '''
    我们将这一段,简化成下面key=lambda k:salaries[k]
    def func(k):
        return salaries[k]
    '''
    
    print(max(a,key=lambda k:a[k]))
    print(min(a,key=lambda k:a[k]))
    print(sorted(a,key=lambda k:a[k]))#reverse是反转的意思,在sorted中默认是False
                                           #如果是False 的话那么就是从小到大
    print(sorted(a,key=lambda k:a[k],reverse=True))#如果是True 那么就是反转过来了
                                                      #那么就是从小到大
    

    结果:

    爱情36集
    青青大草原
    ['青青大草原', '沙雕英雄传', '爱情36集']
    ['爱情36集', '沙雕英雄传', '青青大草原']
    

    四.模块

    什么是模块

    • 模块就是一个功能的集合体,不是用来直接运行,而是用来被导入使用的

    模块分为三大来源:

    • 1、内置的模块
    • 2、第三方模块
    • 3、自定义的模块

    模块分为四种类别:

    • 1、一个py文件就是一个模块
    • 2、一个文件夹也是一个模块=》包
    • 3、已被编译为共享库或DLL的C或C++扩展
    • 4 使用C编写并链接到python解释器的内置模块

    为何要用模块

    • 使用别人的模块:
    • 1、拿来主义,提升开发效率
    • 自定义模块:
    • 1、别人的功能不够用了,需要自己的去编写
    • 2、解决代码冗余
    • 3、如何用模块

    我们假设现在有一个spam.py文件里面有多个我们需要用到的函数

    文件如下:

    # spam.py
    print('from the spam.py')
    
    money = 1000
    
    def read1():
        print('spam模块:', money)
    
    def read2():
        print('spam模块')
        read1()
    
    def change():
        global money
        money = 0
    

    我们先来使用一下:

    import spam
    
    spam.read1()
    

    我们可以发现我们在调用模块的时候会首先声明一句

    import spam
    

    因为我们需要地址信息,不然我们执行文件的时候,不知道这个函数在哪里

    文件名是spam.py,模块名则是spam

    # 首次导入模块发生的事情
    # 1、触发被导入的模块的运行,产生一个模块的名称空间,把模块中的名字都丢进去
    
    # 2、会在当前执行文件中得到一个名字spam,该名字是指向被导入模块的名称空间的
    
    # 之后的导入,名字spam直接引用首次导入产生的名称空间,不会再执行模块的内的代码了
    #所以多个 是只执行一个的 
    import spam
    import spam
    import spam
    

    如果我们的模块有多个我们也可以使用一行import 来导入多个

    但是我们不推荐这种用法

    # 一行导入多个模块
    import spam,m1,m2,m3  # 不推荐
    

    我们还可以为导入的模块起一个别名

    # 为导入的模块起别名
    import spam as sm
    
    努力学习!
  • 相关阅读:
    hihoCoder[Offer收割]编程练习赛1题目解析
    你的计划为什么运行不下去?怎么破?
    Activity的生命周期
    leetcode——Lowest Common Ancestor of a Binary Tree
    Spring学习笔记(四)-- Spring事务全面分析
    Docker技术-cgroup
    docker高级应用之cpu与内存资源限制(转)
    JMX 学习
    如何使用JVisualVM进行性能分析
    如何利用 JConsole观察分析Java程序的运行,进行排错调优(转)
  • 原文地址:https://www.cnblogs.com/Orange-YXH/p/13648115.html
Copyright © 2011-2022 走看看