名字查找顺序
所谓的查找顺序就是在运行代码的时候调用的优先级,这里分成三个优先级:
1.内存
这里可以举一个极端一点的例子,就是我们引入一个模块,然后在引入代码后使用time.sleep停个十几秒,在停止的时间内我们直接把导入的模块文件删除,接下来继续让代码执行模块内的函数或引用变量名,我们会发现代码正常运行。但是结束后就不弄再次运行了。
2.内置模块
内置模块就是python解释器中的模块,当我们在编写模块的时候如果名称跟内置模块中的名称冲突了,就会导致代码直接调用内置模块中的内容。因此我们在编写模块的时候应该尽量避免名称冲突
3.执行文件所在的sys.path
所谓的sys.path就是系统的环境变量,跟我们装python解释器的时候的环境变量作用相似。
这里的sys是一个模块名称,我们可以使用下面的代码获得当前的系统环境变量:
import sys
print(sys.path)
# 得到的结果是个列表 ,内部是目前的环境变量路径
['D:\\Python27\\day20', 'D:\\Python27\\day20', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 'D:\\Python38\\python38.zip', 'D:\\Python38\\DLLs', 'D:\\Python38\\lib', 'D:\\Python38', 'C:\\Users\\oldboy\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Python38\\lib\\site-packages', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
# 上面的列表中第一个元素永远是当前文件所在的路径
之后我们可以使用下面代码添加路径到系统环境变量中去(需要放在执行文件中),这样当我们导入模块的时候就不会因为模块文件不在同一目录导致报错:
1. 把模块所在的路径添加到sys.path中
sys.path.append(r'D:\pythonProject03\day17\mymd')
import ccc
print(ccc.name)
2. 使用from...import句式
from aaa.bbb.ccc import m1
from aaa.bbb.ccc.m1 import f1
相对导入和绝对导入
绝对导入就是导入模块的时候需要精确的使用文件的绝对路径:
from mymd.aaa.bbb.ccc.ddd import name # 可以精确到变量名
from mymd.aaa.bbb.ccc import ddd # 也可以精确到模块名
相对路径就是导入模块的时候以自身被执行文件所在位置为基础进行查找。
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准
from . import b
相对导入不能使用在被执行文件中,只能使用模块文件中。比如执行文件导入模块后,模块文件中导入了另一个模块,这个模块的路径要么使用绝对导入,要么使用相对导入的方式来导入。
注:由于相对导入的限制条件很多,导致了使用频率偏低,一般使用绝对导入即可。
包的使用
什么是包?
就是文件夹,其实就是文件夹中包含了一些列的py文件(模块)
# 包就是一些列模块的组合
包和模块有什么区别呢?
包中有一个特殊文件:__init__.py文件
"""导包其实就是在导包下的__init__.py文件的!"""
包的具体使用
1、当我们使用包来导入模块的时候需要注意在python2和3中双下滑线init.py的需求不一样,但是为了兼容性考虑我们也应该把双下划线init.py加上去。
2、当我们在导入模块的时候,如果只需要包中的几个模块,可以用from的形式来导入指定模块
3、在使用import方式导入模块的时候需要注意,这里并不是一次性导入所有的包中的模块,而是导入双下划线init文件,在文件内有模块的名称就可以通过:包.模块名的形式调用模块中的名称
软件开发目录规范
软件开发目录规范就是跟项目中得文件夹起合适的名字的!
项目名:
bin
# 放启动文件的 run.py start.py manage.py...
如果你的启动文件只有一个,也可以不要bin文件夹,可以把启动文件写在项目的跟下
conf (config:配置)
# 放项目的配置文件
settings.py
'''就是一些初始化的数据'''
core # 核心的
# 写一些项目的核心逻辑
src.py
def login():
pass
def register():
pass
lib # library 库
# 这个里面一般写项目使用的公共代码
common.py
def outer():
pass
log
# 日志:就是记录一些在代码运行过程中发生的一些事情,可以是正确的,可以是异常的
log.log
db
# database
跟项目相关的数据存储都存在db、data
api/
# 接口层
# 当你自定义文件夹名字的时候,一定要是见名知意, 一定不能出现中文的
setup.py # 安装模块使用的 python setup.py ...
|-- requirements.txt # 目前用不到--->
taobao
time
os
requests
xml
...
# 命令:
reqeusts == 1.11.1
xml = 1.1.1
# 命令:
|-- README
# 就是项目的说明书
正则表达式
正则表达式是一门独立的技术,适用于所有的编程语言,它的主要作用就是利用一些特殊符号进行查找,可以对一些庞大的数据进行筛选。
举例:
当我们在登陆京东的网站时,需要输入手机号进行登陆,如果我们没有输入正确的手机号格式,就会出现错误提示,这些功能就是用正则表达式来实现的,虽然我们在用python语言的时候,也可以实现一样的功能,但是正则表达式更加方便高效。
以下是纯python代码实现手机号校验:
基本需求:手机号必须是11位、手机号必须以13 15 17 18 19开头、必须是纯数字
'''纯python代码实现'''
while True:
# 1.获取用户输入的手机号
phone_num = input('请输入您的手机号>>>:').strip()
# 2.先判断是否是十一位
if len(phone_num) == 11:
# 3.再判断是否是纯数字
if phone_num.isdigit():
# 4.判断手机号的开头
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
'17') or phone_num.startswith('18') or phone_num.startswith('19'):
print('手机号码输入正确')
else:
print('手机号开头不对')
else:
print('手机号必须是纯数字')
else:
print('手机号必须是11位')
'''python结合正则实现'''
import re
phone_number = input('please input your phone number: ')
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
正则表达式:
利用一些特殊的符号匹配出我们想要的数据
正则表达式它是一门独立的语言,跟Python、Java等语言没有关系的
所以,如果想在Python中使用正则表达式,需要借助于re模块,内置的
import re
标签:文件,软件开发,正则表达式,py,phone,导入,模块,import
From: https://www.cnblogs.com/wolongnp/p/17706881.html