我心中的王者:Python-第13章 设计与应用模块

我心中的王者:Python-第13章 设计与应用模块

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

本章笔者将讲解如何将自己所设计的函数或类存储成模块然后加以引用,最后也将讲解Python常用的内置模块。Python最大的优势是免费资源,因此有大量公司使用它开发了大量功能强大的模块,笔者将在第二篇迈向Python高手之路,详细说明使用外部模块执行更多有意义的工作。

13-1 将自建的函数存储在模块中

一个大型程序一定是由许多的函数或类所组成,为了让程序的工作可以分工以及增加程序的可读性,我们可以将所建的函数或类存储成模块(module)形式的独立文件,未来再加以调用引用。

13-1-1 先前准备工作

假设有一个程序内容是用于建立冰淇淋(ice cream)与饮料(drink),如下所示:

程序实例ch13_1.py:这个程序基本上是扩充ch11_23.py,再增加建立饮料的函数。

# ch13_1.py
def make_icecream(*toppings):
    # 列出制作冰淇淋的配料
    print("这个冰淇淋所加配料如下")
    for topping in toppings:
        print("--- ", topping)

def make_drink(size, drink):
    # 输入饮料规格与种类,然后输出饮料
    print("所点饮料如下")
    print("--- ", size.title())
    print("--- ", drink.title())

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

执行结果

这个冰淇淋所加配料如下
---  草莓酱
这个冰淇淋所加配料如下
---  草莓酱
---  葡萄干
---  巧克力碎片
所点饮料如下
---  Large
---  Coke

假设我们会常常需要在其他程序调用make_icecream( )和make_drink( ),此时可以考虑将这2个函数建立成模块(module),未来可以供其他程序调用使用。

13-1-2 建立函数内容的模块

模块的扩展名与Python程序文件一样,是py,对于程序实例ch13_1.py而言,我们可以只保留make_icecream( )和make_drink( )。

程序实例makefood.py:使用ch13_1.py建立一个模块,此模块名称是makefood.py。
在这里插入图片描述

执行结果 由于这不是程序所以没有任何执行结果。

现在我们已经成功地建立模块makefood.py了。

13-2 应用自己建立的函数模块

有几种方法可以应用函数模块,下列将分成6小节说明。

13-2-1 import模块名称

要导入13-1-2节所建的模块,只要在程序内加上下列简单的语法即可:

import 模块名称  # 导入模块

若以13-1-2节的实例,只要在程序内加上下列简单的语法即可:

 import makefood

程序中要引用模块的函数语法如下:

模块名称.函数名称  # 模块名称与函数名称间有小数点”.”

程序实例ch13_2.py:实际导入模块makefood.py的应用。

# ch13_2.py
import makefood         # 导入模块makefood.py

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

执行结果 与ch13_1.py相同。

13-2-2 导入模块内特定单一函数

如果只想导入模块内单一特定的函数,可以使用下列语法:

from 模块名称 import 函数名称

未来程序引用所导入的函数时可以省略模块名称。

程序实例ch13_3.py:这个程序只导入makefood.py模块的make_icecream( )函数,所以程序第4和5行执行没有问题,但是执行程序第6行时就会产生错误。

# ch13_3.py
from makefood import make_icecream  # 导入模块makefood.py的函数make_icecream

make_icecream('草莓酱')
make_icecream('草莓酱', '葡萄干', '巧克力碎片')
make_drink('large', 'coke')         # 因为没有导入此函数所以会产生错误

执行结果

这个冰淇淋所加配料如下
---  草莓酱
这个冰淇淋所加配料如下
---  草莓酱
---  葡萄干
---  巧克力碎片
Traceback (most recent call last):
  File "e:\桌面Desktop\Python王者归来\代码\ch13\ch13_3.py", line 6, in <module>
    make_drink('large', 'coke')         # 因为没有导入此函数所以会产生错误
    ^^^^^^^^^^
NameError: name 'make_drink' is not defined

13-2-3 导入模块内多个函数

 from 模块名称 import 函数名称1, 函数名称2,, 函数名称n

如果想导入模块内多个函数,函数名称间需以逗号隔开,语法如下:

程序实例ch13_4.py:重新设计ch13_3.py,增加导入makedrink( )函数。

# ch13_4.py
# 导入模块makefood.py的make_icecream和make_drink函数
from makefood import make_icecream, make_drink  

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

执行结果 与ch13_1.py相同。

13-2-4 导入模块所有函数

如果想导入模块内所有函数,语法如下:

 from 模块名称 import  *

程序实例ch13_5.py:导入模块所有函数的应用。

# ch13_5.py
from makefood import *      # 导入模块makefood.py所有函数

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

执行结果 与ch13_1.py相同。

13-2-5 使用as给函数指定替代名称

有时候会碰上所设计程序的函数名称与模块内的函数名称相同,或是感觉模块的函数名称太长,此时可以自行给模块的函数名称一个替代名称,未来可以使用这个替代名称代替原先模块的名称。语法格式如下:

 from 模块名称 import 函数名称 as 替代名称

程序实例ch13_6.py:使用替代名称icecream代替make_icecream,重新设计ch13_3.py。

# ch13_6.py
# 使用icecream替代make_icecream函数名称
from makefood import make_icecream  as icecream 

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

执行结果

这个冰淇淋所加配料如下
---  草莓酱
这个冰淇淋所加配料如下
---  草莓酱
---  葡萄干
---  巧克力碎片

13-2-6 使用as给模块指定替代名称

Python也允许给模块替代名称,未来可以使用此替代名称导入模块,其语法格式如下:

import 模块名称 as 替代名称

程序实例ch13_7.py:使用m当作模块替代名称,重新设计ch13_2.py。

# ch13_7.py
import makefood as m        # 导入模块makefood.py的替代名称m

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

执行结果 与ch13_1.py相同。

13-3 将自建的类存储在模块内

第12章笔者介绍了类,当程序设计越来越复杂时,可能我们也会建立许多类,Python也允许我们将所建立的类储存在模块内,这将是本节的重点。

13-3-1 先前准备工作

笔者将使用第12章的程序实例,说明将类储存在模块的方式。

程序实例ch13_8.py:笔者修改了ch12_13.py,简化了Banks类,同时让程序有2个类,至于程序内容读者应该可以轻易了解。

# ch13_8.py
class Banks():
    # 定义银行类别

    def __init__(self, uname):              # 初始化方法
        self.__name = uname                 # 设定私有存款者名字
        self.__balance = 0                  # 设定私有开户金额是0
        self.__title = "Taipei 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.title(), " 目前余额: ", self.__balance)

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

class Shilin_Banks(Banks):
    # 定义士林分行
    def __init__(self, uname):
        self.title = "Taipei Bank - Shilin Branch"  # 定义分行名称
    def bank_title(self):                   # 获得银行名称
        return self.title

jamesbank = Banks('James')                  # 定义Banks类别对象
print("James's banks = ", jamesbank.bank_title())  # 打印银行名称
jamesbank.save_money(500)                   # 存钱
jamesbank.get_balance()                     # 列出存款金额
hungbank = Shilin_Banks('Hung')             # 定义Shilin_Banks类别对象
print("Hung's banks  = ", hungbank.bank_title())   # 打印银行名称

执行结果

James's banks =  Taipei Bank
存款  500  完成
James  目前余额:  500
Hung's banks  =  Taipei Bank - Shilin Branch

13-3-2 建立类内容的模块

模块的扩展名与Python程序文件一样,是py,对于程序实例ch13_8.py而言,我们可以只保留Banks类和Shilin_Banks类。

程序实例banks.py:使用ch13_8.py建立一个模块,此模块名称是banks.py。

# banks.py
# 这是一个包含2个类别的模块(module)
class Banks():
    # 定义银行类别
    def __init__(self, uname):              # 初始化方法
        self.__name = uname                 # 设定私有存款者名字
        self.__balance = 0                  # 设定私有开户金额是0
        self.__title = "Taipei 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.title(), " 目前余额: ", self.__balance)

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

class Shilin_Banks(Banks):
    # 定义士林分行
    def __init__(self, uname):
        self.title = "Taipei Bank - Shilin Branch"  # 定义分行名称
    def bank_title(self):                   # 获得银行名称
        return self.title

执行结果 由于这不是程序所以没有任何执行结果。

现在我们已经成功地建立模块banks.py了。

13-4 应用自己建立的类模块

其实导入模块内的类与导入模块内的函数观念是一致的,下列将分成各小节说明。

13-4-1 导入模块的单一类

观念与13-2-2节相同,它的语法格式如下:

from 模块名称 import 类名称

程序实例ch13_9.py:使用导入模块方式,重新设计ch13_8.py。由于这个程序只导入Banks类,所以此程序不执行原先35和36行。

# ch13_9.py
from banks import Banks                     # 导入banks模块的Banks类别

jamesbank = Banks('James')                  # 定义Banks类别对象
print("James's banks = ", jamesbank.bank_title())  # 打印银行名称
jamesbank.save_money(500)                   # 存钱
jamesbank.get_balance()                     # 列出存款金额

执行结果

James's banks =  Taipei Bank
存款  500  完成
James  目前余额:  500

由执行结果读者应该体会到,整个程序变得非常简洁了。

13-4-2 导入模块的多个类

观念与13-2-3节相同,如果模块内有多个类别,我们也可以使用下列方式导入多个类别,所导入的类别名称间需以逗号隔开。

 from 模块名称 import 类别名称1, 类别名称2,, 类别名称n

程序实例ch13_10.py:以同时导入Banks类别和Shilin_Banks类别的方式,重新设计ch13_8.py。

# ch13_10.py
# 导入banks模块的Banks和Shilin_Banks类别
from banks import Banks, Shilin_Banks       

jamesbank = Banks('James')                  # 定义Banks类别对象
print("James's banks = ", jamesbank.bank_title())  # 打印银行名称
jamesbank.save_money(500)                   # 存钱
jamesbank.get_balance()                     # 列出存款金额
hungbank = Shilin_Banks('Hung')             # 定义Shilin_Banks类别对象
print("Hung's banks  = ", hungbank.bank_title())   # 打印银行名称

执行结果 与ch13_8.py相同。

13-4-3 导入模块内所有类

观念与13-2-4节相同,如果想导入模块内所有类别,语法如下:

  from 模块名称 import  *

程序实例ch13_11.py:使用导入模块所有类别的方式重新设计ch13_8.py。

# ch13_11.py
from banks import *                         # 导入banks模块所有类别     

jamesbank = Banks('James')                  # 定义Banks类别对象
print("James's banks = ", jamesbank.bank_title())  # 打印银行名称
jamesbank.save_money(500)                   # 存钱
jamesbank.get_balance()                     # 列出存款金额
hungbank = Shilin_Banks('Hung')             # 定义Shilin_Banks类别对象
print("Hung's banks  = ", hungbank.bank_title())   # 打印银行名称

执行结果 与ch13_8.py相同。

13-4-4 import模块名称

观念与13-2-1节相同,要导入13-3-2节所建的模块,只要在程序内加上下列简单的语法即可:

import 模块名称  # 导入模块

若以13-3-2节的实例,只要在程序内加上下列简单的语法即可:

 import banks

程序中要引用模块的类别,语法如下:

   模块名称.类别名称  # 模块名称与类别名称间有小数点”.”

程序实例ch13_12.py:使用import模块名称方式,重新设计ch13_8.py,读者应该留意第2、4和8行的设计方式。

# ch13_12.py
import banks                                # 导入banks模块     

jamesbank = banks.Banks('James')            # 定义Banks类别对象
print("James's banks = ", jamesbank.bank_title())  # 打印银行名称
jamesbank.save_money(500)                   # 存钱
jamesbank.get_balance()                     # 列出存款金额
hungbank = banks.Shilin_Banks('Hung')       # 定义Shilin_Banks类别对象
print("Hung's banks  = ", hungbank.bank_title())   # 打印银行名称

执行结果 与ch13_8.py相同。

13-4-5 模块内导入另一个模块的类
有时候可能一个模块内有太多类别了,此时可以考虑将一系列的类别分成2个或更多个模块储存。如果拆成类别的模块彼此有衍生关系,则子类别也需将父类别导入,执行时才不会有错误产生。下列是将Banks模块拆成2个模块的内容。

程序实例banks1.py:这个模块含父类别Banks的内容。
在这里插入图片描述

程序实例shilin_banks.py:这个模块含子类别Shilin_Banks的内容,读者应留意第3行,笔者在这的模块内导入了banks1.py模块的Banks类别。
在这里插入图片描述

程序实例ch13_13.py:在这个程序中,笔者在第2和3行分别导入2个模块,至于整个程序的执行内容,则与ch13_8.py相同。

# ch13_13.py
from banks1 import Banks                # 导入banks模块的Banks类别
from shilin_Banks import Shilin_Banks   # 导入Shilin_Banks模块的Shilin_Banks类别

jamesbank = Banks('James')       # 定义Banks类别对象
print("James's banks = ", jamesbank.bank_title())  # 打印银行名称
jamesbank.save_money(500)               # 存钱
jamesbank.get_balance()                 # 列出存款金额
hungbank = Shilin_Banks('Hung')       # 定义Shilin_Banks类别对象
print("Hung's banks  = ", hungbank.bank_title())   # 打印银行名称

执行结果 与ch13_8.py相同。

13-5 随机数random模块

所谓的随机数是指平均散布在某区间的数字,随机数其实用途很广,最常见的应用是设计游戏时可以控制输出结果,赌场的吃角子老虎机器就是靠它赚钱。这节笔者将介绍random模块中最有用的3个方法,同时也会分析赌场赚钱的利器。

13-5-1 randint( )

这个方法可以随机产生指定区间的整数,它的语法如下:

randint(min, max)  # 可以产生min与max之间的整数值

程序实例ch13_14.py:建立一个程序分别产生3组在1-100、500-1000、2000-3000的数字。

# ch13_14.py
import random           # 导入模块random

n = 3
for i in range(n):
    print("1-100     : ", random.randint(1, 100))

for i in range(n):
    print("500-1000  : ", random.randint(500, 1000))

for i in range(n):
    print("2000-3000 : ", random.randint(2000, 3000))

执行结果

1-100     :  66
1-100     :  45
1-100     :  100
500-1000  :  777
500-1000  :  955
500-1000  :  905
2000-3000 :  2993
2000-3000 :  2230
2000-3000 :  2943

程序实例ch13_15.py:猜数字游戏,这个程序首先会用randint( )方法产生一个1到10之间的数字,然后如果猜的数值太小会要求猜大一些,如果猜的数值太大会要求猜小一些,最后列出猜了几次才答对。

# ch13_15.py
import random                       # 导入模块random

min, max = 1, 10
ans = random.randint(min, max)      # 随机数产生答案
while True:
    yourNum = int(input("请猜1-10之间数字: "))
    if yourNum == ans:
        print("恭喜!答对了")
        break
    elif yourNum < ans:
        print("请猜大一些")
    else:
        print("请猜小一些")

执行结果

请猜1-10之间数字: 5
请猜大一些
请猜1-10之间数字: 8
恭喜!答对了

一般赌场的机器其实可以用随机数控制输赢,例如:某个猜大小机器,一般人以为猜对率是50%,但是只要控制随机数,赌场可以直接控制输赢比例。

程序实例ch13_16.py:这是一个猜大小的游戏,程序执行初可以设定庄家的输赢比例,程序会立即回应是否猜对。

# ch13_16.py
import random                       # 导入模块random

min, max = 1, 100                   # 随机数最小与最大值设定
winPercent = int(input("请输入庄家赢的比率(0-100)之间 :"))

while True:
    print("猜大小游戏: L或l表示大,  S或s表示小, Q或q则程序结束")
    customerNum = input("= ")       # 读取玩家输入
    if customerNum == 'Q' or customerNum == 'q':    # 若输入Q或q
        break                                       # 程序结束
    num = random.randint(min, max)  # 产生是否让玩家答对的随机数
    if num > winPercent:            # 随机数在81-100间回应玩家猜对
        print("恭喜!答对了\n")
    else:                           # 随机数在1-80间回应玩家猜错
        print("答错了!请再试一次\n")

执行结果

请输入庄家赢的比率(0-100)之间 :5
猜大小游戏: L或l表示大,  S或s表示小, Q或q则程序结束
= 1
恭喜!答对了

猜大小游戏: L或l表示大,  S或s表示小, Q或q则程序结束
= 

这个程序的关键点1是程序第5行,庄家可以在程序启动时先设定赢的比率。第2个关键点是程序第12行产生的随机数,由1~100的随机数决定玩家是赢或输,猜大小只是幌子。例如,庄家刚开始设定赢的机率是80%,相当于如果随机数是在81~100的算玩家赢,如果随机数是1~80算玩家输。

在这里插入图片描述

13-5-2 choice( )

这个方法可以让我们在一个列表(list)中随机传回一个元素。

程序实例ch13_17.py:有一个水果列表,使用choice( )方法随机选取一个水果。

# ch13_17.py
import random                       # 导入模块random

fruits = ['苹果', '香蕉', '西瓜', '水蜜桃', '百香果']
print(random.choice(fruits))

执行结果 下列是程序执行2次的执行结果。

苹果
香蕉

13-5-3 shuffle( )

这个方法可以将列表元素重新排列,如果你欲设计扑克牌(Porker)游戏,在发牌前可以使用这个方法将牌打乱重新排列。

程序实例ch13_18.py:将列表内的扑克牌次序打乱,然后重新排列。

# ch13_18.py
import random                       # 导入模块random

porker = ['2', '3', '4', '5', '6', '7', '8',
          '9', '10', 'J', 'Q', 'K', 'A']
random.shuffle(porker)              # 将次序打乱重新排列
print(porker)

执行结果

['6', '9', '8', '5', '4', '10', '7', 'J', '3', 'Q', 'A', 'K', '2']
['7', '3', 'K', '6', '10', '8', '5', 'A', '2', '9', '4', 'Q', 'J']

将列表元素打乱,很适合老师出防止作弊的考题,例如,有50位学生,为了避免学生偷窥邻座的考卷,建议可以将出好的题目处理成列表,然后使用for循环执行50次shuffle( ),这样就可以得到50份考题相同但是次序不同的考卷。笔者将这个观念当作是习题。

13-6 时间time模块

13-6-1 time( )

time( )方法可以传回自1970年1月1日00:00:00AM以来的秒数,初看好像用处不大,但如果想要掌握某段工作所花时间则很有用,例如,若应用在程序实例ch13_15.py,你可以用它计算猜数字所花时间。

程序实例ch13_19.py:计算自1970年1月1日00:00:00AM以来的秒数。

# ch13_19.py
import time                         # 导入模块time

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

执行结果

计算19701100:00:00至今的秒数 =  1722162309

读者的执行结果将和笔者不同,因为我们是在不同的时间点执行这个程序。

程序实例ch13_20.py:扩充ch13_15.py的功能,主要是增加计算花多少时间猜对数字。

# ch13_20.py
import random                       # 导入模块random
import 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之间数字: "))

执行结果

请猜1-10之间数字: 5
请猜大一些
请猜1-10之间数字: 8
请猜大一些
请猜1-10之间数字: 9
恭喜!答对了
所花时间:  6

13-6-2 sleep( )

sleep( )方法可以让工作暂停,这个方法的参数单位是秒。这个方法对于设计动画非常有帮助,未来我们还会介绍这个方法更多的应用。

程序实例ch13_21.py:每秒打印一次列表的内容。

# ch13_21.py
import time                        # 导入模块time

fruits = ['苹果', '香蕉', '西瓜', '水蜜桃', '百香果']
for fruit in fruits:
    print(fruit)
    time.sleep(1)                   # 暂停1秒

执行结果

苹果
香蕉
西瓜
水蜜桃
百香果

13-6-3 asctime( )

这个方法会以可以阅读方式列出目前系统时间。

程序实例ch13_22.py:列出目前系统时间。

# ch13_22.py
import time                         # 导入模块time

print(time.asctime())               # 列出目前系统时间 

执行结果

Sun Jul 28 18:28:01 2024

13-6-4 localtime( )

这个方法可以返回目前时间的结构数据,所返回的结构可以用索引方式获得个别内容。

程序实例ch13_23.py:使用localtime( )方法列出目前时间的结构数据,同时使用索引列出个别内容。

# ch13_23.py
import time                         # 导入模块time

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])
print("第几天   ", xtime[7])
print("夏令时间 ", xtime[8])

执行结果

time.struct_time(tm_year=2024, tm_mon=7, tm_mday=28, tm_hour=18, tm_min=28, tm_sec=46, tm_wday=6, tm_yday=210, tm_isdst=0)2024728182846
星期几    6
第几天    210
夏令时间  0

上述索引第12行[6]是代表星期几的设定,0代表星期一,1代表星期2。上述第13行索引[7]是第几天的设定,代表这是一年中的第几天。上述第14行索引[8]是夏令时间的设定,0代表不是,1代表是。

13-7 系统sys模块

这个模块可以控制Python Shell窗口信息。

13-7-1 version属性

这个属性可以列出目前所使用Python的版本信息。

程序实例ch13_24.py:列出目前所使用Python的版本信息。

# ch13_24.py
import sys

print("目前Python版本是: ", sys.version)

执行结果

目前Python版本是:  3.11.1 (tags/v3.11.1:a7a450f, Dec  6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)]

13-7-2 stdin对象

这是一个对象,stdin是standard input的缩写,是指从屏幕输入(可想成Python Shell窗口),这个对象可以搭配readline( )方法,然后可以读取屏幕输入直到按下Enter键的字符串。

程序实例ch13_25.py:读取屏幕输入。

# ch13_25.py
import sys
print("请输入字符串, 输入完按Enter = ", end = "")
msg = sys.stdin.readline()
print(msg)

执行结果

晓波王者归来
请输入字符串, 输入完按Enter = 晓波王者归来

在readline( )方法内可以加上正整数参数,例如:readline(n),这个n代表所读取的字符数,其中一个中文字或空格也算一个字符数。

程序实例ch13_26.py:从屏幕读取8个字符数的应用。

# ch13_26.py
import sys
print("请输入字符串, 输入完按Enter = ", end = "")
msg = sys.stdin.readline(8)         # 读8个字
print(msg)

执行结果

晓波喜欢Python,王者归来
请输入字符串, 输入完按Enter = 晓波喜欢Pyth

13-7-3 stdout对象

这是一个对象,stdout是standard ouput的缩写,是指从屏幕输出(可想成Python Shell窗口),这个对象可以搭配write( )方法,然后可以从屏幕输出数据。

程序实例ch13_27.py:使用stdout对象输出数据。

# ch13_27.py
import sys

sys.stdout.write("I like Python")

执行结果

I like Python

其实这个对象若是使用Python Shell窗口,最后会同时列出输出的字符数。
在这里插入图片描述

13-8 keyword模块

这个模块有一些Python关键词的功能。

13-8-1 kwlist属性

这个属性含所有Python的关键词。

程序实例ch13_28.py:列出所有Python关键词。

# ch13_28.py
import keyword

print(keyword.kwlist)

执行结果

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

13-8-2 iskeyword( )

这个方法可以传回参数的字符串是否是关键词,如果是传回True,如果否传回False。

程序实例ch13_29.py:检查列表内的字是否是关键词。

# ch13_29.py
import keyword                      # 导入keyword模块

keywordLists = ['as', 'while', 'break', 'sse', 'Python']
for x in keywordLists:
    print("%8s " % x, keyword.iskeyword(x))

执行结果

     as  True
   while  True
   break  True
     sse  False
  Python  False

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值