实参高阶函数迭代器和生成器
函数的本质
1)函数就是变量
Python中定义函数其实就是定义一个类型是function的变量,函数名就是变量名
变量 = lambda 参数列表: 返回值
相当于:
def 变量(参数列表):
return 返回值
实参高阶函数
1)map-将一个或多个序列中的元素通过指定规则创建一个新的序列
map(函数,序列) - 将序列中的元素通过函数指定的规则转换成一个新的序列中的元素
函数要求: 有且只有一个参数 - 指向后面的这个序列中的每个元素
有一个返回值 - 新序列中元素(用参数来代表原序列中的元素,描述出新序列中元素和原序列元素的关系)
map(函数,序列1,序列2) - 将两个序列中的元素通过函数指定的规则转换成一个新的序列中的元素
函数的要求:有且只有两个参数 - 分别指向后面两个序列中的元素
有一个返回值 - 新序列中元素(用参数来代表原序列中的元素,描述出新序列中元素和原序列元素的关系)
map(函数, 序列1, 序列2, 序列3)
函数的要求:有且只有三个参数 - 分别指向后面三个序列中的元素
有一个返回值
获取nums中所有元素的个位数 -> [4, 2, 7, 0, 1]
nums = [84, 72, 67, 90, 31]
new_nums = list(map(lambda x: x % 10, nums))
print(new_nums)
通过将nums中的元素乘以10转换成一个新的序列 -> [230, 80, 900, 20]
nums = [23, 8, 90, 2]
# 方法一:
new_nums = [x * 10 for x in nums]
# 方法二:
new_nums = list(map(lambda x: x * 10, nums))
print(new_nums)
2).reduce - 将序列中的元素按照指定的规则合并成一个数据
reduce(函数, 序列, 初始值)
函数的要求: 有且只有两个参数 - 第一个参数指向初始值,第二个参数指向序列中的元素
返回值 - 确定合并方式(看元素和初始值进行什么样的操作来进行合并的)
from functools import reduce
# 练习: 求nums中所有元素的和 -> 118 => 0 + 10 + 20 + 32 + 56
nums = [10, 20, 32, 56]
result = reduce(lambda init, item: init + item, nums, 0)
print(result)
迭代器
1. 什么是迭代器(iter)
迭代器是容器型数据类型 - 可以遍历,也可以转换成列表或者元组等
打印迭代器无法查看元素;无法统计迭代器中元素的个数;
如果要获取迭代器的元素,必须将元素从迭代器中取出来,而且元素一旦取出,这个元素在迭代器中就不存在,也无法重新添加。
2.怎么创建迭代器
方法一:用iter将其他的序列转换成迭代器(任何序列都可以转化成迭代器)
iter1 = iter('hello')
iter2 = iter([10, 20, 30])
iter3 = iter({'name': '张三', 'age': 18})
iter4 = iter({100, 200, 300})
方法二:创建一个生成器
迭代器打印无法查看元素
print(iter1) # <str_iterator object at 0x1074358e0>
print(iter2) # <list_iterator object at 0x1070138b0>
迭代器不能统计元素个数
print(len(iter1)) # TypeError: object of type 'str_iterator' has no len()
3.获取迭代器的元素
不管以什么样的方式得到了迭代器中的元素,那么被获取到的元素一定会从迭代器中消失
1)获取单个元素
next(迭代器) - 获取当前迭代器最上面的那个元素
iter1 = iter('hello')
print(next(iter1)) # h
print(next(iter1)) # e
print(next(iter1)) # l
print(next(iter1)) # l
print(next(iter1)) # o
# print(next(iter1)) # 报错:StopIteration
2)遍历
for 变量 in 迭代器:
循环体
iter2 = iter([10, 20, 30])
for x in iter2:
print(f'x:{x}')
# print(next(iter2)) # 报错:StopIteration
生成器
1. 什么是生成器
生成器是一种容器(保存不是多个数据,而且产生多个数据的算法) - 可以遍历,也可以转换成列表、元组等
生成器具备迭代器所有的特点:打印无法看到元素、无法统计个数、元素一旦获取对应的元素就会从生成器中消失
2.怎么创建生成器
调用一个带有yield关键字的函数就可以得到一个生成器。
如果调用的是普通函数,调用函数的时候会执行函数体,并且获取函数返回值;
如果调用的函数的函数体中有yield,调用函数的时候不会执行函数体,也不会获取函数返回值,得到的是一个生成器对象。
def func1():
print('=======')
print('+++++++')
print('--------')
yield
# if False:
# yield
return 100
result = func1()
print(result) # <generator object func1 at 0x1031f6b30>
3. 控制生成器产生数据的个数和值
生成器能产生多少个数据,能产生哪些数据由创建生成器的时候调用的那个函数的函数体,在执行的时候会遇到几次yield以及每次遇到yield的时候,yield后面的值来决定。
def func1():
yield 100
yield 200
if 10 > 20:
yield 400
return 300
yield 300
gen1 = func1()
print(list(gen1)) # [100, 200]
# print(next(gen1)) # 报错: StopIteration
4. 生成器产生数据的原理
def func2():
print('============')
yield 100
print('+++++++++++')
yield 200
print('----------')
yield 300
print('end')
return 100
print('**********')
gen3 = func2()
print(gen3)
print('-----------第1次-------------')
print('next:', next(gen3))
print('-----------第2次-------------')
print('next:', next(gen3))
print('-----------第3次-------------')
print('next:', next(gen3))
print('-----------第4次-------------')
# 练习1:写一个函数可以创建Python学生的学号的生成器
# 'python001'、'python002'、.... 'python999'
def num_creater():
for x in range(1, 1000):
yield f'python{x:0>3}'
gen_num = num_creater()
print(next(gen_num)) #python001
print(next(gen_num)) #python002
print(next(gen_num)) #python003
模块的使用
1. 什么是模块
一个py文件就是一个模块,模块名就是py文件的文件名
2. 怎么在一个模块中使用另外一个模块中的内容
前提:只有模块名字是标识符并且不是关键的模块才能被其他模块使用
原则:先导入才能用
3. 模块的分类
系统模块 - Python环境中自带的py文件
自定义模块 - 程序员自己创建的py文件
4. 怎么导入模块
- import 模块名 - 导入指定模块,导入后可以通过’模块名.'的方式使用这个模块中所有的全局变量
- from 模块名 import 变量1, 变量2,… - 导入指定模块,导入后可以直接使用对应的变量
- from 模块名 import * - 导入指定模块,导入后可以直接使用模块中所有的全局变量
- 重命名
import 模块名 as 新模块名 - 对模块重命名
from 模块名 import 变量1 as 新变量1, 变量2,… - 对变量重命名