• python基础语法10 函数递归,模块,软件开发目录规范


    函数递归:
      函数递归指的是重复 “直接调用或间接调用” 函数本身,
      这是一种函数嵌套调用的表现形式。

      直接调用: 指的是在函数内置,直接调用函数本身。
      间接调用: 两个函数之间相互调用间接造成递归。

      了解:
        面试可能会问:
          python中有递归默认深度: 限制递归次数
          998, 1000
          PS: 但是在每一台操作系统中都会根据硬盘来设置默认递归深度。

        获取递归深度: 了解
          sys.getrecursionlimit()

        设置递归深度: 了解
          sys.setrecursionlimit(深度值)


    注意: 单纯的递归调用时没有任何意义的。

    def func():     #自己调用自己,死循环,默认998
        print('from func')
        func()
    
    func()
    -------------------------------------------------
    import sys  # 获取操作系统资源的模块
    print(sys.getrecursionlimit())  #获取当前递归深度限制
    
    sys.setrecursionlimit(2000) #设置当前递归深度限制
    
    # 查看当前可以承受的递归深度
    num = 1
    def func():
        global num
        print('from func', num)
        num += 1
        func()
    
    func()
    ---------------------------------------------------
    def foo():      #交叉调用死循环,也是相加默认998
        print('from foo')
        goo()
    
    def goo():
        print('from goo')
        foo()
    
    foo()

    想要递归有意义,必须遵循两个条件:
      - 递推:
        指的是重复地执行, 每一次执行都要拿到一个更接近于结果的结果,
        递推必要有一个终止条件。

      - 回溯:
        当递推找到一个终止条件后,开始一步一步往上回溯。

      age5 == age4 + 2
      age4 == age3 + 2
      age3 == age2 + 2
      age2 == age1 + 2
      age1 == 18 # 递推终止的结果

      result = age(n - 1) + 2

    def age(n):
        if n == 1:
            return 18
    
        # 这里写return才能实现递推
        return age(n - 1) + 2
    
    res = age(5)
    print(res)  # 26
    #---------------------------------------
    def recure(n):    #斐波那契数列
        if n==1:
            return 1
        if n==2:
            return 1
        return recure(n-1)+recure(n-2)
    
    print(recure(10))

    模块:

    什么是包?
      包指的是内部包含__init__.py的文件夹。

    包的作用:
      存放模块,包可以更好的管理模块。


    一 什么是模块?
      - 模块是一系列功能的结合体。

      # 相当于与模块包着一堆函数与代码。

      - 模块本质上是一个个的.py文件。

      - 模块的三种来源:
        1.python内置的模块: (python解释器的)
          比如: sys imeos urtle

        2.第三方的模块: (别人写的)
          比如: requests

        3.自定义的模块: (自己写的)
          比如: 自己定义的demo.py文件

      - 模块的四种表现形式:
        1.使用python编写的py文件。(了解)
        2.编译后的共享库DLL或者是C或者C++库。(了解)
        3.包下面带有__init__.py的一组py文件。
          - py_demo
          - __init__.py
          - demo.py
          - demo2.py

        4.python解释器下的py文件。
          - python解释器下的文件夹
            - 一个个的py文件

    二 为什么要使用模块?
      模块可以帮我们更好地管理功能代码,比如: 函数...
      可以将项目拆分成一个个的功能,分别存放在不同的py文件(模块)中。


    三 如何创建,编写模块,并使用模块?
      - 鼠标右键创建py文件
        - 在py文件编写python代码

      - 在一个文件中,通过import关键字导入模块
        import 模块名
        # 注意: import 模块时,模块不能加.py后缀

    - 在使用模块阶段,必须要注意,谁是执行文件,谁是被导入文件(被导入的模块)

    - 模块在首次导入时,就已经固定好了,当前文件查找的顺序是先从内存中查找

    - 模块在导入时发生的事情:
      1.会先执行当前执行文件,并产生执行文件中的名称空间。
      2.当执行到导入模块的代码时,被导入的模块会产生一个模块的名称空间。
      3.会将被导入模块的名称空间加载到内存中。

    '''
    此处是执行文件...
    '''
    # # 模块在首次导入时,就已经固定好了,当前文件查找的顺序是先从内存中查找
    # import demo   #加载一次
    # import demo   #内存有不在加载
    # import demo
    # import demo
    
    
    # # print('from run...')    #这三行,模块内容
    # # 模块.指向的是模块的名称空间
    # # demo.func1()
    
    import time
    
    import demo   #打印from run...
    demo.func1()
    time.sleep(20)
    
    import demo    #不打印from run...
    demo.func1()

    - 给模块起别名 as
      import 模块 as 模块的别名

    - 模块的导入方式
      - import 模块
        - 在执行文件中直接import导入

      - from 包/模块 import 模块/(函数名、变量名、类名)
        - 在执行文件中直接import导入

    - 循环导入问题:
      - model1.py
        from model2 import name
        name = 'jason'

      - model2.py
        from model1 import name
        name = 'tank'

      - 解决循环导入问题:
        1.需要查找的名字放在导入模块的上方
        2.在函数内部导入,将模块变成函数名称空间中的名字

    - 软件开发目录规范:
      注意: 每一次写项目时,都要新建一个文件夹与项目工程,必须让项目文件夹作为项目根目录。


    - 项目的文件夹
      - conf:
        - 用于存放配置文件的文件夹
      - core:
        - 核心业务代码 .py
      - interface:
        - 接口, 接口内写获取数据前的逻辑代码,通过后才能获取数据
      - db:
        - 用于存放文件数据
      - lib:
        - 存放公共功能文件

      - log:
        - 用于存放日志文件,日志用于记录用户的操作记录

      - bin:
        - 里面存放启动文件 / - 启动文件

      - readme.txt:
        - 项目说明书, 用户告诉使用者项目的操作

  • 相关阅读:
    多线程的设计模式
    Deque 双端队列
    并发Queue
    并发类容器
    同步类容器
    java0926
    第十二次作业
    第十一次作业
    第十次
    第九次
  • 原文地址:https://www.cnblogs.com/ludingchao/p/11868903.html
Copyright © 2020-2023  润新知