函数使用(四)

迭代器(Iterator)

  • 定义:就是可以使用for-in进行遍历,并且可以使用next依次获取元素的对象
  • 说明:
    • 生成器就是一种特殊的迭代器
    • 判断是否是迭代器
      1
      2
      3
      4
      from collections import Iterator

      l = (i for i in range(10))
      print(isinstance(l, Iterator))
    • 字符串,列表,元组,集合,字典等都不是迭代器,但是他们都是可迭代对象。

可迭代对象

  • 定义:可以使用for-in遍历的对象,我们都称之为可迭代对象。
  • 判断一个对象是否是可迭代对象。
    1
    2
    3
    4
    from collections import Iterable

    print(isinstance(l, Iterable))
    print(isinstance(lt, Iterable))

iter函数

  • 作用:将可迭代对象转换为迭代器
  • 使用:
    1
    2
    lt2 = iter(lt)
    print(isinstance(lt2, Iterable))

高级函数

  • map

    • 格式:map(func, lt)

    • 说明:接受两个参数,一个函数和可迭代对象,返回一个生成器,将func依次作用于lt

    • 示例:

      1
      2
      3
      4
      5
      6
      7
      8
      l = [1, 2, 3, 4, 5]

      # m = map(lambda x: 2 * x, l)
      m = map(lambda x: x * x, l)
      # for i in m:
      # print(i)

      print(list(m))
    • 练习:

      1
      处理一个元素为字符串的列表,要求将字符串两遍的空白去掉,然后首字母大写
  • reduce

    • 格式:reduce(func, lt)

    • 说明:接受两个参数,一个函数和一个可迭代对象,首先取两个元素,使用func处理,结果和第三个元素继续使用func处理,直到结束,返回处理的结果。

    • 示例:

      1
      2
      3
      4
      5
      6
      7
      8
      from functools import reduce

      l = [1, 2, 3, 4, 5]

      # 求和
      print(reduce(lambda x, y: x + y, l))
      # 转为为12345
      print(reduce(lambda x, y: x * 10 + y, l))
    • 练习:

      1
      求列表中所有元素的乘积
  • filter

    • 格式:filter(func, lt)

    • 说明:使用func依次作用于每个元素,处理结果为True的保留下来

    • 示例:

      1
      2
      3
      4
      5
      l = [1, 2, 3, 4, 5]

      # 提取偶数
      f = filter(lambda x: x % 2 == 0, l)
      print(list(f))
    • 练习:

      1
      提取奇数,并且能被三整除的元素
  • sorted

    • 说明:排序,与我们自己写的相同,除了生成新的对象

    • 示例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # l = [2, 5, 9, 1, 6, 3]
      l = [
      {'name': 'xiaowang', 'age': 18, 'height': 150},
      {'name': 'xiaogang', 'age': 20, 'height': 140},
      {'name': 'xiaohong', 'age': 19, 'height': 145}
      ]

      l2 = sorted(l, key=lambda x: x['age'], reverse=True)

      print(l)
      print(l2)

模块使用

  • 定义:

    • 模块就像一个工具包一样,里面有很多的工具(函数,类),使用时需要通过import导入。
  • 分类:

    • 标准库:random、sys、os、time
    • 第三方:就是好人已经写好的特定功能的模块,你可以直接使用pip命令安装
    • 自定义:自己写的
  • 导入:

    1
    2
    3
    4
    import random 					# 导入
    import random as rdm # 导入并起别名
    from time import sleep # 指定导入
    from time import sleep as sp #指定导入并起别名
    起别名后只能使用别名
  • 模糊导入:

    1
    from random import *

    导入random模块中__all__列表指定的内容

  • 自定义模块

    • 新建一个文件,不与其他模块同名即可
    • 新建的文件名(去掉后缀)就是模块
    • 导入方式与官方的相同
    • 文件名(模块名)就是命名空间,不同命名空间下的标识符可以同名
    • 当使用几个模块中的相同的(函数)标识符时,可以通过命名空间或起别名解决
      1
      2
      3
      4
      5
      6
      7
      8
      import random
      import zidingyi

      # random.randint
      # zidingyi.randint

      from random import randint as r_rint
      from zidingyi import randint as z_rint
  • 测试模块

    • 当一个模块作为主模块运行时,__name__的值为__main__,当被其他模块导入使用时,值为模块名

    • 经常这样写模块的测试代码

      1
      2
      if __name__ == '__main__':
      print('测试代码')
    • 定义:多个模块放在同一目录下,目录下有一个__init__.py文件,这个目录就是一个包
    • 说明:一个目录要想成为一个包,必需包含一个__init__.py文件,即使该文件为空(可以简化导入书写)
  • 安装第三方模块

    • 工具:pip

    • 镜像:

      1
      2
      3
      4
      5
      6
      清华:https://pypi.tuna.tsinghua.edu.cn/simple
      阿里云:http://mirrors.aliyun.com/pypi/simple/
      中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
      华中理工大学:http://pypi.hustunique.com/
      山东理工大学:http://pypi.sdutlinux.org/
      豆瓣:http://pypi.douban.com/simple/
    • 修改pip源

      • 在用户的家目录下创建pip目录
      • 在pip目录下创建pip.ini文件
      • 在pip.ini文件中添加如下内容
        1
        2
        3
        [global]
        index-url = http://mirrors.aliyun.com/pypi/simple/
        trusted-host = mirrors.aliyun.com
    • pip命令

      • 作用:安装软件包,自动安装相关的依赖
      • 安装软件包:pip install 包名
      • 卸载软件包:pip uninstall 包名
      • 列表显示包:pip list
      • 查看指定包:pip show 包名
      • 注意:若安装失败,可能是配置文件出错,也可能是目录没有权限操作