迭代器、生成器、模块和包
一、迭代器
1. 什么是迭代器(iter)
"""
迭代器是容器型数据类型, 只能通过类型转换和生成器来获得迭代器对象
迭代器存储数据的特点: 同时可以保存多个数据,没有办法直接查看,而是需要先将数据从迭代器中取出来(取出来之后不能再放回去)
"""
iter1 = iter([10, 20, 30, 40])
print(iter1)
iter2 = iter('abc')
print(iter2)
iter3 = iter({'name': '张三', 'age': 18, 'gender': '男'})
print(iter3)
iter4 = copy(iter1)
print(iter4)
2.获取迭代器中的元素
"""
(**)无论通过什么样的方式,只要是将迭代器中的某个元素拿到了,那么这个元素在迭代器中就不存在了
"""
list1 = list(iter1)
print(list1)
list2 = list(iter1)
print(list2)
iter5 = iter('hello!')
for x in iter5:
print(f'x: {x}')
print(list(iter5))
"""
next(迭代器对象) - 获取迭代器中的一个元素(当前最前面的那个元素)
迭代器对象.__next__() - 获取迭代器中的一个元素(当前最前面的那个元素)
"""
iter3 = iter({'name': '张三', 'age': 18, 'gender': '男'})
print(next(iter3))
print(next(iter3))
print(next(iter3))
print('===============================')
iter4 = iter([1, 2, 3, 4, 5, 6, 7])
next(iter4)
next(iter4)
print('++++++++++')
for x in iter4:
print(f'x: {x}')
二、生成器
1.什么是生成器
"""
a.概念1
生成器就是迭代器
b.概念2
调用一个带有 yield 关键字的函数就可以得到一个生成器
"""
def func1():
print('++++')
print('----')
yield
result = func1()
print('result:', result)
2.生成器产生数据(生成器中的元素怎么产生)
"""
生成器能生产多少数据就看执行生成器对应的函数的函数体会遇到几次 yield ; yield 后面表达式的值就是生成器能够产生的数据
"""
def create_gender1():
yield 10
yield 100
yield 78
gen1 = create_gender1()
print(list(gen1))
3.生成器产生数据的原理
"""
当获取生成器元素的时候,会自动调用生成器关联的函数。第一次从函数开始的地方开始执行,直到遇到 yield 为止,
并且将 yield 后面的值作为获取到的数据;后面每次都是从上一次结束的位置开始执行,直到遇到 yield。如果从开始执行到函数结束都没有遇到 yield 就不会产生数据(如果是用 next 去取的数据这个时候会报错)
"""
def create_gender2():
print('函数开始')
yield 10
print('++++++')
yield 98
print('========')
yield 100
print('函数结束')
gen2 = create_gender2()
print('========第1次========')
print(f'元素: {next(gen2)}')
print('========第2次========')
print(f'元素: {next(gen2)}')
print('========第3次========')
print(f'元素: {next(gen2)}')
print('========第4次========')
def create_gender3():
num = 0
while True:
num += 1
yield num
gen3 = create_gender3()
print(next(gen3))
from random import choices
def code_gender4():
alp = 'abcdefghijklmnopqrstuvwxyz'
str1 = alp + alp.upper() + '0123456789'
while True:
yield ''.join(choices(str1, k=4))
gen4 = code_gender4()
print(next(gen4))
print(next(gen4))
def create_gender5():
for x in range(5):
yield x
print(next(create_gender5()))
print(next(create_gender5()))
gen5 = create_gender5()
print(next(gen5))
print(next(gen5))
4. 生成式
"""
生成式就是生成器的简写
列表推导式的[]变成()就变成了生成式
"""
list1 = [x*2 for x in range(5)]
print(list1)
gen1 = (x*2 for x in range(5))
print(gen1)
print(next(gen1))
print(next(gen1))
def func():
for x in range(5):
yield x*2
gen1 = func()
三、模块
1.什么是模块
"""
一个模块就是一个py文件, py文件的文件名就是模块名
"""
2.在一个模块中使用另外一个模块的内容
"""
1) 哪些能用:所有在指定if语句外的全局变量
2) 怎么使用: 需要先导入模块
import 模块名 - 导入后可以使用所有的全局变量;以 '模块名.变量' 来使用变量
from 模块名 import 变量1, 变量2, 变量3,... - 导入后可以使用指定的变量; 直接使用变量
from 模块名 import * - 导入后可以使用所有的全局变量; 直接使用变量 (不推荐使用)
import 模块名 as 新模块名 - 导入模块的时候给模块取别名,以后使用模块的时候使用新名字
from 模块名 import 变量1 as 新变量1, 变量2 as 新变量2, 变量3,... - 给指定变量取别名
"""
from test1 import a as t_a, b
a = 50
sum1 = 0
for x in range(a+1):
sum1 += x
print(sum1)
print(f'test1中的a的值:{t_a}, 当前模块中的a:{a}')
3.导入模块的原理
"""
当使用import或者from-import 导入模块的时候,系统会自动将被导入的模块中所有的代码都执行一遍
"""
"""
在被导入的模块中添加if语句,将不希望被其他模块执行的代码放到if语句中。
if 语句:
if __name__ == '__main__':
不希望被其他模块执行的代码
原理:
每个模块都有一个属性:__name__,这个属性是用来保存当前模块的名字;__name__默认值就是模块名(模块对应的py文件的文件名)。当我们直接执行某个模块的时候,这个模块的 __name__属性就会自动变成 '__main__'
"""
import test4
def main():
print('程序开始的代码')
if __name__ == '__main__':
main()
四、包
1.什么是包
"""
包就是一种特殊的文件夹(a.里面的文件都是py文件 b.自带一个 __init__.py 的文件)
"""
from shape import c_area, r_area, func
print(c_area(10))
print(r_area(20, 4))
func()