翼度科技»论坛 编程开发 python 查看内容

day10-内置函数和推导式

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
1. 匿名函数

传统的函数的定义包括了:函数名 + 函数体。
  1. def send_email():
  2.     pass
  3. # 1. 执行
  4. send_email()
  5. # 2. 当做列表元素
  6. data_list = [send_email, send_email, send_email ]
  7. # 3. 当做参数传递
  8. other_function(send_email)
复制代码
匿名函数,则是基于lambda表达式实现定义一个可以没有名字的函数,例如:
  1. data_list = [ lambda x:x+100,  lambda x:x+110, lambda x:x+120 ]
  2. print( data_list[0] )
复制代码
  1. f1 = lambda x:x+100
  2. res = f1(100)
  3. print(res)
复制代码
基于Lambda定义的函数格式为:lambda 参数:函数体

  • 参数,支持任意参数。
    1. lambda x: 函数体
    2. lambda x1,x2: 函数体
    3. lambda *args, **kwargs: 函数体
    复制代码
  • 函数体,只能支持单行的代码。
    1. def xxx(x):
    2.     return x + 100
    3. lambda x: x + 100
    复制代码
  • 返回值,默认将函数体单行代码执行的结果返回给函数的执行这。
    1. func = lambda x: x + 100
    2. v1 = func(10)
    3. print(v1) # 110
    复制代码
  1. def func(a1,a2):
  2.     return a1 + a2 + 100
  3. foo = lambda a1,a2: a1 + a2 + 100
复制代码
匿名函数适用于简单的业务处理,可以快速并简单的创建函数。
练习题

根据函数写写出其匿名函数的表达方式
  1. def func(a1,a2):
  2.     return a1 + a2
  3. func = lambda a1,a2: a1+a2
复制代码
  1. def func(data):
  2.     return data.replace("苍老师","***")
  3. func= lambda data: data.replace("苍老师","***")
复制代码
  1. def func(data):
  2.     name_list = data.replace(".")
  3.     return name_list[-1]
  4. func = lambda data: data.replace(".")[-1]
复制代码
在编写匿名函数时,由于受限 函数体只能写一行,所以匿名函数只能处理非常简单的功能。
扩展:三元运算

简单的函数,可以基于lambda表达式实现。
简单的条件语句,可以基于三元运算实现,例如:
  1. num = input("请写入内容")
  2. if "苍老师" in num:
  3.     data = "臭不要脸"
  4. else:
  5.     data = "正经人"
  6. print(data)
复制代码
  1. num = input("请写入内容")
  2. data = "臭不要脸" if "苍老师" in num else "正经人"
  3. print(data)
  4. # 结果 =  条件成立时    if   条件   else   不成立
复制代码
lambda表达式和三元运算没有任何关系,属于两个独立的知识点。
掌握三元运算之后,以后再编写匿名函数时,就可以处理再稍微复杂点的情况了,例如:
  1. func = lambda x: "大了" if x > 66 else "小了"
  2. v1 = func(1)
  3. print(v1) # "小了"
  4. v2 = func(100)
  5. print(v2) # "大了"
复制代码
2. 生成器

生成器是由函数+yield关键字创造出来的写法,在特定情况下,用他可以帮助我们节省内存。

  • 生成器函数,但函数中有yield存在时,这个函数就是生产生成器函数。
    1. def func():
    2.     print(111)
    3.     yield 1
    复制代码
    1. def func():
    2.     print(111)
    3.     yield 1    print(222)    yield 2    print(333)    yield 3    print(444)
    复制代码
  • 生成器对象,执行生成器函数时,会返回一个生成器对象。
    1. def func():
    2.     print(111)
    3.     yield 1    print(222)    yield 2    print(333)    yield 3    print(444)    data = func()# 执行生成器函数func,返回的生成器对象。# 注意:执行生成器函数时,函数内部代码不会执行。
    复制代码
    1. def func():
    2.     print(111)
    3.     yield 1    print(222)    yield 2    print(333)    yield 3    print(444)    data = func()v1 = next(data)print(v1)v2 = next(data)print(v2)v3 = next(data)print(v3)v4 = next(data)print(v4)  # 结束或中途遇到return,程序爆:StopIteration 错误
    复制代码
    1. data = func()
    2. for item in data:
    3.     print(item)
    复制代码
生成器的特点是,记录在函数中的执行位置,下次执行next时,会从上一次的位置基础上再继续向下执行。
应用场景


  • 假设要让你生成 300w个随机的4位数,并打印出来。

    • 在内存中一次性创建300w个
    • 动态创建,用一个创建一个。
    1. import random
    2. val = random.randint(1000, 9999)
    3. print(val)
    复制代码
    1. import random
    2. data_list = []
    3. for i in range(300000000):
    4.     val = random.randint(1000, 9999)
    5.         data_list.append(val)
    6.    
    7. # 再使用时,去 data_list 中获取即可。
    8. # ...
    复制代码
    1. import random
    2. def gen_random_num(max_count):
    3.     counter = 0
    4.     while counter < max_count:
    5.         yield random.randint(1000, 9999)
    6.         counter += 1
    7. data_list = gen_random_num(3000000)
    8. # 再使用时,去 data_list 中获取即可。
    复制代码
  • 假设让你从某个数据源中获取300w条数据(后期学习操作MySQL 或 Redis等数据源再操作,了解思想即可)。

    所以,当以后需要我们在内存中创建很多数据时,可以想着用基于生成器来实现一点一点生成(用一点生产一点),以节省内存的开销。
扩展
  1. def func():
  2.     print(111)
  3.     v1 = yield 1
  4.     print(v1)
  5.     print(222)
  6.     v2 = yield 2
  7.     print(v2)
  8.     print(333)
  9.     v3 = yield 3
  10.     print(v3)
  11.     print(444)
  12. data = func()
  13. n1 = data.send(None)
  14. print(n1)
  15. n2 = data.send(666)
  16. print(n2)
  17. n3 = data.send(777)
  18. print(n3)
  19. n4 = data.send(888)
  20. print(n4)
复制代码
3.内置函数


Python内部为我们提供了很多方便的内置函数,在此整理出来36个给大家来讲解。

  • 第1组(5个)

    • abs,绝对值
      1. v = abs(-10)
      复制代码
    • pow,指数
      1. v1 = pow(2,5) # 2的5次方  2**5
      2. print(v1)
      复制代码
    • sum,求和
      1. v1 = sum([-11, 22, 33, 44, 55]) # 可以被迭代-for循环
      2. print(v1)
      复制代码
    • divmod,求商和余数
      1. v1, v2 = divmod(9, 2)
      2. print(v1, v2)
      复制代码
    • round,小数点后n位(四舍五入)
      1. v1 = round(4.11786, 2)
      2. print(v1) # 4.12
      复制代码

  • 第2组:(4个)

    • min,最小值
      1. v1 = min(11, 2, 3, 4, 5, 56)
      2. print(v1) # 2
      复制代码
      1. v2 = min([11, 22, 33, 44, 55]) # 迭代的类型(for循环)
      2. print(v2)
      复制代码
      1. v3 = min([-11, 2, 33, 44, 55], key=lambda x: abs(x))
      2. print(v3) # 2
      复制代码
    • max,最大值
      1. v1 = max(11, 2, 3, 4, 5, 56)
      2. print(v1)
      3. v2 = max([11, 22, 33, 44, 55])
      4. print(v2)
      复制代码
      1. v3 = max([-11, 22, 33, 44, 55], key=lambda x: x * 10)
      2. print(v3) # 55
      复制代码
    • all,是否全部为True
      1. v1 = all(   [11,22,44,""]   ) # False
      复制代码
    • any,是否存在True
      1. v2 = any([11,22,44,""]) # True
      复制代码

  • 第3组(3个)

    • bin,十进制转二进制
    • oct,十进制转八进制
    • hex,十进制转十六进制

  • 第4组(2个)

    • ord,获取字符对应的unicode码点(十进制)
      1. v1 = ord("武")
      2. print(v1, hex(v1))
      复制代码
    • chr,根据码点(十进制)获取对应字符
      1. v1 = chr(27494)
      2. print(v1)
      复制代码

  • 第5组(9个)

    • int
    • foat
    • str,unicode编码
    • bytes,utf-8、gbk编码
      1. v1 = "武沛齐"  # str类型
      2. v2 = v1.encode('utf-8')  # bytes类型
      3. v3 = bytes(v1,encoding="utf-8") # bytes类型
      复制代码
    • bool
    • list
    • dict
    • tuple
    • set

  • 第6组(13个)

    • len
    • print
    • input
    • open
    • type,获取数据类型
      1. v1 = "123"
      2. if type(v1) == str:
      3.     pass
      4. else:
      5.     pass
      复制代码
    • range
      1. range(10)
      复制代码
    • enumerate
      1. v1 = ["武沛齐", "alex", 'root']
      2. for num, value in enumerate(v1, 1):
      3.     print(num, value)
      复制代码
    • id
    • hash
      1. v1 = hash("武沛齐")
      复制代码
    • help,帮助信息

      • pycharm,不用
      • 终端,使用

    • zip
      1. v1 = [11, 22, 33, 44, 55, 66]
      2. v2 = [55, 66, 77, 88]
      3. v3 = [10, 20, 30, 40, 50]
      4. result = zip(v1, v2, v3)
      5. for item in result:
      6.     print(item)
      7.     """
      8.     (11, 55, 10)
      9.     (22, 66, 20)
      10.     (33, 77, 30)
      11.     (44, 88, 40)
      12.     """
      复制代码
    • callable,是否可执行,后面是否可以加括号。
      1. v1 = "武沛齐"
      2. v2 = lambda x: x
      3. def v3():
      4.     pass
      5. print(callable(v1))        # False
      6. print(callable(v2))        # True
      7. print(callable(v3))        # True
      复制代码
    • sorted,排序
      1. v1 = sorted([11,22,33,44,55])
      复制代码
      1. info = {
      2.     "wupeiqi": {
      3.         'id': 10,
      4.         'age': 119
      5.     },
      6.     "root": {
      7.         'id': 20,
      8.         'age': 29
      9.     },
      10.     "seven": {
      11.         'id': 9,
      12.         'age': 9
      13.     },
      14.     "admin": {
      15.         'id': 11,
      16.         'age': 139
      17.     },
      18. }
      19. result = sorted(info.items(), key=lambda x: x[1]['id'])
      20. print(result)
      复制代码
      1. data_list = [
      2.     '1-5 编译器和解释器.mp4',
      3.     '1-17 今日作业.mp4',
      4.     '1-9 Python解释器种类.mp4',
      5.     '1-16 今日总结.mp4',
      6.     '1-2 课堂笔记的创建.mp4',
      7.     '1-15 Pycharm使用和破解(win系统).mp4',
      8.     '1-12 python解释器的安装(mac系统).mp4',
      9.     '1-13 python解释器的安装(win系统).mp4',
      10.     '1-8 Python介绍.mp4', '1-7 编程语言的分类.mp4',
      11.     '1-3 常见计算机基本概念.mp4',
      12.     '1-14 Pycharm使用和破解(mac系统).mp4',
      13.     '1-10 CPython解释器版本.mp4',
      14.     '1-1 今日概要.mp4',
      15.     '1-6 学习编程本质上的三件事.mp4',
      16.     '1-18 作业答案和讲解.mp4',
      17.     '1-4 编程语言.mp4',
      18.     '1-11 环境搭建说明.mp4'
      19. ]
      20. result = sorted(data_list, key=lambda x: int(x.split(' ')[0].split("-")[-1]) )
      21. print(result)
      复制代码

4.推导式

推导式是Python中提供了一个非常方便的功能,可以让我们通过一行代码实现创建list、dict、tuple、set 的同时初始化一些值。
请创建一个列表,并在列表中初始化:0、1、2、3、4、5、6、7、8、9...299 整数元素。
  1. data = []
  2. for i in range(300):
  3.     data.append(i)
复制代码

  • 列表
    1. num_list = [ i for i in range(10)]
    2. num_list = [ [i,i] for i in range(10)]
    3. num_list = [ [i,i] for i in range(10) if i > 6 ]
    复制代码
  • 集合
    1. num_set = { i for i in range(10)}
    2. num_set = { (i,i,i) for i in range(10)}
    3. num_set = { (i,i,i) for i in range(10) if i>3}
    复制代码
  • 字典
    1. num_dict = { i:i for i in range(10)}
    2. num_dict = { i:(i,11) for i in range(10)}
    3. num_dict = { i:(i,11) for i in range(10) if i>7}
    复制代码
  • 元组,不同于其他类型。
    1. # 不会立即执行内部循环去生成数据,而是得到一个生成器。
    2. data = (i for i in range(10))
    3. print(data)
    4. for item in data:
    5.     print(item)
    复制代码
练习题


  • 去除列表中每个元素的 .mp4后缀。
    1. data_list = [
    2.     '1-5 编译器和解释器.mp4',
    3.     '1-17 今日作业.mp4',
    4.     '1-9 Python解释器种类.mp4',
    5.     '1-16 今日总结.mp4',
    6.     '1-2 课堂笔记的创建.mp4',
    7.     '1-15 Pycharm使用和破解(win系统).mp4',
    8.     '1-12 python解释器的安装(mac系统).mp4',
    9.     '1-13 python解释器的安装(win系统).mp4',
    10.     '1-8 Python介绍.mp4', '1-7 编程语言的分类.mp4',
    11.     '1-3 常见计算机基本概念.mp4',
    12.     '1-14 Pycharm使用和破解(mac系统).mp4',
    13.     '1-10 CPython解释器版本.mp4',
    14.     '1-1 今日概要.mp4',
    15.     '1-6 学习编程本质上的三件事.mp4',
    16.     '1-18 作业答案和讲解.mp4',
    17.     '1-4 编程语言.mp4',
    18.     '1-11 环境搭建说明.mp4'
    19. ]
    20. result = []
    21. for item in data_list:
    22.     result.append(item.rsplit('.',1)[0])
    23. result = [ item.rsplit('.',1)[0] for item in data_list]
    复制代码
  • 将字典中的元素按照 键-值格式化,并最终使用 ;连接起来。
    1. info = {
    2.     "name":"武沛齐",
    3.     "email":"xxx@live.com",
    4.     "gender":"男",
    5. }
    6. data_list = []
    7. for k,v in info.items():
    8.     temp = "{}-{}".format(k,v)
    9.     data_list.append(temp)
    10. result= ";".join(data_list)
    11. result = ";".join( [ "{}-{}".format(k,v) for k,v in info.items()] )
    复制代码
  • 将字典按照键从小到大排序,然后在按照如下格式拼接起来。(微信支付API内部处理需求)
    1. info = {
    2.     'sign_type': "MD5",
    3.     'out_refund_no': "12323",
    4.     'appid': 'wx55cca0b94f723dc7',
    5.     'mch_id': '1526049051',
    6.     'out_trade_no': "ffff",
    7.     'nonce_str': "sdfdffd",
    8.     'total_fee': 9901,
    9.     'refund_fee': 10000
    10. }
    11. data = "&".join(["{}={}".format(key, value) for key, value in sorted(info.items(), key=lambda x: x[0])])
    12. print(data)
    复制代码
  • 看代码写结果
    1. def func():
    2.     print(123)
    3. data_list = [func for i in range(10)]
    4. print(data_list)        # [<function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>, <function func at 0x000002269F4D1D30>]
    复制代码
  • 看代码写结果
    1. def func(num):
    2.     return num + 100
    3. data_list = [func(i) for i in range(10)]
    4. print(data_list)        # [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
    复制代码
  • 看代码写结果(执行出错,通过他可以让你更好的理解执行过程)
    1. def func(x):
    2.     return x + i
    3. data_list = [func for i in range(10)]
    4. val = data_list[0](100)
    5. print(val)        # 报错,i未定义
    复制代码
  • 看代码写结果(新浪微博面试题)
    1. data_list = [lambda x: x + i for i in range(10)]  # [函数,函数,函数]   i=9
    2. v1 = data_list[0](100)
    3. v2 = data_list[3](100)
    4. print(v1, v2)  # 109 109
    复制代码
小高级


  • 推导式支持嵌套
    1. data = [ i for i in range(10)]
    复制代码
    1. data = [ (i,j) for j in range(5) for i in range(10)]
    2. data = []
    3. for j in range(5):
    4.    for i in range(10):
    5.        data.append((i, j))
    6. data = [ [i, j] for j in range(5) for i in range(10)]
    复制代码
    1. # 一副扑克牌
    2. poker_list = [ (color,num) for num in range(1,14) for color in ["红桃", "黑桃", "方片", "梅花"]]
    3. poker_list = [ [color, num] for num in range(1, 14) for color in ["红桃", "黑桃", "方片", "梅花"]]
    4. print(poker_list)
    复制代码
  • 烧脑面试题
    1. def num():
    2.     return [lambda x: i * x for i in range(4)]
    3. # 1. num()并获取返回值  [函数,函数,函数,函数] i=3
    4. # 2. for循环返回值
    5. # 3. 返回值的每个元素(2)
    6. result = [m(2) for m in num()]
    7. print(result)  # [6,6,6,6]
    复制代码
    1. def num():
    2.     return (lambda x: i * x for i in range(4))
    3. # 1. num()并获取返回值  生成器对象
    4. # 2. for循环返回值
    5. # 3. 返回值的每个元素(2)
    6. result = [m(2) for m in num()]  # [0,2,4,6 ]
    7. print(result)
    复制代码
总结


  • 匿名函数,基于lambda表达式实现一行创建一个函数。一般用于编写简单的函数。
  • 三元运算,用一行代码实现处理简单的条件判断和赋值。
  • 生成器,函数中如果yield关键字

    • 生成器函数
    • 生成器对象
    • 执行生成器函数中的代码

      • next
      • for(常用)
      • send


  • 内置函数(36个)
  • 推导式

    • 常规操作
    • 小高级操作

作业


  • 看代码写结果
    1. v = [lambda: x for x in range(10)]
    2. print(v)  # [<function <listcomp>.<lambda> at 0x000001A733E23280>, <function <listcomp>.<lambda> at 0x000001A7449C63A0>, <function <listcomp>.<lambda> at 0x000001A7449C6550>, <function <listcomp>.<lambda> at 0x000001A7452D5940>, <function <listcomp>.<lambda> at 0x000001A7452D59D0>, <function <listcomp>.<lambda> at 0x000001A7452D5A60>, <function <listcomp>.<lambda> at 0x000001A7452D5AF0>, <function <listcomp>.<lambda> at 0x000001A7452D5B80>, <function <listcomp>.<lambda> at 0x000001A7452D5C10>, <function <listcomp>.<lambda> at 0x000001A7452D5CA0>]
    3. print(v[0])  # <function <listcomp>.<lambda> at 0x000001A733E23280>
    4. print(v[0]())  # 9
    复制代码
  • 看代码写结果
    1. v = [i for i in range(10,0,-1) if i > 5]
    2. print(v)    # [10, 9, 8, 7, 6]
    复制代码
  • 看代码写结果
    1. data = [lambda x:x*i for i in range(10)]
    2. print(data)     # [<function <listcomp>.<lambda> at 0x0000029708933280>, <function <listcomp>.<lambda> at 0x00000297195063A0>, <function <listcomp>.<lambda> at 0x0000029719506550>, <function <listcomp>.<lambda> at 0x0000029719E15940>, <function <listcomp>.<lambda> at 0x0000029719E159D0>, <function <listcomp>.<lambda> at 0x0000029719E15A60>, <function <listcomp>.<lambda> at 0x0000029719E15AF0>, <function <listcomp>.<lambda> at 0x0000029719E15B80>, <function <listcomp>.<lambda> at 0x0000029719E15C10>, <function <listcomp>.<lambda> at 0x0000029719E15CA0>]
    3. print(data[0](2))   # 18
    4. print(data[0](2) == data[8](2))     # True
    复制代码
  • 请用列表推导式实现,踢出列表中的字符串,最终生成一个新的列表保存。
    1. data_list = [11,22,33,"alex",455,'eirc']
    2. new_data_list = [i for i in data_list if type(i) == int] # 请在[]中补充代码实现。
    3. # 提示:可以用type判断类型
    复制代码
  • 请用列表推导式实现,对data_list中的每个元素判断,如果是字符串类型,则计算长度作为元素放在新列表的元素中;如果是整型,则让其值+100 作为元素放在新的列表的元素中。
    1. data_list = [11,22,33,"alex",455,'eirc']
    2. new_data_list = [x + 100 if type(x) == int else len(x) for x in data_list] # 请在[]中补充代码实现。
    3. # 提示:可以基于三元运算实现
    复制代码
  • 请使用字典推导式实现,将如果列表构造成指定格式字典.
    1. data_list = [
    2.     (1,'alex',19),
    3.     (2,'老男',84),
    4.     (3,'老女',73)
    5. ]
    6. # 请使用推导式将data_list构造生如下格式:
    7. info_dict = {item[0]: item for item in data_list}
    8. """
    9. info_dict = {
    10.     1:(1,'alex',19),
    11.     2:(2,'老男',84),
    12.     3:(3,'老女',73)
    13. }
    14. """
    复制代码
  • 有4个人玩扑克牌比大小,请对比字典中每个人的牌的大小,并输入优胜者的姓名(值大的胜利,不必考虑A)。
    1. player = {
    2.     "武沛齐":["红桃",10],
    3.     "alex":["红桃",8],
    4.     'eric':["黑桃",3],
    5.     'killy':["梅花",12],
    6. }
    复制代码
    1. data = sorted(player.items(), key=lambda x: x[1][1])
    2. print(data[-1][0])
    复制代码
  • 请编写一个生成器函数实现生成n个斐波那契数列的值。

    • 什么是斐波那契数列?
      1. 前两个数相加的结果,就是下一个数。
      2. 1 1 2 3 5 8 13 21 34 55 ...
      复制代码
    • 代码结构示例,请在此基础上补充代码实现。
      1. def fib(max_count):
      2.     first = 1
      3.     second = 0
      4.     count = 0
      5.     while count < max_count:
      6.        next_value = first + second
      7.        first = second
      8.        second = next_value
      9.        yield next_value
      10.        count += 1
      11. count = input("请输入要生成斐波那契数列的个数:")
      12. count = int(count)
      13. fib_generator = fib(count)
      14. for num in fib_generator:
      15.     print(num)
      复制代码


来源:https://www.cnblogs.com/sbhglqy/p/18114342
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具