从入门到自闭之Python三大器--迭代器

函数名的第一类对象(概述):

使用方式:

  • 函数名可以当做值赋值给变量

    def func():
    	print(1)
    print (func)	#查看函数的内存地址
    a = func
    print (a)		#
    
  • 函数名可以当做容器中的元素

    dic = {"1":login,"2":register,"3":index}
    msg = """
    1 登录
    2 注册
    3 主页
    """
    choose = input(msg)   # 1
    if choose.isdecimal():
         if dic.get(choose):
             dic[choose]()
         else:
             print("请正确输入!")
    
    
  • 函数名可以当做函数的参数

    def fuc(a):
    	a()
    	print(111)
    def foo():
    	print(222)
    	def f1()
    		print(333)
    	fun(f1)
    foo()
    

  • 函数名可以当函数的返回值

    def func():
    	def foo():
    		print(111)
    	return foo
    a = func()
    a()
    func()()		#foo()
    输出结果:111
    		111
    

进阶题:

 def foo(a):
     def func(a):
         def f1(a):
             print(a)
             return "aelx"
         return f1(a)
     return func(a)
 print(foo(5))
输出结果: 5 ,alex
 def func(a):
     a()

 def foo(b):
     return b()
 def f1(c):
     def a():
         def f3():
             print(3333)
             return [f3,a,f1]
         print(11)
         return f3()
     return c(a())
 def aa(b):
     print(111)
     return b
 print(f1(aa))
 输出结果:
11
3333
111
[<function f1.<locals>.a.<locals>.f3 at 0x00000187D0649C80>, <function f1.<locals>.a at 0x00000187D0649BF8>, <function f1 at 0x00000187D0649AE8>]

def f1(c):
    def a():
        def f3():
            print(3333)
            return [f3,a,f1]
        print(11)
        return f3()
    ret = a()
    return c(ret)
def aa(b):
    print(111)
    return b
print(f1(aa))

f-strings

​ f"{变量名}"

​ F"{变量名}"

​ f"""{变量名}"""

print(F"姓名:{input('name:')} 年龄:{input('age:')}")
def foo():
    print("is foo")

 lst = [1,2,3,4]
 dic = {"key1":23,"key2":56}
 print(f"""{dic['key1']}""")

 print(f"{3+5}")
 print(f"{3 if 3>2 else 2}")

 print(f"""{':'}""")

 msg = f"""{{{{'alex'}}}}"""	#必须是偶数
 print(msg)

 name = "alex"
 print(f"{name.upper()}")

 print(f"{':'}")

迭代器:是基于上一次停留的位置,进行取值

  1. 可迭代对象:

    1. list,tuple,str,set,dict取值方式只能直接看、

    2. 只要具有__ iter __()方法就是一个可迭代对象

       lst = [1,23,4,5]
       for i in lst:
           print(i)
      
      
       lst = [1,2,3,4]
       lst.__iter__()
       dict.__iter__()
      
      
  2. 迭代器:工具

    • 具有__ iter __ () 和 __ next __ () 两个方法才是迭代器

    • lst = [1,2,3,4,5]
      l = lst.__iter__()  # 将可迭代对象转换成迭代器
        
      l.__iter__()  # 迭代器指定__iter__()还是原来的迭代器
      print(l.__next__())   # 1
      print(l.__next__())   # 2
      
      
  3. for循环的本质(重点):

     while True:
         try:		#异常处理机制
             print(l.__next__())
         except StopIteration:	#接收到异常提醒就终止
             break
    
    
     lst = []
     for i in range(10000):
         lst.append(i)
    
     l = lst.__iter__()
    
     for i in range(16):
         print(l.__next__())
    
     print(''.center(50,"*"))
    
     for i in range(16):
         print(l.__next__())
    
     print(''.center(50,"*"))
     for i in range(16):
         print(l.__next__())
    
    
  4. 优点:

    • 惰性机制:节省空间
  5. 缺点:

    1. 不能直接查看值 -- 迭代器查看到的是一个迭代器的内存地址
    2. 一次性,用完就没了
    3. 不能逆行,后退,只能继续执行下一条
  6. 空间换时间:容器存储大量的数据,取值快,占用空间大

  7. 时间换空间:迭代器就是一个节省了空间,但是取值慢

  8. 可迭代对象:具有 iter() 方法的就是一个可迭代对象

  9. 迭代器:具有 iter()和next()方法就是一个迭代器

  10. python2和python3中的区别:

    1. python 3
      • iter ()和 __ iter __() 都有
      • next () 和 __ next __ () 都有
    2. Python 2
      • iter ()和 __ iter __()
      • next ()
posted @ 2019-09-16 16:11  丶Howie  阅读(125)  评论(0编辑  收藏  举报