函数使用(四)
迭代器(Iterator)
- **定义:**就是可以使用for-in进行遍历,并且可以使用next依次获取元素的对象
- 说明:
- 生成器就是一种特殊的迭代器
- 判断是否是迭代器
1
2
3
4from collections import Iterator
l = (i for i in range(10))
print(isinstance(l, Iterator)) - 字符串,列表,元组,集合,字典等都不是迭代器,但是他们都是可迭代对象。
可迭代对象
- **定义:**可以使用for-in遍历的对象,我们都称之为可迭代对象。
- 判断一个对象是否是可迭代对象。
1
2
3
4from collections import Iterable
print(isinstance(l, Iterable))
print(isinstance(lt, Iterable))
iter函数
- **作用:**将可迭代对象转换为迭代器
- 使用:
1
2lt2 = iter(lt)
print(isinstance(lt2, Iterable))
高级函数
-
map
- 格式:
map(func, lt)
- **说明:**接受两个参数,一个函数和可迭代对象,返回一个生成器(map object),将func依次作用于lt
- 示例:
1
2
3
4
5
6
71, 2, 3, 4, 5] l = [
map(lambda x: x * 2, l)
<map object at 0x0000021893848C40>
list(map(lambda x: x * 2, l))
[2, 4, 6, 8, 10]
list(map(lambda x: x * x, l))
[1, 4, 9, 16, 25] - 练习:
1
处理一个元素为字符串的列表,要求将字符串两遍的空白去掉,然后首字母大写
- 格式:
-
reduce
- 格式:
reduce(func, lt)
- **说明:**接受两个参数,一个函数和一个可迭代对象,首先取两个元素,使用func处理,结果和第三个元素继续使用func处理,直到结束,返回处理的结果。
- 示例:
1
2
3
4
5
6
7
8from functools import reduce
1, 2, 3, 4, 5] l = [
# 求和
lambda x, y: x + y, l) reduce(
15
# 转为为12345
lambda x, y: x * 10 + y, l) reduce(
12345 - 练习:
1
求列表中所有元素的乘积
- 格式:
-
filter
-
格式:
filter(func, lt)
-
**说明:**使用func依次作用于每个元素,处理结果为True的保留下来,返回生成器(filter object)
-
示例:
1
2
3
4
5
61, 2, 3, 4, 5] l = [
filter(lambda x: x % 2 == 0, l)
<filter object at 0x00000218938867F0>
# 提取偶数
list(filter(lambda x: x % 2 == 0, l))
[2, 4] -
练习:
1
提取奇数,并且能被三整除的元素
-
-
sorted
- 说明:
- 排序,返回一个新列表,包含可迭代对象中的所有元素,默认按升序排列
- 可以提供自定义键函数来自定义排序顺序
- 可以设置
reverse=True
用于降序排序
- 示例:
1
2
3
4
5
6
7
8l = [
'name': 'xiaowang', 'age': 18, 'height': 150}, {
'name': 'xiaogang', 'age': 20, 'height': 140}, {
'name': 'xiaohong', 'age': 19, 'height': 145} {
]
# 按照age字段,进行降序排序
sorted(l, key=lambda x: x['age'], reverse=True)
[{'name': 'xiaogang', 'age': 20, 'height': 140}, {'name': 'xiaohong', 'age': 19, 'height': 145}, {'name': 'xiaowang', 'age': 18, 'height': 150}]
- 说明:
模块使用
-
定义:
- 模块就像一个工具包一样,里面有很多的工具(函数,类),使用时需要通过import导入。
-
分类:
- 标准库:random、sys、os、time
- 第三方:就是好人已经写好的特定功能的模块,你可以直接使用pip命令安装
- 自定义:自己写的
-
导入:
1
2
3
4import 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
8import random
import zidingyi
# random.randint
# zidingyi.randint
from random import randint as r_rint
from zidingyi import randint as z_rint
-
测试模块
- 当一个模块作为主模块运行时,
__name__
的值为__main__
,当被其他模块导入使用时,值为模块名 - 经常这样写模块的测试代码
1
2if __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 包名
- **注意:**若安装失败,可能是配置文件出错,也可能是目录没有权限操作
-