day12-迭代器生成器和模块

本文详细介绍了Python中的变量作用域、迭代器、生成器及其使用方法,强调了全局变量与局部变量的区别,以及如何通过`global`关键字操作全局变量。在迭代器部分,阐述了迭代器的特性以及如何从序列转换为迭代器。生成器部分重点讨论了生成器的创建、控制数据生成以及其工作原理。此外,还讲解了Python模块的概念、导入和使用方式,以及包的结构和使用方法。
摘要由CSDN通过智能技术生成

day12-迭代器生成器和模块

一、变量作用域

1、全局变量

  • 没有定义在函数或者类中的变量都是全局变量,全局变量的作用域是从定义开始到程序结束。
  • 全局变量默认保存在全局栈区间,全部结束它才结束
# a是全局变量
a =10

# b是全局变量
for _ in range(5):
    b=20
    print(f'循环中使用b:{b}')

print(f'外部使用a:{a}')
print(f'外部使用b:{b}')

# x是全局变量
for x in range(5):
    print(f'循环中使用a:{a}')

def func1():
    print(f'函数中使用a:{a}')
    print(f'函数中使用b:{b}')
    print(f'函数中使用x:{x}')
func1()

2、局部变量

  • 定义在函数中的变量是局部变量,局部变量的作用域是从定义开始到函数结束
  • 局部变量默认保存在函数对应的临时栈区间中;函数对应的临时栈区间是开始调用函数的时候创建,函数调用结束后会自动销毁
# c、d是局部变量
def func2(d):
    c=20
    print(f'函数内部使用c:{c}')
    print(f'函数内部使用d:{d}')
func2(29)

3、global关键字的作用

  • global只能在函数体中使用,用来改变函数中变量的存储方式(让局部变量保存到全局栈区间去)
  • 在函数中定义全局变量,需要先用global进行申明
  • 如果要函数中修改全局变量的值,需要先用global进行申明,否则不会修改全局变量的值而是创建一个对应的局部变量
m = 100

def func3():
    global e
    e=30
    m=200
    print(f'函数内部m:{m}')   # 函数内部m:200

func3()
print(e)     # 30
print(f'函数外部m:{m}')    # 函数外部m:100

二、迭代器

1、迭代器(iter)

  • 容器型数据类型;打印迭代器无法看到所有的元素,也不能统计元素的个数,如果需要使用迭代器中的元素必须将元素从迭代器中取出来,而且取一个少一个。如果想要使用后面的数据,必须先把前面的数据取完

2、创建迭代器的方法

  • 将其他序列转成迭代器(所有的序列都可以转换成迭代器)
  • 创建生成器
i = iter([10, 20, 30])

# 打印迭代器无法看到所有的元素
print(i)       # <list_iterator object at 0x000002A3D5C86FD0>

3、怎么获取迭代器中的元素

  • 不管一任何方式得到迭代器的元素,对应的元素会从迭代器中消失
  • 获取一个元素:next(元素)
i = 'abc'

print(next(i))    # a
print(next(i))    # b
print(next(i))    # c
# print(next(i))  # 报错
  • 遍历
for x in i:
    print(f'x:{x}')

三、生成器

1、什么是生成器

  • 生成器是容器型数据类型;生成器是具有产生多个数据的容器,而不是保存多个数据的容器
  • 打印生成器无法查看所有的元素,也无法统计生成器中元素的个数
  • 每次需要获取生成器的元素的时候,生成器就会创建一个数据,创建一个就少一个

2、怎么创建生成器

  • 调用带有yield关键字的函数就可以得到一个生成器(如果调用的函数中有yield关键字,那么调函数的时候既不会执行函数体也不会获取函数返回值,而是得到一个生成器对象)
def func1():
    yield
    print('====')
    print('++++')
    print('----')

result = func1()
print(f'result:{result}')      # result:<generator object func1 at 0x00000249AD17FF20>

3、怎么控制生成器产生的数据的数量的值

  • 生成器能产生多少个数据,能产生那些数据,由执行创建生成器的函数的函数体的时候会遇到几次yield,每次遇到yield的时候后面的值决定
def func2():
    yield 100
    yield 200
    yield 300
gen2 = func2()
print(list(gen2))    # [100, 200, 300]


def func3():
    for x in range(5):
        yield x + 1

gen3 = func3()
print(list(gen3))   # [1, 2, 3, 4, 5]

4、怎么获取生成器中的数据

  • 生成器获取元素和迭代器获取元素的方式一样
  • 打印生成器无法查看元素;也无法获取生成器中元素的个数
  • 获取一个元素
print(next(gen4))    # 1
print(next(gen4))    # 2
  • 遍历生成器
for x in gen4:
    print(f'x:{x}')

5、生成器产生数据的原理

def func4():
    print('=====')
    yield 100
    print('+++++')
    yield 200
    print('-----')
    yield 300

gen5 = func4()
print(next(gen5))
print(next(gen5))

四、模块

1、什么是模块

  • python中一个py文件就是一个模块

2、怎么在一个模块中使用另一个模块

  • 前提:被使用的模块的模块名(文件名)必须是标识符,并且不能是关键字
  • 使用方法:被使用的模块必须先导入再使用

3、导入模块

  • import 模块名 - 导入指定模块,导入后可以通过’模块名.xxx‘的方式去使用这个模块中所有的全局变量(包括全局函数)

  • from 模块名 import 变量1,变量2,变量3…

  • from 模块名 import * - 导入指定模块中所有的内容,导入后可以直接用所有的内容

  • import 模块名 as 新模块名 - 对模块重命名

    from 模块名 impo 变量1 as 新变量1,变量2 as 新变量2… - 对变量重命名

# ------导入方式1------
import demo
print(demo.a)
print(demo.name)
demo.list1.append(1000)
print(demo.list1)

# ------导入方式2------
from demo import a,func1
print(a)
func1

# ------导入方式3------
from demo import *
print(a)
print(name)
print(list1)
func1()

# ------导入方式4------
import demo as de
print(de.a)
print(de.name)
de.list1.append(1000)
de.func1()

# ------导入方式5------
from demo import  a as a1,name
a = 3
print(a)
print(a1)
print(name)

五、包

1、什么是包 - 包含 _ init _.py文件的文件夹就是包(包的本质就是文件夹)

2、怎么使用包中模块中的内容

  • 前提:包的名字和模块名必须是标识符并且不是关键字
  • 使用方法:先导入再使用

3、导入包

  • import 包名 - 直接导入包,导入后可以通过’包名.xxx‘的方式使用_init__.py文件中所有的文件
  • import 包名.模块名 - 直接导入包中指定的模块,导入后可以通过’包名.模块名.xxx‘的方式使用模块中的内容
  • from 包名 import 模块名1,模块名2,… - 导入包中指定的模块
  • from 包名.模块名 import 变量1,变量2,变量2… - 导入指定包中指定模块的指定变量
# ------导入方式1------
import tools
print(tools.xx)

# ------导入方式2------
import tools.text1
print(tools.text1.x1)

# ------导入方式2优化------
import tools.text1 as tx1
print(tx1.x1)

# ------导入方式3------
from tools import text1
from tools.file1 import text2
print(text1.x1)
print(text2.x2)

# ------导入方式4------
from tools.text1 import x1
from tools.file1.text2 import x2
print(x1, x2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值