栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

面向过程编程与模块

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面向过程编程与模块

文章目录
      • 面向过程编程
      • 模块简介
      • import句式
      • from…import…句式
      • 导入补充
      • 判断文件类型
      • 循环导入问题
        • 解决办法
      • 模块的查找循序
      • 绝对导入与相对导入

面向过程编程
  1. 什么是面向过程编程?

    简单点说,面向过程编程就类似于工厂的流水线

  2. 以用户注册为例

1. 获取用户名和密码
2. 组织成固定的格式
3. 文件操作写入文件

def user_data():
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    if len(username) == 0 or len(password) == 0:
        return
    return deal_data(username,password)

def deal_data(username,password):
    data = '%s:%S'%(username,password)
    return sava_data(data)

def sava_data(data):
    with open (r'user.txt', 'a', encoding='utf8') as f:
        f.write(data)
	print('注册成功')       

  1. 总结
1. 优点: 
    	能够将整个过程流程化、简单化、思维流畅清晰
2. 缺点: 
    	程序的可扩展性极差,增加或减少功能整个源码都得改动
eg: 给上述登录功能加一个身份认证
    
def user_data():
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    if len(username) == 0 or len(password) == 0:
        return
    user_info = {'1':'admin','2':'user'}
    print(user_info)
    choice = input('请选择您的身份>>>:').strip()
    if choice in user_info:
        id1 = user_info.get(choice)
    	return deal_data(username,password,id1)
    else:
        print('输入不合法')
        return

def deal_data(username,password,id1):
    data = '%s:%s:%s'%(username,password,id)
    return sava_data(data)

def sava_data(data):
    with open (r'user.txt', 'a', encoding='utf8') as f:
        f.write(data)
	print('注册成功')    
    
3. 应用场景
	面向过程的程序设计一般用于那些功能一旦实现之后就很少需要改变的场景,
	如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程去实现是极好的,
	但如果你要处理的任务是复杂的,且需要不断迭代和维护, 那还是用面向对象最香。  

模块简介
  1. 什么是模块

    在python中,一个py文件就是一个模块,模块就是一系列功能的集合体

  2. 为什么要用模块

    为了提高开发效率(python 胶水语言 调包侠外号原因)

  3. 模块的三种来源

    1. 内置模块(python解释器自带的模块)
    2. 第三方模块(别人写好了发在网上的模块)
    3. 自定义模块(自己写的)
  4. 模块的四种表现形式

    1. 使用python编写的代码

    2. 已经被编译为共享库或DLL的c或c++扩展

    3. 包好一组模块的包(文件夹)

      ​ 包里面通常会含有一个双下init文件(__ init __.py)

    4. 使用c编写并链接到python解释器的内置模块

  5. 总结

    在写python程序时,遇到了比较复杂的功能,记得先去找找有没有相应的模块可以调用

import句式
import time # 导入模块
'''
模块可以多次导入,但是只会执行第一次

首次导入时发生的事情:
	1. 运行执行文件(import句式.py)产生该文件的全局名称空间
	2. 运行time.py文件
	3. 产生time.py全局名称空间 运行time文件的内部代码 将产生的名字全部存放到time.py的名称空间
	4. 在执行文件名称空间产生一个time的名字指向time.py全局名称空间
	
import句式导入模块之后	
	通过模块名点的方式就可以使用到模块中所有的名字 并且肯定不会产生冲突
'''
time.time()
time.sleep()

from…import…句式
from time import time,sleep
"""
from...import...多次导入也只会导入一次
    1.先产生执行文件的全局名称空间
    2.执行模块文件 产生模块的全局名称空间
    3.将模块中执行之后产生的名字全部存档于模块名称空间中
    4.在执行文件中有一个time执行模块名称空间中time指向的值
    
from...import...指名道姓的导入某个名字
    在使用的时候直接写名字即可 但是当当前名称空间有相同名字的时候
    就会产生冲突 使用的就变成了当前名称空间
"""
time = 9
print(time)  # 9


导入补充
1.起别名
	既可以给模块名起别名也可以给模块中某个名字起别名
    import time as t
    from time import sleep as s
    
2.连续导入
	import 模块名1,模块名2
    	# 可以连续导入多个模块 但是只有当多个模块功能相似或者属于同一个系列
        # 如果功能不同并且不属于一个系列 那么推荐分行导入
        import 模块名1
        import 模块名2
    from 模块名1 import 名字1,名字2,名字3
 
3.通用导入
	from md import *  # 将模块中所有的名字全部导入(*表示所有)

判断文件类型

判断py文件是作为模块文件还是执行文件

__name__当文件是执行文件的时候会返回__main__
如果文件是被当做模块导入则返回文件名(模块名字)

if __name__ = '__main__':
    运行
    
'''可用于在自定义模块调试时使用
在pychram中可以直接敲 main按tab键即可自动补全代码
'''    
循环导入问题
  • 循环导入问题指的是在一个模块加载/导入的过程中导入另外一个模块,而在另外一个模块中又返回来导入第一个模块中的名字,由于第一个模块尚未加载完毕,所以引用失败、抛出异常,究其根源就是在python中,同一个模块只会在第一次导入时执行其内部代码,再次导入该模块时,即便是该模块尚未完全加载完毕也不会去重复执行内部代码

  • 循环导入是我们写代码时应当避免的问题,如果出现了,就说明在程序设计阶段不合理

以下列文件为例子:

m1.py

print('正在导入m1')
from m2 import y

x='m1'

m2.py

print('正在导入m2')
from m1 import x

y='m2'

run.py

import m1  
'''
运行文件时就会报错
'''

解决办法
# 方案一:导入语句放到最后,保证在导入时,所有名字都已经加载过
# 文件:m1.py
print('正在导入m1')

x='m1'

from m2 import y

# 文件:m2.py
print('正在导入m2')
y='m2'

from m1 import x

# 文件:run.py内容如下,执行该文件,可以正常使用
import m1
print(m1.x)
print(m1.y)

# 方案二:导入语句放到函数中,只有在调用函数时才会执行其内部代码
# 文件:m1.py
print('正在导入m1')

def f1():
    from m2 import y
    print(x,y)

x = 'm1'

# 文件:m2.py
print('正在导入m2')

def f2():
    from m1 import x
    print(x,y)

y = 'm2'

# 文件:run.py内容如下,执行该文件,可以正常使用
import m1

m1.f1()

模块的查找循序
'''
1. 先从内存中查看
2. 再去内置模块中查看
3. 最后再去sys.path系统路径查找(自定义模块)
没有找到就会报错误
'''
# 自定义模块命名不要与内置模块冲突

import sys
print(sys.path)  # 就能看到系统路径了 第一个元素永远时当前执行文件的路径


当某个自定义模块查找不到的时候解决方案
	1. 手动将该模块所有在的路径添加到sys.path中
            import sys
            sys.path.append(r'路径')
     2. from ... import ...句式
			from 文件夹名称.文件夹名称 import 模块名
			from 文件夹名称.模块名称  import 名字

绝对导入与相对导入
'''在程序中涉及到多个文件之间导入模块的情况 一律按照执行文件所在路径为准'''
绝对导入
	始终按照执行文件所在的sys.path查找模块
相对导入
	'''
	局点符(.)
		. 表示当前文件路径
		.. 表示上一层文件路径
	'''
    能够打破始终以执行文件为准的规则 只考虑两个文件之间的位置
    但相对导入只适用在模块文件中 不能在执行文件中使用
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/588755.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号