面向过程编程(理论)
面向过程编程思想:
面向过程编程就好比设计一条流水线
优点:复杂的问题流程化,进而简单化
缺点:扩展性非常差,一旦要修改功能,需要整体改造(牵一发而动全身)
面向过程编程思想
def get_info():
username = input('username:').strip()
password = input('password:').strip()
if len(username) == 0 or len(password) == 0 :
print('账号或密码不能为空.')
return
print('登录成功')
return deal(username,password)
def deal_data(username,password):
data = '%s|%s\n'%(username,password)
return save_data(data)
def save_data(data):
with open(r'userinfo','a',encoding='utf8') as f:
f.write(data)
print('注册成功')
get_info()
添加身份信息功能
需要更改第一个函数体代码之后,还要更改第二个函数体代码内容(牵一发而动全身)
def get_info():
username = input('username:').strip()
password = input('password:').strip()
if len(username) == 0 or len(password) == 0 :
print('账号或密码不能为空.')
return
user_id = {'1':'admin',
'2':'user'}
print(user_id)
choice = input('选择身份:').strip()
if choice in user_id
id = user_id.get(choice)
return deal(username,password)
else:
print('输入错误')
return
def deal_data(username,password,id):
data = '%s|%s|%s\n'%(username,password,id)
return save_data(data)
def save_data(data):
with open(r'userinfo','a',encoding='utf8') as f:
f.write(data)
print('注册成功')
get_info()

模块简介
Python语言
最早起源于linux运维:胶水语言,调包侠(贬义词>>>褒义词)
1.什么是模块
一系列功能的集合体
2.为什么要用模块
为了提升开发效率(站在巨人的肩膀上)
3.模块的三种来源
1.内置(Python解释器自带的莫开,可以直接导入)
2.第三方(别人写好发布在网络上,下载之后使用)
3.自定义(自己编写)
4.模块的四种表现形式
1.使用python编写的代码(.py文件)
2.已被编译为共享库或DLL的c或c++扩展
3.包好一组模块的包(文件夹)
# 包就是多个py文件(模块)的集合
4.使用c编写并连接到python解释器的内置模块
'''遇到一些计较复杂的功能可以先考虑是否又相应的模块可以调用'''

import句式
导入模块时要区分好谁是需要模块的文件,谁是模块文件
import 模块文件名 # 不需要加.py后缀名
同一文件内多次导入相同的模块文件,只会执行一次
首次导入模块文件发生的事情
1.运行需要模块的文件产生该文件的全局名称空间
2.运行导入的模块文件
3.产生导入的模块文件的全局名称空间
4.需要模块的全局名称空间内有一个名字指向模块文件的全局名称空间
import句式导入模块后
在需要模块的文件内使用模块名.模块内的变量名时不会与当前文件夹内的名字冲突
from...import...句式
from 模块名 import 模块内的名字
同一文件内多次导入相同的模块文件,只会执行一次
1.先产生执行文件的全局名称空间
2.执行模块文件 产生模块的全局名称空间
3.将模块中执行之后产生的名字全部存档于模块名称空间中
4.在执行文件中有一个与模块名称空间中相同的名字指向模块名称空间中相同名字的值
虽然可以在当前文件内直接写名字即可,但当前名称空间之后有相同的名字是就会产生冲突,更改为指向当前名称空间的值

导入模块扩展用法
import与 from... import 导入差别:
import 模块名:导入之后可以直接在当前文件内模块名点的方式找到模块内的所有名字
from... import:导入模块名内的某个名字
1.起别名
import 模块名 as 更改之后的名字
from 模块名 import 模块里的名 as 更改之后
2.连续导入
import 模块名1,模块名2 # 但不建议这个导入,除非属于一个系列和功能相同的
import 模块名1
import 模块名2 #推荐
from 模块名1 import 名1,名2 # 一个模块名称空间内的多个名字
3.通用导入
from 模块名 import * # 将模块内的名字全部都导入(*表示所有)
可以在模块内指定可以被导入的名字
__all__ = ['模块内名字','模块内名字'] # 只有列表里面的名字可以被 * 导入。正常导入没问题

判断文件类型
判断文件是执行文件或者是模块文件
可以在当前文件路径 print('__name__')
__name__当文件是执行文件的时候会返回__main__
如果文件是被当做模块导入则返回文件名(模块名)
if __name__ == '__main__':
模块测试代码
"""在pycharm中可以直接敲 main按tab键即可自动补全if判断"""
循环导入
如果在导入模块中出现循环导入问题,说明程序设计不合理
不允许出现这种问题
解决办法:
1.调换顺序
将彼此导句式代码放在最后
2.函数形式
将导入的句式放入函数内当做函数体代码,等所有名字加载完成后后调用
模块导入顺序
1.先从内存中查找
2.内置模块中查找
3.sys.psth系统路径查找(自定义模块)
# 模块py文件的名字不要与内置模块名字冲突,冲突之后就不会找到模块名
import sys
print(sys.path) # 结果中第一个元素永远是当前执行文件所在的路径
当某个自定义模块找不到的解决方案
1.自己手动将该模块所在的路径添加到sys.path中
import
sys.path.append(文件绝对路径(模块所在的位置)) # 因为打印出来是列表,所以可以使用append添加
2.from...import...句式
from 文件夹名称.文件夹名称 import 模块名
from 文件夹名称.模块名称 import 模块内的名字
# ps:当导入文件与模块文件不是同一级
模块文件在导入文件下一级:
import 语句:
import
sys.path.append(文件绝对路径(模块所在的文件夹))
import 文件夹内的模块名字
print(文件夹内的模块名字.模块内的名字)
from 语句:
from 文件夹的名字.模块名字 import 模块内的名字
print(模块内的名字)
from 文件夹的名字 import 模块名字
print(模块名字.模块内的名字)
导入文件在模块文件的下一级:
在pycharm里面可以直接找到
导入文件外的文件夹与模块外的文件夹在同一级
import 语句:
import
sys.path.append(文件绝对路径(模块所在的文件夹))
import 文件夹内的模块名字
print(文件夹内的模块名字.模块内的名字)
from 语句:
from 文件夹的名字.模块名字 import 模块内的名字
print(模块内的名字)
from 文件夹的名字 import 模块名字
print(模块名字.模块内的名字)
