Task08模块与datetime模块

模块

定义

模块,简单来说就是时一个.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)
%H24小时制小时数(0-23)
%I12小时制小时数(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值