模块
定义
模块,简单来说就是时一个.py文件,其中可以包括我们需要的任意代码。程序的设计目标是运行,而模块的设计目标是由其他程序导入并使用。
- 容器 -> 数据的封装
- 函数 -> 语句的封装
- 类 -> 方法和属性的封装
- 模块 -> 程序文件
命名空间
命名空间因为对象的不同,也有所区别,可以分为如下几种:
- 内置命名空间(Built-in Namespaces):Python 运行起来,它们就存在了。内置函数的命名空间都属于内置命名空间,所以,我们可以在任何程序中直接运行它们,比如id(),不需要做什么操作,拿过来就直接使用了。
- 全局命名空间(Module:Global Namespaces):每个模块创建它自己所拥有的全局命名空间,不同模块的全局命名空间彼此独立,不同模块中相同名称的命名空间,也会因为模块的不同而不相互干扰。
- 本地命名空间(Function & Class:Local Namespaces):模块中有函数或者类,每个函数或者类所定义的命名空间就是本地命名空间。如果函数返回了结果或者抛出异常,则本地命名空间也结束了。
- 上述三种命名空间的关系
程序在查询上述三种命名空间的时候,就按照从里到外的顺序,即:Local Namespaces --> Global Namesspaces --> Built-in Namesspaces。
# hello.py
def hi():
print('Hi everyone, I love lsgogroup!')
# hello.py
def hi():
print('Hi everyone, I love lsgogroup!')
import hello
hello.hi() # Hi everyone, I love lsgogroup!
hi() # NameError: name 'hi' is not defined
模块导入
例子如下:
#Filename:TemperatureConversion.py
import TemperatureConversion
print('32摄氏度 = %.2f华氏度' % TemperatureConversion.c2f(32))
print('99华氏度 = %.2f摄氏度' % TemperatureConversion.f2c(99))
32摄氏度 = 89.60华氏度
99华氏度 = 37.22摄氏度
from TemperatureConversion import c2f, f2c
print('32摄氏度 = %.2f华氏度' % c2f(32))
print('99华氏度 = %.2f摄氏度' % f2c(99))
32摄氏度 = 89.60华氏度
99华氏度 = 37.22摄氏度
from TemperatureConversion import *
print('32摄氏度 = %.2f华氏度' % c2f(32))
print('99华氏度 = %.2f摄氏度' % f2c(99))
32摄氏度 = 89.60华氏度
99华氏度 = 37.22摄氏度
import TemperatureConversion as tc
print('32摄氏度 = %.2f华氏度' % tc.c2f(32))
print('99华氏度 = %.2f摄氏度' % tc.f2c(99))
32摄氏度 = 89.60华氏度
99华氏度 = 37.22摄氏度
- import语句在程序中最好放在什么位置:建议首先导入标准库模块,之后是第三方模块,最后才是自定义模块,所以通常的做法是将所有的import语句放在shebang行和模块文档之后,其他语句之前。
if _name_ == ‘_main_’
- Python 属于脚本语言,是动态的逐行运行,都是从第一行进行运行,所以在引用模块的时候为了避免多余的语句运行,需要一句话对多余的不必要的语句进行标记。
import TemperatureConversion
print(__name__)
print(TemperatureConversion.__name__)
__main__
TemperatureConversion
- _name_:是内置变量,可用于表示当前模块的名字
- if _name_ == ‘_main_’ 的意思是:当 .py 文件被直接运行时, if _name_ == ‘_main_’ 之下 的代码块将被运行;当 .py 文件以模块形式被导入时, if _name_ == ‘_main_’ 之下的代码块不被运行。
搜索路径
import sys
print(sys.path)
['', 'E:\\Anaconda\\python36.zip', 'E:\\Anaconda\\DLLs', 'E:\\Anaconda\\lib', 'E:\\Anaconda', 'E:\\Anaconda\\lib\\site-packages', 'E:\\Anaconda\\lib\\site-packages\\Babel-2.5.0-py3.6.egg', 'E:\\Anaconda\\lib\\site-packages\\win32', 'E:\\Anaconda\\lib\\site-packages\\win32\\lib', 'E:\\Anaconda\\lib\\site-packages\\Pythonwin', 'E:\\Anaconda\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\41040\\.ipython']
- 搜索路径是由一系列目录名组成的,Python 解释器就依次从这些目录中去寻找所引入的模块。搜索路径,即环境被存储在 sys 模块中的 path 变量中。
包(package)
定义:包就是一个目录,其中包含一组模块和一个__init__.py文件。将多个模块保存在一起。
创建步骤:
(1)创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字。
(2)在文件夹中创建一个 init.py 的模块文件,内容可以为空。 注意,只要放上这个文件,就算里边没有其他的模块,也会被认为是一个包。
(3)将相关的模块放入文件夹中。
命名方法:保证顶级模块名字即包的名字不能与标准库中的任何顶级名字相同。
导入方法:只要包的目录在程序目录的子目录中,或者存在于Python的路径中,就能导入这些模块。
导入包:
在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。
目录只有包含一个叫做 init.py 的文件才会被认作是一个包,最简单的情况,放一个空的 init.py 就可以了。
练习题
1、怎么查出通过 from xx import xx导⼊的可以直接调⽤的⽅法?
如果包内的_init_.py文件里有_all_=[]时,可以直接调用的方法为[]列表内定义的所有子模块。没有__all__列表时,就看_init_.py文件里的代码做具体判断。_all_=[] ,控制允许导入的模块列表。
2、了解Collection模块,编写程序以查询给定列表中最常见的元素。
题目说明:
输入:language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
输出:Python
"""
Input file
language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
Output file
Python
"""
def most_element(language):
""" Return a list of lines after inserting a word in a specific line. """
# your code here
模块:
# collections.py
def most_element(language):
a=0
b=0
for i in range(len(language)):
for j in range(len(language)-1):
if language[i]==language[j+1]:
a=a+1
if a>b:
b=a
cc=language[i]
return cc
import collections
language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
print(collections.most_element(language))
datetime模块
datetime 是 Python 中处理日期的标准模块,它提供了 4 种对日期和时间进行处理的类:datetime、date、time 和 timedelta。
datetime类
class datetime(date):
def __init__(self, year, month, day, hour, minute, second, microsecond, tzinfo)
pass
def now(cls, tz=None):
pass
def timestamp(self):
pass
def fromtimestamp(cls, t, tz=None):
pass
def date(self):
pass
def time(self):
pass
def year(self):
pass
def month(self):
pass
def day(self):
pass
def hour(self):
pass
def minute(self):
pass
def second(self):
pass
def isoweekday(self):
pass
def strftime(self, fmt):
pass
def combine(cls, date, time, tzinfo=True):
pass
- datetime.now(tz=None) 获取当前的日期时间,输出顺序为:年、月、日、时、分、秒、微秒。
- datetime.timestamp() 获取以 1970年1月1日为起点记录的秒数。
- datetime.fromtimestamp(tz=None) 使用 unixtimestamp 创建一个 datetime。
import datetime
dt = datetime.datetime(year=2020, month=8, day=23, hour=15, minute=38, second=20)
print(dt) # 2020-08-23 15:38:20
print(dt.timestamp()) # 1598168300.0
dt =datetime.datetime.now()
print(dt) # 2020-08-03 15:59:40.878923
2020-08-23 15:38:20
1598168300.0
2020-08-07 18:08:25.560741
- datetime.strftime(fmt) 格式化 datetime 对象
符合 | 说明 |
---|---|
%a | 本地简化星期名称(如星期一,返回 Mon) |
%A | 本地完整星期名称(如星期一,返回 Monday) |
%b | 本地简化的月份名称(如一月,返回 Jan) |
%B | 本地完整的月份名称(如一月,返回 January) |
%c | 本地相应的日期表示和时间表示 |
%d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%I | 12小时制小时数(01-12) |
%j | 年内的一天(001-366) |
%m | 月份(01-12) |
%M | 分钟数(00-59) |
%p | 本地A.M.或P.M.的等价符 |
%S | 秒(00-59) |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为星期的开始 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(0000-9999) |
%Z | 当前时区的名称(如果是本地时间,返回空字符串) |
%% | %号本身 |
例子
如何将 datetime 对象转换为任何格式的日期?
import datetime
dt = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=51, second=49)
s = dt.strftime("'%Y/%m/%d %H:%M:%S")
print(s) # '2020/06/25 11:51:49
s = dt.strftime('%d %B, %Y, %A')
print(s) # 25 June, 2020, Thursday
'2020/06/25 11:51:49
25 June, 2020, Thursday
如何将给定日期转换为 “mmm-dd, YYYY” 的格式?
import datetime
d1 = datetime.date(2010, 9, 28)
print(d1.strftime('%b-%d,%Y'))
# Sep-28,2010
Sep-28,2010
date类
class date:
def __init__(self, year, month, day):
pass
def today(cls):
pass
date.today() 获取当前日期信息。
time类
class time:
def __init__(self, hour, minute, second, microsecond, tzinfo):
pass
- 1秒 = 1000 毫秒(milliseconds)
- 1毫秒 = 1000 微妙(microseconds)
timedelta类
timedelta 表示具体时间实例中的一段时间。你可以把它们简单想象成两个日期或时间之间的间隔。
它常常被用来从 datetime 对象中添加或移除一段特定的时间。
class timedelta(SupportsAbs[timedelta]):
def __init__(self, days, seconds, microseconds, milliseconds, minutes, hours, weeks,):
pass
def days(self):
pass
def total_seconds(self):
pass
练习题:
1、假设你获取了用户输入的日期和时间如2020-1-21 9:01:30,以及一个时区信息如UTC+5:00,均是str,请编写一个函数将其转换为timestamp:
题目说明:
"""
Input file
example1: dt_str='2020-6-1 08:10:30', tz_str='UTC+7:00'
example2: dt_str='2020-5-31 16:10:30', tz_str='UTC-09:00'
Output file
result1: 1590973830.0
result2: 1590973830.0
"""
def to_timestamp(dt_str, tz_str):
# your code here
pass
2、编写Python程序以选择指定年份的所有星期日。
题目说明:
"""
Input file
2020
Output file
2020-01-05
2020-01-12
2020-01-19
2020-01-26
2020-02-02
-----
2020-12-06
2020-12-13
2020-12-20
2020-12-27
"""
def all_sundays(year):
# your code here