【AI_Python基础_07作用域、推导式、迭代器、生成器】


前言

提示:本章内容主要是介绍作用域、推导式、迭代器、生成器:

一、作用域

作用域 :指的是在程序中某个特定部分代码中变量的可访问性和可见性。

1.全局作用域

在全局作用域中声明的变量可以在模块中的任何地方被访问,包括模块中的函数、类、以及其他代码块。这意味着在模块中的任何位置都可以访问和修改全局作用域中的变量。

#全局作用域
a = 1
def func():
	print(f"{a}:我在func()")
	
func()
print(f"{a}:我在全局")
1:我在func()
1:我在全局

2.局部作用域

局部作用域:是指在函数内部声明的变量所拥有的作用域范围。在函数内部声明的变量只能在该函数内部访问和使用,外部代码无法直接访问函数内部的局部变量。

#局部作用域
def func():
	b = '我是b'
	print(f"{b},我在func()")
	
func()
print(b)	#	报错
Traceback (most recent call last):
 print(b)
NameError: name 'b' is not defined
我是b,我在func()

3.嵌套作用域

嵌套作用域:在嵌套函数中,内部函数可以访问外部函数的变量,但外部函数不能访问内部函数的变量。内部函数可以访问外部函数的局部变量和全局变量,但不能修改全局变量。

#嵌套作用域
def fun1():
    b = 2
    print("这是fun1打印的:", b)
    def fun2():
        print("这是fun2打印的:", b)
    return fun2

temp = fun1()#调用fun1
temp()#调用fun2

二、推导式

1.列表推导式

1.1语法

列表推导式格式为:

[表达式 for 变量 in 列表]

[表达式 for 变量 in 列表 if 条件]

[out_exp_res for out_exp in input_list if condition]

  • out_exp_res:列表生成元素表达式,可以是有返回值的函数。
  • for out_exp in input_list:迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。
  • if condition:条件语句,可以过滤列表中不符合条件的值。
    我创建一个列表,把0-9装到列表里,用普通方式:
lst = []
for i in range(10):
    lst.append(i)
print(lst)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

用推导式:可见推导式能优化代码。

lst = [i for i in range(10)]
print(lst)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2.字典推导式

字典推导基本格式:

{ key_expr: value_expr for value in collection }

{ key_expr: value_expr for value in collection if condition }
代码如下(示例):

d = {'a': 1, 'b': 2, 'c': 3}
print({d[k]: k for k in d})
{1: 'a', 2: 'b', 3: 'c'}

3.集合推导式

语法和列表推导式语法一致,只不过把[]改为{}。并且结果储存到集合里。

lst = {i for i in range(10)}
print(lst)

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

三、迭代器

在python中,迭代器用于遍历可迭代对象的一种方式。
interable:可迭代的东西

str, list, tuple, dict, set, open()

可迭代的数据类型都会提供一个叫迭代器的东西,这个迭代器可以帮我们把数据类型中的素有数据逐一的拿到

1.获取迭代器的两种方案:

1.1 iter()内置函数

iter():内置函数可以直接拿到迭代器,用于获取可迭代对象的迭代器。
当调用 iter(iterable) 时,会返回可迭代对象 iterable 对应的迭代器对象。

it = iter('你好啊,我叫赛利亚!')
print(it)
<str_iterator object at 0x0000012A3FE400D0>

1.2__iter__()

__iter__():是一种特殊方法(魔术方法)用于在类中定义迭代器。当在类中定义了 __iter__()方法时,该类的实例对象就成为可迭代对象,可以通过 iter() 函数获取其迭代器。

2.从迭代器中取数据的两种方案

2.1next()内置函数

next() 函数是 Python 内置的函数,用于获取迭代器的下一个元素。你可以使用next(iterator) 来调用它,其中iterator是一个迭代器对象。如果迭代器已经到达末尾,再调用next()就会触发StopIteration异常。

s = '我是数据'
it = iter(s)

while 1:
    data = it.__next__()
    print(data)  
File "F:\py基础\函数\12_迭代器.py", line 43, in <module>
    data = it.__next__()
StopIteration
我
是
数
据

这里可以使用try-except来停止报错:

s = '我是数据'
it = iter(s)

while 1:
    try:
        data = it.__next__()
        print(data)
    except:
        break
我
是
数
据

2.2__next__()

__next__() 是迭代器对象的一个特殊方法,在类的定义中使用。当你调用 iterator.__next__() 时,它执行与 next(iterator) 相同的操作,即获取迭代器的下一个元素。这种方法允许你在自定义的迭代器类中重写迭代行为。

四、生成器

生成器(generator):生成器的本质就是迭代器。
创建生成器有两种方案

1.生成器表达式

语法:(数据 for循环 if判断)
这并不是元组推导式,结果是创建了一个生成器。生成器的表达式和推导式的表达式类似,用括号括起来。

# 10以内的偶数
s1 = (i for i in range(10) if i%2==0)
s = list(s1)
print(s1)
print(s)
<generator object <genexpr> at 0x0000027339EBD190>
[0, 2, 4, 6, 8]

2.生成器函数

  • 关键字yield
  • 只要函数中有关键字,这个函数就是生成器函数。
  • 生成器函数执行的时候,得到的是生成器,并不会执行函数。
def func():
    print(123456)
    yield 999   # yield本身也有返回的意思。

ret = func()
print(ret)
<generator object func at 0x000002243E6ED190>

3.作用

3.1 yield可以返回数据

def func():
    print(123456)
    yield 999   # yield本身也有返回的意思。

ret = func()
print(ret)   # <generator object func at 0x000002511C23D190>
print(ret.__next__())
<generator object func at 0x0000022BD37DD190>
123456
999

3.2可以分段执行

我要找一个服装厂,要做100件衣服,但是我每次只取10件衣服。每次取只需要执行next()就行。

def order():
    lst = []
    for i in range(100):
        lst.append(f'衣服{i+1}')
        if len(lst) == 10:
            yield lst
            lst = []
gen = order()
print(next(gen))
['衣服1', '衣服2', '衣服3', '衣服4', '衣服5', '衣服6', '衣服7', '衣服8', '衣服9', '衣服10']
  • 40
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值