2-5 匿名函数、生成器、内置函数、推导式
概要:
-
匿名函数
-
生成器
-
内置函数
-
推导式
1. 匿名函数
传统的函数的定义包括了:函数名 + 函数体。
匿名函数,则是基于lambda表达式实现定义一个可以没有名字的函数,例如:
基于Lambda定义的函数格式为:lambda 参数:函数体
-
参数,支持任意参数。
-
函数体,只能支持单行的代码。
-
返回值,默认将函数体单行代码执行的结果返回给函数的执行这。
匿名函数适用于简单的业务处理,可以快速并简单的创建函数。
扩展:三元运算
简单的函数,可以基于lambda表达式实现。
简单的条件语句,可以基于三元运算实现,例如:
lambda表达式和三元运算没有任何关系,属于两个独立的知识点。
掌握三元运算之后,以后再编写匿名函数时,就可以处理再稍微复杂点的情况了,例如:
2. 生成器
生成器是由函数+yield关键字创造出来的写法,在特定情况下,用他可以帮助我们节省内存。
-
生成器函数,但函数中有yield存在时,这个函数就是生产生成器函数。
-
生成器对象,执行生成器函数时,会返回一个生成器对象。
生成器的特点是,记录在函数中的执行位置,下次执行next时,会从上一次的位置基础上再继续向下执行。
应用场景
-
假设要让你生成 300w个随机的4位数,并打印出来。
-
在内存中一次性创建300w个
-
动态创建,用一个创建一个。
import random def gen_random_num(max_count): counter = 0 while counter < max_count: yield random.randint(1000, 9999) counter += 1 data_list = gen_random_num(3000000) # 再使用时,去 data_list 中获取即可。 -
-
假设让你从某个数据源中获取300w条数据(后期学习操作MySQL 或 Redis等数据源再操作,了解思想即可)。
所以,当以后需要我们在内存中创建很多数据时,可以想着用基于生成器来实现一点一点生成(用一点生产一点),以节省内存的开销。
扩展
def func():
print(111)
v1 = yield 1
print(v1)
print(222)
v2 = yield 2
print(v2)
print(333)
v3 = yield 3
print(v3)
print(444)
data = func()
n1 = data.send(None)
print(n1)
n2 = data.send(666)
print(n2)
n3 = data.send(777)
print(n3)
n4 = data.send(888)
print(n4)
3.内置函数
Python内部为我们提供了很多方便的内置函数,在此整理出来36个给大家。
-
第1组(5个)
-
abs,绝对值
v = abs(-10) -
pow,指数
v1 = pow(2,5) # 2的5次方 2**5 print(v1) -
sum,求和
v1 = sum([-11, 22, 33, 44, 55]) # 可以被迭代-for循环 print(v1) -
divmod,求商和余数
v1, v2 = divmod(9, 2) print(v1, v2) -
round,小数点后n位(四舍五入)
v1 = round(4.11786, 2) print(v1) # 4.12
-
-
第2组:(4个)
-
min,最小值
v1 = min(11, 2, 3, 4, 5, 56) print(v1) # 2v2 = min([11, 22, 33, 44, 55]) # 迭代的类型(for循环) print(v2)v3 = min([-11, 2, 33, 44, 55], key=lambda x: abs(x)) print(v3) # 2 -
max,最大值
v1 = max(11, 2, 3, 4, 5, 56) print(v1) v2 = max([11, 22, 33, 44, 55]) print(v2)v3 = max([-11, 22, 33, 44, 55], key=lambda x: x * 10) print(v3) # 55 -
all,是否全部为True
v1 = all( [11,22,44,""] ) # False -
any,是否存在True
v2 = any([11,22,44,""]) # True
-
-
第3组(3个)
-
bin,十进制转二进制
-
oct,十进制转八进制
-
hex,十进制转十六进制
-
-
第4组(2个)
-
ord,获取字符对应的unicode码点(十进制)
v1 = ord("武") print(v1, hex(v1)) -
chr,根据码点(十进制)获取对应字符
v1 = chr(27494) print(v1)
-
-
第5组(9个)
-
int
-
foat
-
str,unicode编码
-
bytes,utf-8、gbk编码
v1 = "ayden" # str类型 v2 = v1.encode('utf-8') # bytes类型 v3 = bytes(v1,encoding="utf-8") # bytes类型 -
bool
-
list
-
dict
-
tuple
-
set
-
-
第6组(13个)
-
len
-
print
-
input
-
open
-
type,获取数据类型
v1 = "123" if type(v1) == str: pass else: pass -
range
range(10) -
enumerate
v1 = ["ayden", "alex", 'root'] for num, value in enumerate(v1, 1): print(num, value) -
id
-
hash
v1 = hash("ayden") -
help,帮助信息
-
pycharm,不用
-
终端,使用
-
-
zip
v1 = [11, 22, 33, 44, 55, 66] v2 = [55, 66, 77, 88] v3 = [10, 20, 30, 40, 50] result = zip(v1, v2, v3) for item in result: print(item) -
callable,是否可执行,后面是否可以加括号。
v1 = "ayden" v2 = lambda x: x def v3(): pass print( callable(v1) ) # False print(callable(v2)) print(callable(v3)) -
sorted,排序
v1 = sorted([11,22,33,44,55])info = { "wupeiqi": { 'id': 10, 'age': 119 }, "root": { 'id': 20, 'age': 29 }, "seven": { 'id': 9, 'age': 9 }, "admin": { 'id': 11, 'age': 139 }, } result = sorted(info.items(), key=lambda x: x[1]['id']) print(result)
-
4.推导式
推导式是Python中提供了一个非常方便的功能,可以让我们通过一行代码实现创建list、dict、tuple、set 的同时初始化一些值。
请创建一个列表,并在列表中初始化:0、1、2、3、4、5、6、7、8、9...299 整数元素。
data = []
for i in range(300):
data.append(i)
-
列表
-
集合
-
字典
-
元组,不同于其他类型。
高级
-
推导式支持嵌套
-
烧脑题
总结
-
匿名函数,基于lambda表达式实现一行创建一个函数。一般用于编写简单的函数。
-
三元运算,用一行代码实现处理简单的条件判断和赋值。
-
生成器,函数中如果yield关键字
-
生成器函数
-
生成器对象
-
执行生成器函数中的代码
-
next
-
for(常用)
-
send
-
-
-
内置函数(36个)
-
推导式
-
常规操作
-
高级操作
-


浙公网安备 33010602011771号