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

时间:2023-03-09 22:00:45
python基础语法10   函数递归,模块,软件开发目录规范

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

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

  了解:
    面试可能会问:
      python中有递归默认深度: 限制递归次数
      998,
      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

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

def age(n):
if n == 1:
return 18 # 这里写return才能实现递推
return age(n - 1) + 2 res = age(5)
print(res) #
#---------------------------------------
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\time\os\turtle

    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:
    - 项目说明书, 用户告诉使用者项目的操作