python王者归来—学习笔记(16)

第十三章 设计与应用模块(自建函数模块并导入、自建类模块并导入、random模块、time模块、sys模块、keyword模块、datetime模块)

在大型计划的程序设计中,每个人可能只是负责一小功能的函数或类设计,为了可以让团队的其他人可以互相分享设计成果,最后每个人所负责的功能函数或类将存储在模块(module)中,然后供团队其他成员使用。国外常可以看到有的文章将模块(module)称为套件(package),意义是一样的。

一、自建函数模块并应用。这里举例说明如何自建函数模块并应用,首先建立一个函数模块,模块名称命名为makefood.py,里面包含两个自定义函数:

#这是一个包含2个函数的模块
def make_icecream(*toppings):
    print("这个冰淇淋配料如下")
    for topping in toppings:
        print("--- ", topping)

def make_drink(size, drink):
    print("所点饮料如下")
    print("--- ", size.title())
    print("--- ", drink.title())

有若干种方法可以导入函数模块:

1、在程序开头加上简单的语句即可: import 模块名称, 程序中要引用模块的函数语法如下:模块名称.函数名称。Python也允许给模块替代名称,未来可以使用此替代名称导入模块:import 模块名称 as 替代名称,程序中要引用模块的函数语法如下:替代名称.函数名称。

import makefood

makefood.make_icecream('草莓酱', '葡萄干', '巧克力')
makefood.make_drink('large', 'coke')
import makefood as m   #导入模块makefood.py的替代名称m

m.make_icecream('草莓酱', '葡萄干', '巧克力')
m.make_drink('large', 'coke')

2、如果只想导入模块内单一特定的函数,可以使用下列语法:from 模块名称 import 函数名称,未来程序引用所导入的函数时可以省略模块名称。如果想导入模块内多个函数,函数名称间需以逗号隔开,语法如下:from 模块名称 import 函数名称1, ..., 函数名称n。如果想导入模块内所有函数,语法如下:from 模块名称 import *(不建议使用该导入方式,有可能会导致模块中函数名称和主程序中变量名称冲突,也不知道使用模块中的哪些函数)

#from makefood import make_icecream  #导入模块makefood.py的函数make_icecream
from makefood import make_icecream, make_drink  #导入模块内多个函数
#from makefood import *                         #导入模块内所有函数

make_icecream('草莓酱', '葡萄干', '巧克力')
make_drink('large', 'coke')

3、可以使用as给函数指定替代名称,语法格式如下:from 模块名称 import 函数名称 as 替代名称:

from makefood import make_icecream as icecream   #使用iceceam代替原来函数名称

icecream('草莓酱', '葡萄干', '巧克力')

二、自建类模块并应用。这里举例说明如何自建类模块并应用,首先建立一个类模块,模块名称命名为banks.py,里面包含两个自定义类:

class Banks():
    #定义银行类
    def __init__(self, uname):       #初始化方法
        self.__name = uname          #设定私有属性客户名称
        self.__balance =  0          #设定私有属性存款余额
        self.__title = "China Bank"  #设定私有属性银行名称

    def save_money(self, money):       #设计存款方法
        self.__balance += money
        print("存款 ", money, " 完成")

    def withdraw_money(self, money):   #设计取款方法
        self.__balance -= money
        print("取款 ", money, " 完成")
        
    def get_balance(self):             #获得当前存款余额方法
        print(self.__name, "目前余额是: ", self.__balance)

    def bank_title(self):              #获得银行名称
        return self.__title 

class BeijingBanks(Banks):
    #定义银行子类
    def __init__(self, uname):       #子类有自己初始化方法
        self.__name = uname
        self.__title = "China Bank -- Beijing"  #子类定义同名属性银行名称

    def bank_title(self):            #子类定义同名公有方法
        return self.__title 

导入模块内的类与导入模块内的函数概念是一样的。导入模块的单一类:from 模块名称 import 类名称;导入模块的多个类:from 模块名称 import 类名称1, ..., 类名称n;直接导入整个类模块:import 模块名称;导入模块内所有类:from 模块名称 import *(不建议使用该导入方式,有可能会导致模块中类名称和主程序中变量名称冲突,也不知道使用模块中的哪些类)

#import banks
#from banks import *
#from banks import Banks
from banks import Banks, BeijingBanks

huangbank = Banks('huang')
print("huangbank: ", huangbank.bank_title())
huangbank.save_money(500)
huangbank.get_balance()
linbank = BeijingBanks('lin')
print("linbank: ", linbank.bank_title())

有时候可能一个模块内有太多类了,此时可以考虑将一系列的类分成2个或更多个模块储存。如果拆成类的模块彼此有衍生关系,则子类也需将父类导入,执行时才不会有错误产生。下面将banks模块拆成两个模块 banks1.py(包含父类Banks)和 beijingbank.py(包含子类BeijingBanks) 

#banks1.py
class Banks():
    #定义银行类
    def __init__(self, uname):       #初始化方法
        self.__name = uname          #设定私有属性客户名称
        self.__balance =  0          #设定私有属性存款余额
        self.__title = "China Bank"  #设定私有属性银行名称

    def save_money(self, money):       #设计存款方法
        self.__balance += money
        print("存款 ", money, " 完成")

    def withdraw_money(self, money):   #设计取款方法
        self.__balance -= money
        print("取款 ", money, " 完成")
        
    def get_balance(self):             #获得当前存款余额方法
        print(self.__name, "目前余额是: ", self.__balance)

    def bank_title(self):              #获得银行名称
        return self.__title
#beijingbank.py
from banks1 import Banks  #必须导入父类所在模块

class BeijingBanks(Banks):
    #定义银行子类
    def __init__(self, uname):      
        self.__name = uname
        self.__title = "China Bank -- Beijing"

    def bank_title(self):
        return self.__title 
from banks1 import Banks               #导入banks1模块中的Banks类
from beijingbank import BeijingBanks   #导入beijingbank模块中的BeijingBanks类

huangbank = Banks('huang')
print("huangbank: ", huangbank.bank_title())
huangbank.save_money(500)
huangbank.get_balance()
linbank = BeijingBanks('lin')
print("linbank: ", linbank.bank_title())

三、Python常用内置模块

1、随机数random模块。常用的方法有三个,分别是randint()、choice()、shuffle()。randint()方法可以随机产生指定区间的整数,它的语法如下:randint(min, max)。代表可以产生min与max之间的整数值(包含min和max两个边界值)。choice( )方法可以让我们在一个列表(list)中随机返回一个元素。shuffle( )方法可以将列表元素重新排列:

import random

for i in range(3):
    print(random.randint(1, 10))  #随机输出1-10之间的整数

fruits = ['apple', 'banana', 'grape', 'watermelon']
print(random.choice(fruits))  #随机从列表中选择一个水果

porker = ['2', '3', '4', '5', '6', '7', '8',
          '9', '10', 'J', 'Q', 'K', 'A']
random.shuffle(porker)  #将扑克牌打乱属性
print(porker)

2、时间time模块。常用的方法有time()、sleep( )、asctime( )、localtime( )。time( )方法可以传回自1970年1月1日00:00:00AM以来的秒数,初看好像用处不大,但如果想要掌握某段工作所花时间则很有用。sleep( )方法可以让工作暂停,这个方法的参数单位是秒。这个方法对于设计动画非常有帮助。asctime( )方法会以可以阅读方式列出目前系统时间。localtime( )方法可以返回目前时间的结构数据,所返回的结构可以用索引方式获得个别内容:

import random
import time

print("计算1970年1月1日00:00:00至今的秒数:", time.time())

#猜数字游戏,并计算花多少时间猜对数字
min, max = 1, 10
ans = random.randint(min, max)

yournum = int(input("请猜1-10之间的数字:"))
starttime = int(time.time())  #开始秒数

while True:
    if yournum == ans:
        print("恭喜答对了!")
        endtime = int(time.time())  #结束秒数
        print("所花时间:", endtime - starttime, ' 秒')
        break
    elif yournum > ans:
        print("请猜小一点")
    else:
        print("请猜大一点")

    yournum = int(input("请猜1-10之间的数字:"))
import time

print(time.asctime())  #打印当前系统时间

xtime = time.localtime()  
print(xtime)           #打印当前系统时间的结构数据
print("年:", xtime[0])
print("月:", xtime[1])
print("日:", xtime[2])
print("时:", xtime[3])
print("分:", xtime[4])
print("秒:", xtime[5])
print("星期几:", xtime[6]) #0代表星期一,1代表星期二, 6代表星期日
print("第几天:", xtime[7]) #代表是这一年中的第几天


#每隔1秒打印一次水果
fruits = ['apple', 'banana', 'grape', 'watermelon']
for fruit in fruits:
    print(fruit)
    time.sleep(1) #暂停1秒

3、系统sys模块。这个模块可以控制Python Shell窗口信息:

import sys

#sys.version属性可以列出版本信息
print("目前python版本是:", sys.version)

#sys.stdin对象是指从屏幕输入,可以搭配readline( )方法,
#然后可以读取屏幕输入直到按下Enter键的字符串
print("请输入字符串,输入完按Enter:", end="")
msg = sys.stdin.readline()
print(msg)

#在readline()方法内可以加上正整数参数,
#例如:readline(n),n代表所读取的字符数,
#其中一个中文字或空格也算一个字符数
print("请输入字符串,输入完按Enter:", end="")
msg = sys.stdin.readline(5)
print(msg)

#sys.stdout对象是指从屏幕输出,可以搭配write()方法从屏幕输出数据
sys.stdout.write("I like Python")

4、keyword模块。这个模块有一些Python关键词的功能:

import keyword

#kwlist属性列出所有python关键词
print(keyword.kwlist)

#iskeyword方法判断参数的字符串是否是关键词
print(keyword.iskeyword('python'))
print(keyword.iskeyword('while'))

5、时间模块datetime。datetime模块内有一个数据类datetime,可以用它代表一个特定时间,有一个now( )方法可以列出现在时间。我们也可以使用属性year、month、day、hour、minute、second、microsecond(百万分之一秒),获得上述时间的个别内容。

import datetime

timeNow = datetime.datetime.now()
print(type(timeNow))
print("当前时间:", timeNow)
print("年:", timeNow.year)
print("月:", timeNow.month)
print("日:", timeNow.day)
print("时:", timeNow.hour)
print("分:", timeNow.minute)
print("秒:", timeNow.second)
print("微秒:", timeNow.microsecond)

#使用datetime.datetime(年, 月, 日, 时, 分, 秒)设定特定时间
xtime = datetime.datetime(2020, 11, 11, 11, 59, 59)
print(xtime)

datetime模块内有一个数据类timedelta,代表的是一段时间,可以用下列方式指定一段时间:

deltaTime = datetime.timedelta(days=xseconds=xmicroseconds=x, milliseconds=x, minutes=xhours=xweeks=x)

这里所有参数都是可选的,且默认都是0,参数的值可以是整数,浮点数,正数或负数。timedelta类实际只有3个属性days、seconds、microseconds,其他参数会自动转为这三个属性值。timedelta类有一个方法total_second( )可以将一段时间转成秒数。Python允许时间相加,可以将datetime和timedelta的对象相加:

import datetime

deltaTime = datetime.timedelta(days = 3, hours = 5.4, minutes = 8)
#打印三个属性值,这里会自动将hours和minutes值转为seconds属性值
print(deltaTime.days, deltaTime.seconds, deltaTime.microseconds) 
print(deltaTime.total_seconds())  #转为总的秒数


timeNow = datetime.datetime.now()     
deltaTime1 = datetime.timedelta(days = 100)
deltaTime2 = datetime.timedelta(days = -100)
print("现在时间是:", timeNow)
print("100天后是:", timeNow + deltaTime1) #日期和一段时间相加
print("100天前是:", timeNow + deltaTime2)

如果要将datetime对象转成字符串,可以使用strftime()方法。这个方法的参数定义如下:

import datetime

timeNow = datetime.datetime.now()
print(timeNow.strftime("%Y/%m/%d %H:%M:%S"))
print(timeNow.strftime("%y-%b-%d %H-%M-%S"))

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值