1. 模块
1.1 模块的简介
- 模块化 : 将完整的程序分成一个个功能模块
- 模块化的优点:
- 1.方便开发并且方便维护
- 2.模块可以复用
- 3.高复用,低耦合
1.2 模块的导入
-
- import 模块名 (即Python文件名)
# 在Python中一个.py文件就是一个模块
# 引入外部模块
import test_m
# 可以多次引入同一个模块,但是模块只会执行一次
import test_m
# 打印出的结果是被引用模块所在的路径
print(test_m)
-
- import 模块名 as XXX (模块别名)
import test_m as test_k
# NameError: name 'test_m' is not defined
# 一旦采用别名,原名调用模块就不可用了,只能使用别名调用
# print(test_m)
print(test_k)
# __name__打印出的是外部调用的模块的原名
print(__name__)
# 如果这个模块直接运行,则__name__默认的字符串就是__main__
# 表示当前文件为主文件
# 访问外部模块的变量: 模块名.变量
print(test_k.a,test_k.b)
# 访问外部模块的函数: 模块名.函数
print(test_k.fun1,test_k.fun2)
# 访问外部模块的类:
p = test_k.Person()
print(p.name)
- 3.语法 from 模块名 import 变量,变量,变量
- 用于清楚需要引用哪些变量的情况
from test_m import Person,fun1,fun2
# 这种模式没法打印外部模块地址
# print(test_m)
p1 = Person()
print(p1)
fun1()
- 4.语法: from 模块名 import *
- 用于不知道要引入哪些变量的情况
- 如果主模块定义函数与外部模块重名会有冲突
def fun1():
print('我是主模块的fun1')
from test_m import *
fun1()
fun2()
-
- 语法:from 模块名 import 变量 as 别名
- 可以通过以上语法避免变量名的冲突
-
说明: 在模块中可以定义私有变量,变量名之前加_, 即 _变量名
-
- 模块中测试变量的处理
if name == ‘main’:
- 如果函数为主函数,则运行测试代码
- 如果函数不是主函数,则不运行测试代码
- print(‘我是测试代码’)
# print('这是我的第一个模块')
# print(__name__)
# 在模块中定义变量
a = 23
b = 12
# 可以定义私有变量
_c = 35
# 在模块中定义函数
def fun1():
print('我是fun1')
def fun2():
print('我是fun2')
# 在模块中定义类
class Person:
def __init__(self):
self.name = '机器人'
# 测试代码的处理
# 如果函数为主函数,则运行测试代码
# 如果函数不是主函数,则不运行测试代码
if __name__ == '__main__':
c = Person()
print(c.name)
2.迭代器
- 迭代器也是访问元素的一种方式
- 特点是可以记住遍历位置的对象
- 迭代器也是从序列第一个元素顺序访问,但无法返回
- iter()
- next()
lst = [1,2,3,4,5,6,7,8]
myiter = iter(lst)
print(next(myiter))
print(next(myiter))
print(next(myiter))
- 迭代数据结构
for i in myiter:
print(i)
3.生成器
- 在Python中使用yield则会个关键字,就称为生成器或生成器函数
- 生成器是迭代器的一种特殊形式
- next()方法 从当前位置继续访问
def fn():
print('11')
yield 1
print('12')
yield 2
print('13')
yield 3
print('14')
yield 4
print('15')
yield 5
print('16')
f = fn()
- fn的类型是function
print(type(fn))
- fn()的类型是generator
print(type(fn()))
- f的类型是生成器generator
print(type(f))
print('返回:',next(f))
print('返回:',next(f))
print('返回:',next(f))