day17

day 17 笔记

1.内容回顾

1.1 函数(内置/自定义)

  • 基本函数结构

    def func(a1,a2):
      pass
    • 参数

    • 返回值

    • 执行函数

  • 函数小高级

    • 函数做变量

    • 函数做参数

  • 函数中高级

    • 函数做返回值

    • 函数的嵌套

  • 装饰器 & 闭包

  • 递归

  • 匿名函数

  • 内置函数

1.2 模块(内置/第三方/自定义)

  • 定义模块

    • 内置:time/json/datetime/os/sys ... 【re模块】

    • 第三方:

      • 安装:

        • pip包管理工具: pip install xlrd

        • 源码安装:

          • 下载源码包:压缩文件。

          • 解压文件

          • 打开cmd窗口,并进入此目录:cd C:\Python36\Lib\site-packages

          • 执行:python36 setup.py build

          • 执行:python36 setup.py install

      • 安装路径:C:\Python36\Lib\site-packages

      • 你了解的第三方模块:

        • xlrd

        • requests

    • 自定义

      • py文件

      • 文件夹 __init__.py

  • 调用模块

    • import

      • import 模块1 模块1.函数()

      • import 模块1.模块2.模块3 模块1.模块2.模块3.函数()

    • from xx import xxx

      • from 模块.模块 import 函数 函数()

      • from 模块.模块 import 函数 as f f()

      • from 模块.模块 import * 函数1() 函数2()

      • from 模块 import 模块 模块.函数()

      • from 模块 import 模块 as m m.函数()

    • 特殊情况:

      • import 文件夹 加载__init__.py

      • from 文件 import *

1.3 其他

  • 两个值数据交换

  • 推导式

    • 列表(*)

    • 字典

    • 集合

总结

  • 基础知识

  • 逻辑能力

  • 面试题

  • 下阶段目标:锻炼编码能力。

2.今日内容

2.1 迭代器

··· 迭代器是对某种可迭代对象的每一个元素进行逐一获取,具有__next__()方法,且每次调用都会获取可迭代对象的一个元素(从前往后依次获取)

··· 列表转成迭代器

v1=iter([1,2,3,4])
v1=[1,2,3,4].__iter__()    # 两者等值

··· 迭代器获取值,反复调用__next__()方法

v1=[1,2,3,4]
# 列表转换成迭代器
v2=iter(v1)
result1 = v2.__next__()
print(result1)
result2 = v2.__next__()
print(result2)
result3 = v2.__next__()
print(result3)
result4 = v2.__next__()
print(result4)
result5 = v2.__next__()
print(result5)


v1='alex'
v2=iter(v1)
while True:
   try:
       result = v2.__next__()
       print(result)
   except exception as e:
       break
  • 直到报错:StopIteration错误,表示已经迭代完毕。

  • 如何判别一个对象是否是迭代器:内部是否有__next__方法

···for循环的底层原理就是迭代器

v1 = [11,22,33,44]

# 1.内部会将v1转换成迭代器
# 2.内部反复执行 迭代器.__next__()
# 3.取完不报错
for item in v1:
   print(item)

2.2 可迭代对象

··· 内部有__iter__()方法且返回一个迭代器

v1 = [11,22,33,44]
result = v1.__iter__()

··· 可以被for循环

2.3 生成器(函数的变异)

# 函数
def func():
   return 123
func()
# 生成器函数(内部是否包含yield)
def func():
   print('F1')
   yield 1
   print('F2')
   yield 2
   print('F3')
   yield 100
   print('F4')
# 函数内部代码不会执行,返回一个 生成器对象 。
v1 = func()
# 生成器是可以被for循环,一旦开始循环那么函数内部代码就会开始执行。
for item in v1:
   print(item) # F1 1 F2 2 F3 100 F4
def func():
   count = 1
   while True:
       yield count
       count += 1
       
val = func()

for item in val:
   print(item)

总结:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部的代码才会执行,每次循环都会获取yield返回的值。

def func():
    count = 1
    while True:
        yield count
        count += 1
        if count == 100:
            return

val = func()
for item in val:
    print(item)

示例:读文件

def func():
    """
    分批去读取文件中的内容,将文件的内容返回给调用者。
    :return:
    """
    cursor = 0
    while True:
        f = open('db', 'r', encoding='utf-8')# 通过网络连接上redis
        # 代指   redis[0:10]
        f.seek(cursor)
        data_list =[]
        for i in range(10):
            line = f.readline()
            if not line:
                return
            data_list.append(line)
        cursor = f.tell()
        f.close()  # 关闭与redis的连接


        for row in data_list:
            yield row


for item in func():
    print(item)

2.4 总结

  • 迭代器,对可迭代对象中的元素进行逐一获取,迭代器对象的内部都有一个 next方法,用于以一个个获取数据。

  • 可迭代对象,可以被for循环且此类对象中都有 iter方法且要返回一个迭代器(生成器)。

  • 生成器,函数内部有yield则就是生成器函数,调用函数则返回一个生成器,循环生成器时,则函数内部代码才会执行。

    特殊的迭代器(**):

    def func():
       yield 1
       yield 2
       yield 3

    v = func()
    result = v.__next__()
    print(result)
    result = v.__next__()
    print(result)
    result = v.__next__()
    print(result)
    result = v.__next__()
    print(result)

    特殊的可迭代对象:

    def func():
       yield 1

    v = func()
    result = v.__iter__()
    print(result)
  •  

posted @ 2020-05-17 09:19  投降输一半!  阅读(107)  评论(0编辑  收藏  举报