day13 迭代器、生成器、模块

from copy import copy

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)

1)遍历

iter5 = iter('hello!')
for x in iter5:
print(f'x: {x}')

print(list(iter5)) # []

2)获取单个元素

"""
next(迭代器对象) - 获取迭代器中的一个元素(当前最前面的那个元素)
迭代器对象.next() - 获取迭代器中的一个元素(当前最前面的那个元素)
"""
iter3 = iter({'name': '张三', 'age': 18, 'gender': '男'})

print(next(iter3)) # name
print(next(iter3)) # age
print(next(iter3)) # gender

print(next(iter3)) # 报错: StopIteration

print('===============================')

iter4 = iter([1, 2, 3, 4, 5, 6, 7])
next(iter4)
next(iter4)
print('++++++++++')
for x in iter4:
print(f'x: {x}')

len 无法获取迭代器的长度

iter5 = iter('hello world!')

print(len(iter5))

1.什么是生成器

"""
a.概念1
生成器就是迭代器

b.概念2
调用一个带有 yield 关键字的函数就可以得到一个生成器
"""

def func1():
print('++++')
print('----')
yield

result = func1()
print('result:', result)

2. 生成器产生数据(生成器中的元素怎么产生)

"""
生成器能生产多少数据就看执行生成器对应的函数的函数体会遇到几次 yield ; yield 后面表达式的值就是生成器能够产生的数据
"""

示例一:创建一个生成器可以产生3个数据分别是:10, 100, 78

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次========')

print(f'元素: {next(gen2)}') # 报错:StopIteration

可以不断产生数据

def create_gender3():
num = 0
while True:
num += 1
yield num

gen3 = create_gender3()
print(next(gen3))

练习:写一个产生4位验证码的生成器(验证码有随机的4位数字和字母组成)

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())) # 0
print(next(create_gender5())) # 0

gen5 = create_gender5()
print(next(gen5)) # 0
print(next(gen5)) # 1

1. 生成式

"""
生成式就是生成器的简写

列表推导式的[]变成()就变成了生成式
"""
list1 = [x*2 for x in range(5)]
print(list1) # [0, 2, 4, 6, 8]

gen1 = (x*2 for x in range(5))
print(gen1) # <generator object <genexpr> at 0x103dba050>
print(next(gen1)) # 0
print(next(gen1)) # 2

gen1 = (x*2 for x in range(5)) 相当于:

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,... - 给指定变量取别名
"""

示例一:import直接导入模块

import test1

print(test1.a)

print(test1.b)

test1.func1()

示例二:form-import导入模块中的变量

from test1 import a, func1

print(a)

func1()

# 没有导入的变量不能使用

# print(test1.b) # NameError: name 'test1' is not defined

# print(b) # NameError: name 'b' is not defined

示例三:form-import * 导入模块中的变量

from test1 import *

print(a)

print(b)

func1()

示例四: 给模块取别名

import test1 as m_test1

import teacherStudentSystemManager as ts_manager

test1 = 10

print(test1) # 10

print(m_test1.a)

m_test1.func1()

示例五: 给模块中的变量取别名

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的值:{# 1.导入模块的原理
"""
当使用import或者from-import 导入模块的时候,系统会自动将被导入的模块中所有的代码都执行一遍
"""

import test2

from test2 import a

2. 重复导入同一个模块,模块中的内容只会执行一次

import test2

import test2

面试题1:说说 improt 和 include 的区别?

面试题2:python中循环导入的问题

from test3 import jiecheng

print(jiecheng(9))

3. 怎么选择性的执行被导入的内容

"""
在被导入的模块中添加if语句,将不希望被其他模块执行的代码放到if语句中。

if 语句:
if name == 'main':
不希望被其他模块执行的代码

原理:
每个模块都有一个属性:name,这个属性是用来保存当前模块的名字;name默认值就是模块名(模块对应的py文件的文件名)。当我们直接执行某个模块的时候,这个模块的 name属性就会自动变成 'main'
"""
import test4

def main():
print('程序开始的代码')

if name == 'main':
main()

t_a}, 当前模块中的a:{a}')

1.什么是包

"""
包就是一种特殊的文件夹(a.里面的文件都是py文件 b.自带一个 init.py 的文件)
"""

1.直接导入

示例一:通过包直接导入模块

from shape import circle

r = 10

print(circle.area(r))

示例二:通过包导入模块中的数据

from shape.circle import area

print(area(10))

2.导入的定制

import shape

from shape import c_area, r_area, func
print(c_area(10))
print(r_area(20, 4))

func()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,049评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,478评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,109评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,097评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,115评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,280评论 1 279
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,748评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,398评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,553评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,440评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,487评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,176评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,750评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,821评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,049评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,559评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,150评论 2 341