首页 > 编程语言 >python入门篇-day05-函数进阶

python入门篇-day05-函数进阶

时间:2024-08-16 19:53:59浏览次数:19  
标签:10 形参 python 30 list1 day05 入门篇 参数 print

函数返回多个值

不管返回多少都会默认封装成一个元组的形式返回(可以自定义返回的数据类型 , 如: [ ]{ })

思考: 1个函数可以同时返回多个结果(返回值)?答案: 错误, 因为1个函数只能返回1个结果, 如果同时返回多个值则会封装成1个元素进行返回.

演示
# 需求: 定义函数 my_calculate(a, b), 返回两个整数的: 加减乘除结果.
def my_calculate(a, b):
    add = a + b
    sub = a - b
    mul = a * b
    div = a // b
    # return add, sub, mul, div   # 如果函数同时返回多个结果, 则会封装到1个元组中, 进行返回.
    return add, sub, mul, div   # 如果函数同时返回多个结果, 则会封装到1个元组中, 进行返回.
​
​
# 测试函数
if __name__ == '__main__':
    result = my_calculate(10, 3)
    print(type(result)) # <class 'tuple'>
    print(result)

函数的多种参数

函数参数指的是: 形参, 实参等一些特殊的写法.

书写位置: 普通参数 => 缺省参数 => 不定长参数

细节:

如果写实参的时候, 既有: 位置参数, 又有关键字参数, 则: 位置参数 必须在 关键字参数的前边. 但是关键字参数之间是没有顺序要求的, 随便写.

位置参数

要求:

实参 和 形参的 个数, 对应的顺序(位置) 都要相同.

演示
# 1. 定义函数, 打印信息.
def user_info(name, age, gender):  # 形参
    print(f'name: {name}, age: {age}, gender: {gender}')
​
​
# 2. 调用函数, 传递参数.
if __name__ == '__main__':
    # 位置参数 要求: 实参 和 形参 个数, 对应的顺序(位置) 都要相同.
    user_info('张三', 18, '男')  # 实参
    # user_info('张三', 18, '男', '北京')     # 报错, 实参 和 形参个数不同.
    user_info('张三', '男', 18)  # 不报错, 结果不是你要的.
    print('-' * 30)

关键字参数

要求

必须通过 形参名=值 的形式传递实参. 实参 和 形参的个数必须保持一致, 对顺序无要求.

演示
 # 关键字参数 要求: 实参 和 形参 个数要相同, 顺序无所谓.
    user_info(age=32, gender='男', name='乔峰')
    user_info(gender='男', age=32, name='乔峰')
    print('-' * 30)
​
    # 细节: 如果既有位置参数, 又有关键字参数, 则: 位置参数 必须在 关键字参数的前边.
    #          位置参数            关键字参数
    user_info('段誉', gender='男', age=23)
​
    # 报错.  位置参数在前, 关键字参数在后.
    # user_info(gender='男', '段誉', age=23)

缺省(默认)参数

概述

缺省参数也叫 默认参数, 它是作用于 形参列表的, 即: 可以给形参赋一个初始值, 这样用户调用函数的时候,如果没有给这个参数传参, 我们就用 默认值, 如果传参了, 就用给的值.

细节

形参列表中如果有 缺省参数, 则必须放 参数列表的最后.先这么记忆, 不严谨, 因为如果形参既有 普通参数, 又有 缺省参数, 还有 不定长参数,则顺序为: 普通参数 => 缺省参数 => 不定长参数

演示
# 1. 定义函数, user_info(), 用于打印信息.
def user_info(name, age, gender='男'):  # 缺省参数
    print(f'name: {name}, age: {age}, gender: {gender}')
​
​
# 2. 调用函数
if __name__ == '__main__':
    # 实参, 位置参数.
    user_info('张三', 30, '男')
​
    # 实参, 关键字参数
    user_info(name='张三', gender='男', age=30)
​
    # 实参, 位置参数 + 关键字参数
    user_info('阿朱', gender='女', age=25)
    print('-' * 30)
​
    # 测试: 缺省参数, 不传值.
    user_info('段誉', 25)
    # 测试: 缺省参数, 传值.
    user_info(age=23, name='小龙女', gender='女')

不定长参数

概述

它是作用于 形参列表的, 主要有两种写法, 分别是 *args: 可以接收任意多个位置参数, 并封装成: 元组. **kwargs: 可以接收任意多个关键字参数, 并封装成: 字典. keyword arguments

细节
  1. 不定长参数不是必须写成 *args, **kwargs,

    你写成 *a, *b, *c, **a都是可以的, 但是最好做到见名知意.

  2. *args, **kwargs 是不冲突的, 可以在形参中一起使用.

演示
# 需求1: 演示 不定长参数之  接收所有的 位置参数.
def user_info(*args):
    print(type(args))  # <class 'tuple'>
    print(args)  # ('张三', 23, '男')
​
​
# 需求2: 演示 不定长参数之  接收所有的 关键字参数.
def user_info2(**kwargs):
    print(type(kwargs))  # <class 'dict'>
    print(kwargs)  # {'name': '李四', 'age': 24, 'gender': '女'}
​
​
# 需求3: 演示 不定长参数之  接收所有的 位置参数和 关键字参数.
def user_info3(*args, **kwargs):   # 不定长参数
    print(f'args: {args}')      # (10, 20, 30)
    print(f'kwargs: {kwargs}')  # {'name': '李四', 'age': 24, 'gender': '女'}
​
# 需求4: 演示 普通参数 + 缺省参数 + 不定长参数之  接收所有的 位置参数和 关键字参数.
#             普通参数      缺省参数            不定长参数
def user_info4(a, b, c=10, d=20, e='AI30期', *args, **kwargs):   # 不定长参数
    print(f'a: {a}, b: {b}, c: {c}, d: {d}, e: {e}')
    print(f'args: {args}')      # (10, 20, 30)
    print(f'kwargs: {kwargs}')  # {'name': '李四', 'age': 24, 'gender': '女'}
​
​
​
# 测试上述的函数.
if __name__ == '__main__':
    # 传入 位置参数.
    user_info('张三', 23, '男')
    print('-' * 30)
​
    # 传入 关键字参数.
    user_info2(name='李四', age=24, gender='女')
    print('-' * 30)
​
    # 同时传入 位置参数 和 关键字参数
    #               位置参数             关键字参数
    user_info3(10, 20, 30, name='李四', age=24, gender='女')
    print('-' * 30)
​
    #                   位置参数                                      关键字参数
    user_info4(1, 2, 3, 4, 5, 6, 7, 8, 9, name='李四', age=24, gender='女')
    # 上行输出:a: 1, b: 2, c: 3, d: 4, e: 5
    #         args: (6, 7, 8, 9)
    #         kwargs: {'name': '李四', 'age': 24, 'gender': '女'}
    user_info4(1, 2, name='李四', age=24, gender='女')
    # 上行输出:  a: 1, b: 2, c: 10, d: 20, e: AI30期
    #           args: ()
    #           kwargs: {'name': '李四', 'age': 24, 'gender': '女'}

拆包

解释

组包: 把 多个值 => 1个值 的过程.拆包: 从 1个值 => 多个值 的过程.

细节
  1. 拆包针对于 元组, 列表, 字典, 集合, 字符串有效.

  2. 如果针对于 字典拆包, 则只能获取 的数据.

演示
# 1. 演示组包.      多个值 => 1个值
s1 = 'abcdef'
list1 = [1, 2, 3, 4, 5]
tuple1 = (1, 2, 3, 4, 5)
dict1 = {'a': 1, 'b': 2, 'c': 3}
set1 = {1, 2, 3, 4, 5}
​
# 2. 演示拆包.      1个值 => 多个值
# 演示字符串拆包.
# a, b, c, d = s1     # 报错, 变量的个数 和 字符串值的个数 不匹配.
a, b, c, d, e, f = s1
print(a, b, c, d, e, f)
print('-' * 30)
​
# 演示列表拆包.
a, b, c, d, e = list1
print(a, b, c, d, e)
print('-' * 30)
​
# 演示元组拆包.
a, b, c, d, e = tuple1
print(a, b, c, d, e)
print('-' * 30)
​
# 演示集合拆包.
a, b, c, d, e = set1
print(a, b, c, d, e)
print('-' * 30)
​
# 演示字典拆包.
a, b, c = dict1
print(a, b, c)  # 只能获取 键.

引用

可变和不可变图解

引用解释

概述

Python中存储变量是需要占用 内存空间的, 为了更好的管理这些空间, 每块空间都是有自己的地址值的.

格式

id(变量名 或者 变量值) 可以查看变量在内存中的 地址值.

细节

Python中的 = 是 引用传递, 即: 把等号右边的变量(值) 地址值 赋值个 左边的变量.

记忆
  1. 可变类型 和 不可变类型的划分依据:在不改变地址值的情况下, 其元素值是否可以发生改变, 可以 => 可变类型, 不可以 => 不可变类型.

  2. 可变 和 不可变类型划分如下:可变类型: 列表, 字典, 集合不可变类型: 整型, 浮点型, 布尔型, 字符串, 元组

演示
# 需求1: 观察如下的代码, 分析: 内存中到底有几个10.
a = 10
b = a
c = a
​
print(a, b, c)  # 10, 10, 10
​
# 观察 a, b, c的地址值.
print(id(a))    # 140726997170904
print(id(b))    # 140726997170904
print(id(c))    # 140726997170904
print('-' * 30)
​
# 需求2: 演示 不可变类型.    整型
a = 100
print(f'变量a的内容: {a}')       # 100
print(f'变量a的地址: {id(a)}')   # 0x01, 140727005431320
​
# 修改变量 a 的值.
a = 200
print(f'变量a的内容: {a}')       # 200
print(f'变量a的地址: {id(a)}')   # 0x02, 140727005434520
print('-' * 30)
​
# 需求3: 演示 可变类型.    列表.
list1 = [10, 20, 30]
print(f'变量list1的内容: {list1}')       # [10, 20, 30]
print(f'变量list1的地址: {id(list1)}')   # 0x01, 1676154425664
​
# 修改变量 list1 的值.
list1[1] = 200
print(f'变量list1的内容: {list1}')       # [10, 200, 30]
print(f'变量list1的地址: {id(list1)}')   # 0x01, 1676154425664

形参是可变或不可变对实参的影响

结论
  1. 形参是不可变类型, 则: 形参的改变对实参没有任何影响.

  2. 形参是可变类型, 则: 形参的改变 直接影响 实参.

形参的改变为函数内改变全局变量的实参
演示
# 需求1: 形参是 不可变类型.
def change(a):  # a: 形参
    a = 200
​
​
# 需求2: 形参是 可变类型.
def change2(list1):  # list1: 形参
    list1[1] = 200
​
​
# 测试上述的函数.
if __name__ == '__main__':
    # 测试需求1: 形参是 不可变类型.
    a = 100  # int类型, 不可变类型.
    print(f'调用 change 函数前, a = {a}')  # 100
    change(a)  # a: 实参, int类型(不可变类型)
    print(f'调用 change 函数后, a = {a}')  # 100
​
    # 测试需求2: 形参是 可变类型.
    list1 = [1, 2, 3]
    print(f'调用 change 函数前, list1 = {list1}')  # [1, 2, 3]
    change2(list1)  # list1: 实参, list类型(可变类型)
    print(f'调用 change 函数后, list1 = {list1}')  # [1, 200, 3]
形参是不可变类型

形参是可变类型

匿名函数lambda表达式

介绍

概述:

匿名函数指的是 没有名字的函数. 它类似于Java中的 lambda 表达式.

格式:

lambda 形参列表 : 函数体

细节:

匿名函数(也叫Lambda表达式, Lambda函数) 只适用于 简单的业务场景, 即: 函数体只有一行代码, 且有返回值的 这种函数.

应用场景:

匿名函数 可以作为方法的实参进行传递, 可以使得我们的代码更加简洁, 更加灵活.

演示
# 需求1: 求两个整数和.
# 思路1: 普通方式.
def get_sum(a, b):
    return a + b
​
​
# 需求2: 自定义函数 my_calculate(a, b, 功能), 分别计算两个整数的 加减乘除.
def my_calculate(a, b, func):
    """
    自定义函数, 模拟: 计算器, 基于传入的功能, 进行响应的操作.
    :param a: 要操作的第1个整数
    :param b: 要操作的第2个整数
    :param func: 具体的操作逻辑, 即: 函数对象.
    :return: 计算记过
    """
    return func(a, b)
​
​
# 在main函数中, 进行测试.
if __name__ == '__main__':
    # 1.测试自定义函数 get_sum()
    print(get_sum(10, 20))  # 30
​
    # 2.函数名 可以作为 对象传递.
    # sum = get_sum(10, 20)       # 这是在调用函数.
    func = get_sum  # 把 get_sum 这个函数对象 赋值给 变量func, 即: func() 和 get_sum()效果一致.
    print(func(10, 20))  # 30
​
    # 3.对上述的代码做变形, 使用匿名函数.
    my_sum = lambda a, b: a + b  # 它的效果, 等价于 get_sum()函数
    print(my_sum(10, 20))  # 30
    print('-' * 30)
​
    # 4. 匿名函数 作为方法的 实参进行传递.
    print(my_calculate(10, 3, get_sum))  # 求和, 13
    print(my_calculate(10, 3, lambda a, b: a + b))  # 求和, 13
    print(my_calculate(10, 3, lambda a, b: a - b))  # 求差: 7
    print(my_calculate(10, 3, lambda a, b: a * b))  # 求积: 30
    print(my_calculate(10, 3, lambda a, b: a // b)) # 求商: 3
    print(my_calculate(10, 3, lambda a, b: a % b))  # 取余: 3
    print(my_calculate(10, 3, lambda a, b: a ** b)) # 取平方: 1000
    print(my_calculate(10, 3, lambda a, b: max(a, b))) # 取最大值: 10
    print(my_calculate(10, 3, lambda a, b: a if a > b else b)) # 取最大值: 10

进阶案例

列表嵌套排序

# 又例如: sort(key=规则, reverse=True/False)函数, 对元素排序.
# 参1: key 接收的就是1个函数, 即: 排序规则.
# 参2: 是否翻转, True => 反转, 降序,   False => 不反转, 升序(默认)
#          5         6         7
list1 = ['apple', 'orange', 'bananas']
​
# 对 列表元素 排序, 默认排序规则: 字母的顺序, 升序排列.
# list1.sort()     # ['apple', 'bananas', 'orange']
​
# 对 列表元素 排序, 按照 字符串长度 升序排列
# list1.sort(key = lambda word : len(word))
​
# 对 列表元素 排序, 按照 字符串长度 降序排列
# list1.sort(key = lambda word : len(word), reverse=True)
​
# 对 列表元素 排序, 按照 字符串 第2个字母 进行排序.
list1.sort(key = lambda word : word[1])
​
# 打印排序后的内容.
print(list1)
print('-' * 30)

字符串字母排序

# 需求2: 对列表元素, 按照每个元素(元组形式) 的 第2个元素值 进行排序.
list1 = [(3, 2), (2, 5), (5, 1)]
​
# 默认: 按照元组的第1个元素值 进行排序.
# list1.sort()
​
# 按照每个元素(元组形式) 的 第2个元素值 进行排序.
# 方式1: 自定义函数, 实现排序规则.
# def sort_by_second(item):
#     return item[1]
#
# # 具体的排序动作.
# list1.sort(key=sort_by_second)
​
# 方式2: lambda函数实现.
list1.sort(key= lambda item : item[1])
# list1.sort(key= lambda item : item[1], reverse=True)
​
# 扩展: 按照元组的元素和排序.
# list1.sort(key= lambda item : sum(item), reverse=True)
# list1.sort(key= lambda item : item[0] + item[1], reverse=True)
​
print(list1)

标签:10,形参,python,30,list1,day05,入门篇,参数,print
From: https://blog.csdn.net/m0_60916732/article/details/141268254

相关文章

  • Python教程(十五):IO 编程
    目录专栏列表引言基础概念什么是IO?同步IOvs异步IO同步IO(SynchronousIO)异步IO(AsynchronousIO)Python中的IO标准IO标准输入和输出文件IO文件操作的上下文管理器打开文件读取文件操作内存中的数据高级文件操作读写二进制文件使用文件指针网络IO使用`requests`库使用......
  • python自学
    基础语法字面量定义:在代码中,被写下来的值,称之为字面量类型:python中常用的有6种数据类型数字整数(int)浮点数(float)复数(complex),如4+3j布尔(bool):True本质为1,False本质为0字符串(String)字符串需要使用'xxx',"xxx"或者'''xxx'''格式,而三引号中的字符串可以跨行。......
  • python循环语句之while循环和for循环
    文章目录1.while循环1.1介绍1.1.1生活中的循环1.1.2程序中的循环1.2总结2.while循环应用:1~100求和2.1需求2.2分析3.while嵌套循环以及运用3.1while嵌套循环语句的语法格式3.2while嵌套循环使用3.2.1要求3.2.2参考代码4.for循环4.1for循环基本格式4.......
  • python判断语句之if语句、比较和逻辑运算符、if...else...语句、if...elif...else语句
    文章目录1.介绍1.1顺序语句1.2判断语句1.3循环语句2.if语句的基本格式2.1判断语句介绍2.2程序中的判断2.3if语句的基本格式3.比较和逻辑运算符3.1比较运算符3.2逻辑运算符4.if...else...语句4.1if...else...的语法格式4.2实例5.if...elif...else...语......
  • python-flask计算机毕业设计网上办公系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,互联网已成为现代社会不可或缺的基础设施,深刻影响着各行各业的工作模式与效率。在企业管理领域,传统的办公方式逐渐......
  • python-flask计算机毕业设计中医院信息管理系统(程序+开题+论文)
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着中医药事业的蓬勃发展,中医院作为传承与发展中医药文化的重要载体,其日常运营管理的复杂性和高效性需求......
  • 【python学习】为什么你应该放弃标准 JSON 库,转向更智能的 CommentJSON?
    在软件开发中,JSON是不可或缺的数据交换格式。然而,标准的json库并不支持注释,这使得开发者在处理复杂配置文件时感到束手束脚。本文将详细介绍commentjson库,它不仅能解析标准JSON格式,还支持带注释的JSON文件。通过对比commentjson和标准json库的用法及优势,帮助你......
  • 【python学习】深度解析LTP库:用Python轻松搞定中文NLP任务
    在自然语言处理(NLP)领域,处理中文文本一直是一个挑战。而LTP(LanguageTechnologyPlatform)是一个专为中文语言处理而开发的强大工具包,它能够帮助我们高效地完成各种NLP任务,如分词、词性标注、命名实体识别、依存句法分析、语义角色标注等。这篇博客将带你深入了解如何使用LTP......
  • Python合并两个有序链表
    题目合并两个有序链表,如l1=[1,3,4],l2=[1,2,4,5],合并后l3=[1,1,2,3,4,4,5]解决思路需要构建节点Node和链表LinkedList结构如果root节点不确定,可以创建一个哑节点Node(0),作为root节点的前节点,也是初始节点(当前节点)循环当l1当前节点不为None并且l2当前节点不为None时,那个节......
  • 2024.8.15(python管理mysql、Mycat实现读写分离)
    一、python管理mysql1、搭建主mysql[root@mysql57~]#tar-xfmysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [root@mysql57~]#cp-rmysql-5.7.44-linux-glibc2.12-x86_64/usr/local/mysql[root@mysql57~]#rm-rf/etc/my.cnf[root@mysql57~]#mkdir/usr/local/......