python学习第九章-模块和包

1.模块化编程

  • import导入模块的两种用法:
  1. import  模块名1[as 别名1],模块名2[as 别名2],……
  2. from 模块名 import 成员名1[as 别名1],成员名2[as 别名2]……

      注:第一种import语句导入模块内的所有成员,且使用其成员时必须加上模块名前缀。第二种只导入模块内的指定成员(除非from 模块名 import *,但不推荐)

       需要特别说明的是,若同时导入module1和module2 内的所有成员,假设这两个模块都有foo()函数,调用时会产生问题。换成如下导入方式:就会解决问题。

import module1
import module2 as m2
module1.foo()
m2.foo()

    import导入模块

# 导入sys整个模块
import sys
#使用sys模块作为前缀
#argv变量用于获取python程序的命令行参数,argv[0]获取该程序名
print(sys.argv[0])
#导入sys模块时,并指定别名s
import sys as s
print(s.argv[0])
#导入多个模块
import sys,os
print(sys.argv[0])
#os模块的sep变量代表平台上的路径分隔符
print(os.sep)
D:/Python/lab/code9/9.1/import_test3.py
\

from import 导入模块 

#导入sys模块内的argv成员
from sys import argv
#不需模块名前缀,直接使用
print(argv[0])
# 为其指定别名v
from sys import argv as v
# 直接使用成员的别名访问
print(v[0])
# 导入sys模块的argv,winver成员
from sys import argv, winver
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
#winver记录python的版本号
print(winver)
# 导入sys模块的argv,winver成员,并为其指定别名v、wv
from sys import argv as v, winver as wv
#直接使用成员的别名访问
print(v[0])
print(wv)
  • 定义模块:模块就是python程序
'''
这是我们编写的第一个模块,该模块包含以下内容:
my_book:字符串变量
say_hi:简单的函数
User:代表用户的类
'''
print('这是module 1')
my_book = '疯狂Python讲义'
def say_hi(user):
    print('%s,您好,欢迎学习Python' % user)
class User:
    def __init__(self, name):
        self.name = name
    def walk(self):
        print('%s正在慢慢地走路' % self.name)
    def __repr__(self):
        return 'User[name=%s]' % self.name


# ====以下部分是测试代码====
def test_my_book ():
    print(my_book)
def test_say_hi():
    say_hi('孙悟空')
    say_hi(User('Charlie'))
def test_User():
    u = User('白骨精')
    u.walk()
    print(u)
# 当__name__为'__main__'(直接使用python运行该模块)时执行如下代码
if __name__ == '__main__':
    test_my_book()
    test_say_hi()
    test_User()

2.加载模块

  • 为了让 Python 能找到我们编写 (或第三方提供) 的模块,可以用以下两种方式来告诉它 

        1.使用环境变量

        2.将模块放在默认的模块加载路径下

   编写print_shape模块文件,并将文件复制在lib\site_packages路径下

'''
简单的模块,该模块包含以下内容
my_list:保存列表的变量
print_triangle: 使用星号打印三角形的函数
'''
my_list = ['Python', 'Kotlin', 'Swift']
def print_triangle(n):
    '''使用星号打印一个三角形'''
    if n <= 0:
        raise ValueError('n必须大于0')
    for i in range(n):
        print(' ' * (n - i - 1), end='')
        print('*' * (2 * i + 1), end='')
        print('')

# ====以下是测试代码====
def test_print_triangle():
    print_triangle(3)
    print_triangle(4)
    print_triangle(7)
if __name__ == '__main__': test_print_triangle()

 可正常引用该模块

import print_shape
print(print_shape.__doc__)

print_shape.my_list[1]
print_shape.print_triangle(5)
  • 模块的__all__变量:将变量的值设置成一个列表,只有列表里的才会被暴露出来
'测试__all__变量'

def hello():
    print("Hello, Python")
def world():
    print("Pyhton World ")
def test():
    print('--test--')

# 定义__all__变量,只有hello和world两个程序单元
__all__ = ['hello', 'world']
from all_module import *
hello()#Hello, Python
world()#Pyhton World
test() #NameError: name 'test' is not defined

  如果希望程序使用模块内__all__列表外的程序单元,有两种解决方法:

  1. 使用import来导入模块,通过模块名前缀来调用模块内的成员
  2. 使用 from 模块名 import 程序单元 来导入指定程序单元

3.使用包

  • 包是啥

           物理层面:包就是一个文件夹,且这里包含了一个__init__.py文件

           逻辑层面:包的本质依然是模块 

  • 定义包
  1. 创建一个文件夹,该文件夹名字就是该包的名字
  2. 在文件夹里添加一个__init__.py文件

 新建first_package文件夹,在里面添加一个__init__.py文件

'''
这是学习包的第一个示例
'''
print('this is first_package')

新建程序来使用该包

# 导入first_package包(模块)
import first_package

print('==========')
print(first_package.__doc__)
print(type(first_package))
print(first_package)

4.查看模块内容

  • 查看模块包含什么

  1.  使用dir()函数

  2. 使用模块本身提供的__all__变量

    注:并不是所有模块都提供__all__变量,有的模块不提供,可私用列表推断式来查看模块中的程序单元

    在python控制台中查看string模块(python内置的用于丰富字符串功能)的内容

import string
dir(string)
['Formatter', 'Template', '_ChainMap', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_sentinel_dict', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']

为了过滤以下划线开头的程序单元,可使用 列表推断式 来列出

[e for e in dir(string) if not e.startswith('_')]
['Formatter', 'Template', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
string.__all__
['ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace', 'Formatter', 'Template']
  • 使用__doc__属性查看文档

       使用help()函数查看的就是程序单元的__doc__属性值,如下:

help(string.capwords)
Help on function capwords in module string:
capwords(s, sep=None)
    capwords(s [,sep]) -> string
    
    Split the argument into words using split, capitalize each
    word using capitalize, and join the capitalized words using
    join.  If the optional second argument sep is absent or None,
    runs of whitespace characters are replaced by a single space
    and leading and trailing whitespace are removed, otherwise
    sep is used to split and join the words.
print(string.capwords.__doc__)
capwords(s [,sep]) -> string
    Split the argument into words using split, capitalize each
    word using capitalize, and join the capitalized words using
    join.  If the optional second argument sep is absent or None,
    runs of whitespace characters are replaced by a single space
    and leading and trailing whitespace are removed, otherwise
    sep is used to split and join the words.

        capwords()函数就是将给定s字符串中每个单词首字母变成大写的 

  • 使用__file__属性查看模块的源文件路径
string.__file__
'D:\\lib\\string.py'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值