Python:匿名函数、三元运算、生成器、内置函数、推导式

# 1、匿名函数:基于lambda表达式实现定义没有名字的函数,冒号后面为返回值
data_list = [lambda x: x + 100, lambda x: x + 110, lambda x: x + 120]
print(data_list[0])
print(data_list[0](20))

# 2、匿名函数可以支持任意参数,但只能支持单行代码
# lambda x: x+100
# lambda x1,x2:x1+x2
# lambda *args,**kwargs:args,kwargs

fuc = lambda *args, **kwargs: [args, kwargs]
f = fuc(*[1, 2, 3], **{'n2': 5, 'm2': 6})
print(f)

# 3、三元运算:可以用一行实现简单的条件语句
content = input('请输入:')
i = 'yes' if 'good' in content else 'no'
print(i)

# 4、匿名函数和三元运算结合
f = lambda x: 'yes' if x > 0 else 'no'
print(f(3))


# 5、生成器:函数+yield关键字创建的,可以节省内存
# 注意:执行生成器函数时,函数内部代码不会执行,返回生成器对象
def fuc():
    print(1)
    yield 2  # 返回值,并终止函数运行

    print(3)
    yield 4  # 函数再次执行时,会从上次运行完的开始执行,并返回值

    print(5)
    yield 6  # 函数再次执行从print(4)开始执行,并返回yield值


for i in fuc():
    print(i)  # 输出1 2 3 4 5 6
j0 = fuc()
print(j0)  # 输出<generator object fuc at 0x0000026075E99C10>
f1 = next(j0)  # 使用next,进入生成器函数并执行其中代码,输出1
print(f1)  # 输出2
f2 = next(j0)  # 输出3
print(f2)  # 输出4
f3 = next(j0)  # 输出5
print(f3)  # 输出6

# 6、生成器应用场景
# 要求:生成300万个随机4位数
传统做法:由于每次调用会一次性取300万个数据,会消耗大量内存
import random

digital_list = []
for i in range(3000):
    dig = random.randint(1000, 9999)
    digital_list.append(dig)
print(digital_list)

# 生成器做法:每次调用获取一个数字,可获取300万次随机数字
import random


def num(max_num):
    number = 0
    while number < max_num:
        yield random.randint(1000, 9999)
        number += 1


num_list = num(3000)


# 6、生成器扩展知识send
def fuc():
    print(1)
    v1 = yield 2  # 返回值,并终止函数运行
    print(v1)

    print(3)
    v2 = yield 4  # 函数再次执行时,会从上次运行完的开始执行,并返回值
    print(v2)

    print(5)
    v3 = yield 6  # 函数再次执行从print(4)开始执行,并返回yield值
    print(v3)


data = fuc()  # 打印1
n1 = data.send(None)  # 第一次必须是None
print(n1)  # 返回2
n2 = data.send(777)  # 把777赋值给v1,print(v1)得到777
print(n2) # 继续往下运行,打印3,返回4
n3 = data.send(888) # 把888赋值给v2,print(v2)得到888
print(n3) # 继续往下运行,打印5,返回6


# 7、内置函数
# abs 绝对值
v1 = abs(-10)
print(v1)  # 10

# pow 指数
print(pow(2, 5))  # 2的5次方,32

# sum 求和
v2 = sum([1, 2, 3, 4, 5, 6])
print(v2)  # 1+2+3+4+5+6,21

# divmod 求商和余数
v3, v4 = divmod(11, 3)
print(v3, v4)  # 3 2

# round 小数点后n位
v5 = round(3.1415926, 3)
print(v5)  # 3.1415926的3位数字,3.142

# max 最大值
v6 = max(1, 3, 4, 6, 4)
print(v6)  # 6
v7 = max([9, 433, 2222, 43, 5])
print(v7)  # 2222
v8 = max([-11, 3, 4, 9], key=lambda x: abs(x))
print(v8)  # -11

# min 最小值
v9 = min(1, 3, 4, 6, 4)
print(v9)  # 1
v10 = min([9, 433, 2222, 43, 5])
print(v10)  # 5
v11 = min([-11, 3, 4, 9], key=lambda x: x * 10)
print(v11)  # -11

# all 是否全部为True
v12 = all([1, 3, ''])
print(v12)  # False
# any 是否存在True
v13 = any([1, '', False])
print(v13)  # True

# ord 获得字符对应得Unicode码点(十进制)
v14 = ord('尹')
print(v14)  # 23609

# chr 根据码点(十进制)获取对应字符
v15 = chr(32102)
print(v15)  # 给

# int转换成整形、float转换成浮点数、str转换成字符串、bytes、bool布尔值、list转换成列表、dict转换成字典、tuple转换成元组、
# set、len、print、open、type、range、enumerate、id、hash、help、zip
v16 = (1, 2, 3, 4)
print(list(v16))  # 列表转换[1, 2, 3, 4]

v17 = '尹'
v18 = bytes(v17, encoding='utf-8')
print(v18)  # b'\xe5\xb0\xb9'

v19 = [1, 2, 3, 4]
v20 = [9, 2, 4, 5, 6]
v21 = [2, 44, 2]
v22 = zip(v19, v20, v21)
print(v22)  # <zip object at 0x0000025E6916F900>
for item in v22:
    print(item)  # (1, 9, 2)  (2, 2, 44)  (3, 4, 2)  把每个列表的同一个位置数据抽取出来

# callable 判断是否可被执行
v23 = 'xueyou'
v24 = lambda x: x + 1
print(callable(v23))  # False
print(callable(v24))  # True

# sorted 排序
v25 = [1, 3, 4, 5, 2, 3, 1]
print(sorted(v25))  # 正序[1, 1, 2, 3, 3, 4, 5]
v26 = sorted(v25, reverse=True)
print(v26)  # 倒叙[5, 4, 3, 3, 2, 1, 1]

v27 = {
    '张': {'id': 12, 'age': 34},
    '刘': {'id': 11, 'age': 44},
    '郭': {'id': 9, 'age': 12},
    '黎': {'id': 23, 'age': 6},
}
v28 = sorted(v27.items(), key=lambda x: x[1]['id'], reverse=True)  # 字典按照id值排序
print(
    v28)  # [('黎', {'id': 23, 'age': 6}), ('张', {'id': 12, 'age': 34}), ('刘', {'id': 11, 'age': 44}), ('郭', {'id': 9, 'age': 12})]

data_list = [
    '1-5 编译器和解释器.mp4',
    '1-17 今日作业.mp4',
    '1-9 Python解释器种类.mp4',
    '1-16 今日总结.mp4',
    '1-2 课堂笔记的创建.mp4',
    '1-15 Pycharm使用和破解(win系统).mp4',
    '1-12 python解释器的安装(mac系统).mp4',
    '1-13 python解释器的安装(win系统).mp4',
    '1-8 Python介绍.mp4', '1-7 编程语言的分类.mp4',
    '1-3 常见计算机基本概念.mp4',
    '1-14 Pycharm使用和破解(mac系统).mp4',
    '1-10 CPython解释器版本.mp4',
    '1-1 今日概要.mp4',
    '1-6 学习编程本质上的三件事.mp4',
    '1-18 作业答案和讲解.mp4',
    '1-4 编程语言.mp4',
    '1-11 环境搭建说明.mp4'
]
v29 = sorted(data_list, key=lambda x: int(x.split(' ')[0].split('-')[1]))
print(v29)  # 按照编号排序
# 输出['1-1 今日概要.mp4',
# '1-2 课堂笔记的创建.mp4',
# '1-3 常见计算机基本概念.mp4',
# '1-4 编程语言.mp4',
# '1-5 编译器和解释器.mp4',
# '1-6 学习编程本质上的三件事.mp4',
# '1-7 编程语言的分类.mp4',
# '1-8 Python介绍.mp4',
# '1-9 Python解释器种类.mp4',
# '1-10 CPython解释器版本.mp4',
# '1-11 环境搭建说明.mp4',
# '1-12 python解释器的安装(mac系统).mp4',
# '1-13 python解释器的安装(win系统).mp4',
# '1-14 Pycharm使用和破解(mac系统).mp4',
# '1-15 Pycharm使用和破解(win系统).mp4',
# '1-16 今日总结.mp4',
# '1-17 今日作业.mp4',
# '1-18 作业答案和讲解.mp4']

#  8、推导式
v30 = [i for i in range(10)]
print(v30)  # 列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

v31 = [[i, i] for i in range(10)]
print(v31)  # [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9]]

v32 = [[i, i + 2] for i in range(20) if i > 10]
print(v32)  # [[11, 13], [12, 14], [13, 15], [14, 16], [15, 17], [16, 18], [17, 19], [18, 20], [19, 21]]

v33 = {i for i in range(10)}
print(v33)  # 集合{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

v34 = {i: i % 3 for i in range(10)}
print(v34)  # 字典{0: 0, 1: 1, 2: 2, 3: 0, 4: 1, 5: 2, 6: 0, 7: 1, 8: 2, 9: 0}

v35 = (i for i in range(5))
print(v35)  # 元组:不会立即执行内部循环,而是得到一个生成器:<generator object <genexpr> at 0x0000025766F39F20>
for item in v35:
    print(item)  # 0 1 2 3 4

data_list = [
    '1-5 编译器和解释器.mp4',
    '1-17 今日作业.mp4',
    '1-9 Python解释器种类.mp4',
    '1-16 今日总结.mp4',
    '1-2 课堂笔记的创建.mp4',
    '1-15 Pycharm使用和破解(win系统).mp4',
    '1-12 python解释器的安装(mac系统).mp4',
    '1-13 python解释器的安装(win系统).mp4',
    '1-8 Python介绍.mp4', '1-7 编程语言的分类.mp4',
    '1-3 常见计算机基本概念.mp4',
    '1-14 Pycharm使用和破解(mac系统).mp4',
    '1-10 CPython解释器版本.mp4',
    '1-1 今日概要.mp4',
    '1-6 学习编程本质上的三件事.mp4',
    '1-18 作业答案和讲解.mp4',
    '1-4 编程语言.mp4',
    '1-11 环境搭建说明.mp4'
]
v36 = [i.split('.')[0] for i in data_list]
print(v36)  # 去掉.mp4
v37 = {'name': 'Roman', 'age': '33', 'job': 'realestate'}
v38 = '///'.join([f'{k}-{v}' for k, v in v37.items()])
print(v38)  # name-Roman///age-33///job-realestate


info = {
    'sign_type': "MD5",
    'out_refund_no': "12323",
    'appid': 'wx55cca0b94f723dc7',
    'mch_id': '1526049051',
    'out_trade_no': "ffff",
    'nonce_str': "sdfdffd",
    'total_fee': 9901,
    'refund_fee': 10000
}  # 将字典按照键从小到大排序,然后在按照如下格式拼接起来。(微信支付API内部处理需求)
v39 = sorted(info.items(), key=lambda x: x[0])
print(v39)  # [('appid', 'wx55cca0b94f723dc7'), ('mch_id', '1526049051'), ('nonce_str', 'sdfdffd'),
# ('out_refund_no', '12323'), ('out_trade_no', 'ffff'),
# ('refund_fee', 10000), ('sign_type', 'MD5'), ('total_fee', 9901)]
v40 = '——'.join([f'{i[0]}_{i[1]}' for i in v39])
print(v40)  # appid_wx55cca0b94f723dc7——mch_id_1526049051——nonce_str_sdfdffd——out_refund_no_12323——out_trade_no_ffff——refund_fee_10000——sign_type_MD5——total_fee_9901

v41 = [lambda x: x + i for i in range(9)]  # v41已经运行完,i=8,列表里全都是函数
v42 = v41[0](10)  # 第0个函数传递参数10,得出10+8=18
v43 = v41[5](10)  # 第5个函数传递参数10,得出10+8=18
print(v42, v43)  # 18  18
v44 = [[i, j] for i in range(3) for j in range(2)]  # 支持嵌套
print(v44)  # [[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]


def num1():
    return [lambda x: x + i for i in range(3)]  # 生成函数,并且函数已经执行,循环已经结束,i=2


print(
    num1())  # [<function num1.<locals>.<listcomp>.<lambda> at 0x000001A6AA9729D0>, <function num1.<locals>.<listcomp>.<lambda> at 0x000001A6AA972A60>, <function num1.<locals>.<listcomp>.<lambda> at 0x000001A6AA972AF0>]
result1 = [m(3) for m in num1()]
print(result1)  # [5,5,5]


def num2():
    return (lambda x: x + i for i in range(3))  # 生成生成器,函数未执行,未开始循环


print(num2())  # <generator object num2.<locals>.<genexpr> at 0x000001A6AA939C80>
result2 = [m(3) for m in num2()]
print(result2)  # [3, 4, 5]
上一篇:如何将mp4视频制作成gif表情包


下一篇:Python 编程高手之路 深度之眼