闭包,迭代器,生成器,列表推导式

1:函数名的应用

      1, 函数名就是函数的内存地址。
    2, 函数名可以作为变量。
    3, 函数名可以作为函数的参数。
    4, 函数名可以作为容器类类型的元素。
    5,函数名可以当做函数的返回值。

2:globals() locals()

  globals() # 返回全局变量的一个字典。

  locals()  返回 当前位置 的局部变量的字典。

  

 1 name = ‘leiwenxuan‘
 2 def fun():
 3     a = 2
 4     b = 3
 5
 6     print(globals()) #返回的是全局变量的字典修改其中的值,name 会发生变化
 7     globals()[‘name‘] = ‘wuyan‘
 8     print(name)  #此时name = wuyan
 9     locals()[‘a‘] = 5
10     print(locals()) #输出还是此时{‘b‘: 3, ‘a‘: 2}
11 fun()

3:闭包

  定义:内层函数对外层函数变量的引用(非全局)并且外层函数返回内层函数的函数名,形成闭包

    

def func():
    name1 = ‘leiwenxuan‘
    def inner():
        print(name1)
    return inner
f = func() #形成闭包
f()  

   闭包的作用:当程序执行时,遇到了函数执行,他会在内存中开辟一个空间,局部名称空间, 如果这个函数内部形成了闭包,  那么他就不会随着函数的结束而消失。

4:可迭代对象

  对象内部对象内部含有__iter__方法就是可迭代对象.可迭代对象满足可迭代协议。

  可迭代对象:str list dict,tuple,set,range()

    1 #print(‘__iter__‘ in dir(s1)) 2 #print(‘__iter__‘ in dir(dic))

    

1 from collections import Iterable
2 from collections import Iterator
3
4 print(isinstance(‘leiwenxuan‘, Iterator)) #False
5
6 print(isinstance(‘leiwenxuan‘, Iterable)) #True

5: 对象内部含有__iter__方法且含有__next__方法就是迭代器.

  1;可迭代对象vs迭代器:  

       可迭代对象不能取值,迭代器是可以取值的。
       可迭代对象 --->(转化成)迭代器

  2:可迭代对象转化迭代器: 

    iter1 = iter(lis)

    iter2 = lis__iter()__

  3:可迭代对象取值,

    next() 一次取一次

    iter.__next__()

  4:可迭代对象的好处

    1, 可迭代对象不能取值,迭代器是可以取值的。
    2, 迭代器非常节省内存。
    3,迭代器每次只会取一个值。

    4,迭代器单向的,一条路走到头

  5:自己实现for循环

    1,将可迭代对象转化成迭代器。
     2,调用__next__方法取值。
     3,利用异常处理停止报错。
     iter1 = s1.__iter__()

    

1 while 1:
2      try:
3          print(iter1.__next__())
4      except StopIteration:
5         break

6:生成器:就是自己用python写的迭代器,生产器的本质就是迭代器

用以下两种方式构建生成器

  • 通过生成器
  • 生成器表达式
  • 函数

    def fun():

    x += 1

    return x

    fun() #函数的执行命名,并接受函数返回值

    def fun1():

    x += 1

    yield x

    g = fun1()  #生成器函数对象

    g.__next__() #调用

    #一个next对应一个 yield

    #yield 将返回给生成器对象__next__()

return and yield

return 结束函数, 给函数执行者返回值

yield 不会结束函数, 一个next对象一个yield给生成器对象__.next__()返回值

区别:

1:内存级别的区别

2:迭代器是需要可迭代对象转化, 可迭代对象是非常占内存的

3:生成器直接创建, 不需要转化, 从本质就节省内存。

send 与 yield

def fun():

print(1)

yield 1

print(2)

yield 2

g = fun()

g.send(‘alex‘)

#send 与 next 一样, 也是对生成器取值(执行一个yield)的方法

#send 可以给上一个yield传值

#第一次永远都是next

#最后一个yield永远也得不到send传的值

列表推到式:一行代码搞定你需要的任何列表

#循环模式 [变量 (加工后的变量) for ]

lis = [i for i in range(1,101)]

#筛选模式[变量 (加工后的变量) for i in name if 条件]

列表推导式:

优点:一行解决 , 方便

缺点:容易着迷, 不易排错, 不超过太刻意用

#列表推到式不能解决所有列表的问题,不要刻意去用

生成器表达式:将列表推到式的[] 换成()即可。

G = (i for i in range(1,10000000000000))

每次只取一个值

  

    

原文地址:https://www.cnblogs.com/leiwenxuan/p/9507892.html

时间: 2024-08-29 03:08:05

闭包,迭代器,生成器,列表推导式的相关文章

python 【迭代器 生成器 列表推导式】

python [迭代器  生成器  列表推导式] 一.迭代器 1.迭代器如何从列表.字典中取值的 index索引 ,key for循环凡是可以使用for循环取值的都是可迭代的可迭代协议 :内部含有__iter__方法的都是可迭代的迭代器协议 :内部含有__iter__方法和__next__方法的都是迭代器 print(dir([1,2,3])) lst_iter = [1,2,3].__iter__() print(lst_iter.__next__()) print(lst_iter.__ne

Python---迭代器,生成器,列表推导式

# 02,迭代器# 可迭代对象:内部含有__iter__# 迭代器:可迭代对象.__iter__()# 迭代器:内部含有__iter__且__next__# 判断 __iter__ 在不在dir(对象中)# isinstance()# 节省内存.# 惰性机制.# 单向不可逆.# for循环的机制:# while# pass# 可迭代对象# 迭代器# 两者区别# 模拟for循环机制## 03,生成器# 本质上是迭代器,用python代码构建的.# 生成器定义# 生成器的写法# yield# sen

2018,7,18_迭代器,生成器与推导式

函数的动态传参 *args 动态接收所有位置参数 **kwargs 动态接收关键字参数 顺序: 位置参数, *args, 默认参数, **kwargs def func(*args, **kwargs): 可以接收任何参数 pass global和nonlocal global: 在函数内部引入全局变量. nonlocal: 在函数内部. 内层函数访问外层函数中的局部变量 globals() 查看全局作用域中的名字 locals() 查看当前作用域中的名字 1, 函数名的应用,第一类对象 函数名

day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数

本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印的就是装饰器函数的信息了,如何做呢? from functools import wraps def logger(f): @wraps(f) def inner(*args, **kwargs): """ :param args: 函数名,密码 :param kwargs: 备

第9条:用生成器表达式来改写数据量较大的列表推导式

核心知识点: (1)当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题. (2)由生成器表达式所返回的迭代器,可以逐次产生输出值,从而避免内存用量问题. (3)把某个生成器表达式所返回的迭代器,放在另一个生成器表达式的for子表达式中,即可将二者结合起来. (4)串在一起的生成器表达式执行速度很快. 列表推导式的缺点是:在推导过程中,对于输入序列中的每个值来说,可能都要创建仅含一项元素的全新列表. 当输入的数据比较少时,不会出任何问题,但如果输入的数据非常多,那么可能会消耗大量内存,并

三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

一 三元表达式.列表推导式.生成器表达式 1.三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res) 2.列表推导式 #1.示例 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2.语法 [expression for item1 in iterabl

列表推导式----生成器表达式

列表推导式: 基本形式: [表达式  for  参数  in  可迭代对象]   或者 [表达式  for  参数  in  可迭代对象  if   条件] 实例: 1 l = [] 2 for i in range(100): 3 l.append('egg%s' %i) 4 print i 5 6 #不带if条件 7 l = ['agg%s' %i for i in range(100) ] 8 9 #带if条件 10 l = ['agg%s' %i for i in range(100)

day14,列表推导式,生成器表达式,内置函数

一.列表推导式.生成器表达式: # li = []# for i in range(1,101):# li.append(i)# print(li) #l1 = [python1期,python2期,python3期.....]# l1 = []# for i in range(1,12):# l1.append('python%s期' % i)# print(l1)#一行搞定,列表推导式:用列表推导式能够构建的任何列表,用别的都可以构建.#一行,简单,感觉高端.但是,不易排错.# li = [

(列表推导式,生成器表达式,内置函数)

一,列表生成式 示例一: 生成1~100的列表 生成1-100的列表 1 2 3 4 5 li = [] for i in range(1,101):     li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期~11期li = []for i in range(1,12): li.append('python{}期'.format(i))print(li) 执行输出: ['python1期', 'python2期', 'python3期'...]