Day05 - 内置函数和参数

news2024/9/21 22:57:10

0. 列表 推导式

格式: 列表变量 = [表达式 for 变量 in range(10)]
表达式中需要使用后面的变量
'''
列表推导 式
创建一个具有一百个数字的列表
'''

# c_l = []
# for i in range(100):
#     c_l.append(i)


# 使用列表推导式来完成列表的创建
c_l = [i for i in range(100)]
# c_l = [x for i in range(100)] # 注意,表达的变量使用要和循环中的变量一致

print(c_l)
print(len(c_l))

# 列表推导 式,带条件的
# 实现列表 中所有的值 都 是3的倍数

c_l = [x for x in range(1, 101) if x % 3 == 0]
print(c_l)

# 创建一个列表 ,列表 中的每个元素都 是具有两个值 的元组
# c_l = [(x,x) for x in range(10)]
# c_l = [(x,) for x in range(10)]
c_l = [(x, y) for x in range(10) for y in range(3)]
print(c_l)

1. 组包和拆包

组包: 将多个值同时赋给一个变量时,解释器会进行自动组包操作
拆包: 将一个容器值(元组),里面的多个数据同时赋值多个变量,解释器会进行拆包操作
注意: 拆包要注意被赋值的变量个数和元组中的值个数相同
'''
组包和拆包
'''

# 组包

a = 1, 2, 3, 4, 5
print(a)
print(type(a))

# 拆包
# 注意:拆包时,容器中的元素个数要和变量个数相同
# a1,a2,a3,a4,a5 = a
# a1,a2,a3,a4,a5 = [1,2,3,4,5]
# a1,a2,a3,a4,a5 = 'abcde'
a1, a2, a3, a4, a5 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
print(a1, a2, a3, a4, a5)

2. 函数返回多个值

当在函数中,需要返回多个值的情况下,可以在return 后面直接将多个值写出来
解释器在返回时,会将多个值自动进行组包
'''
函数同时返回多个数据
需求:求一个列表数据中的最大值和最小值
'''


def get_max_min():
    cl = [1, 0, 3, 5, 2, 6, 8, 7, 4, 9]
    # ma = max(cl)
    # mi = min(cl)

    cl.sort()
    ma = cl[len(cl) - 1]
    mi = cl[0]

    print(ma, mi)
    # 解释器在执行代码时,发现return 后成如果有多个值 ,那么就会将这多个值 ,直接组包成一个元组
    # 然后将这个元组返回。
    return ma, mi


ret = get_max_min()
# ret = ma, mi  -> ret = (ma, mi)

print(ret)
print(type(ret))

3. 函数嵌套调用及过程

函数嵌套是指,在一个函数的函数体内,又去调用了另外一个函数
如果函数内调用了另一个函数,那么当前函数会中断执行,跳转到另一个函数位置进行执行,被调用执行结束后,才回到当前函数恢复中断,继续执行
无论函数如何调用: 谁调用函数,被调用函数执行完就返回到谁那去
'''
函数的嵌套调用
嵌套调用是指,在一个被调用的函数体内又调用了另外一个函数
'''


# 定义三个函数
def func_a():
    print('Func A Start...')
    func_b()
    print('Func A Stop...')


def func_b():
    print('Func B Start...')
    func_c()
    print('Func B Stop...')


def func_c():
    print('Func C Start...')
    print('Func C Stop...')


# 执行函数调用
func_a()

在这里插入图片描述

4. 递归函数的调用及过程(了解)

递归调用是一种特殊的嵌套调用
本质就是自己调用自己
'''
函数递归调用
函数在函数体内,又调用 了自己,这种 形式就是递归调用
'''

# def func():
#     print('Func Start..')
#
#     func()
#     print('Func Stop..')
#
#
# func()

# 求阶乘
# 5! = 1 * 2 *3 * 4 * 5

# factorial 阶乘
def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)



print(factorial(3))
# print(factorial(5))

'''
factorial(5) -> 5 * factorial(4)            -> reutrn 5 * 24  -> 120

                -> 4 * factorial(3)         -> return 4 * 6
                
                    -> 3 * factorial(2)     ->  reutrn 3 * 2
                    
                        -> 2 * factorial(1)  -> return 2 * 1
                            
                            -> return 1
'''

s = 1
for i in range(1,6):
    s *= i
    print(s)

5. 变量作用域

全局变量
	是指定义函数外的变量,不属于任何一个函数,这个变量可以在任何函数中使用.
	公共
局部变量
	定义在某个函数中,该变量只在该函数中有效,除该函数外,都不能使用这个变量


当全局变量和局部变量同名时,在函数内使用变量,优先使用局部变量
局部变量优先级高于全局变量
'''
全局变量和局部变量
'''

# 全局变量
num = 100

def func_a():
    # 定义一个局部变量
    a_num = 200
    print(num)
    print(a_num)


def func_b():
    num = 300
    print(num)
    print(num)

# 变量查找规则
# LEGB
# Local -> EnClosed -> Global -> Buildins
# 本地  -> 闭包   -> 全局   -> 内建


func_a()
func_b()

6. 多个函数间利用全局变量共享数据

因为全局变量在使用时,特性是共享,所以可以利用全局变量,实现函数间的数据通信
'''
使用全局变量,共享数据
'''

# 全局变量
num = 0

c_list = []


# 定义一个用来上传数据的函数
def upoad_data():
    # 如果想修改全局变量,需要声明
    global num

    num = 100
    print(num)
    c_list.append(1)


# 定义一个用下载数据的函数
def download_data():
    print(num, c_list)


# 测试
download_data()
upoad_data()
download_data()

7. 默认值参数

在定义函数时,函数中的形式参数,被赋值,这个值就是默认值
当在函数调用时,如果给定了值,那么就使用给定值,如果没有给定值,那就使用默认值

注意:
	默认值参数只能出现在参数列表的最右侧
'''
函数的默认值 参数
'''


def show(a=0, b=0):
    print(f'a:{a},b:{b}')
    print(a + b)


show()
show(1)
show(1, 2)


# 使用默认值 参数时,需要注意:
# 在默认值 参数的右侧,不能再出现没有默认值 参数


def display(a, b=0, c=0):
    print(a, b, c)


display(1)
display(1, 2)

8. 位置参数

实参
使用位置参数时,因为类型的原因,那么实参的顺序要和形参的顺序完全一致
当没有默认值的情况下,参数的个数和也要一致
# 位置参数
def show(n, s):
    for c in s:
        print(f'{n} -- {c}')


# show(1,'hello')

# show('hello',1)

# show(1)

在这里插入图片描述

9. 关键字参数

形参
在定义形式参时,每个参数都可以理解成一个key
使用这个key,可以明确的为当前这个参数进行赋值
使用关键字参数,可以忽略参数的顺序问题
# 关键字参数
# 关键参数解决了参数在传递时的顺序问题 ,可以无序传递

show(s='hello', n=1)
show(n=1, s='world')

10. 不定长位置参数

*args  在参数中定义了该形参后,那可以通过 *args 接收多个不确定个数的位置参数
'''
不定长位置参数
'''


def my_sum(*args):
    print(args)
    s = 0
    for i in args:
        s += i
    print(s)


my_sum(1, 2)
my_sum(1, 2, 3)
my_sum(1, 2, 3, 4)
my_sum(1, 2, 3, 4, 5)

11. 不定长关键字参数

**kwargs  在参数中定义了该形参后,那可以通过 **kwargs 接收多个不确定个数的关键字参数
'''
不定长关键字参数
'''


def show(**kwargs):
    print(kwargs)


show(a=1)
show(a=1, b=2)
show(a=1, b=2, c=3)


# 定义一个可以接收任何参数的函数
def display(*args, **kwargs):
    print(f'args:{args}')
    print(f'kwargs:{kwargs}')


display()
display(1, 2, 3)
display(a=1, b=2)
display(1, 2, 3, 4, a=1, b=2)
# display(a=1,b=2,2,3,4)
重点:
记住这种函数定义格式:当定义函数时,如果函数的参数想接收任意类型和个数,那么定义格式如下:

def 函数名(*args, **kwargs):
	函数体内容

在这里插入图片描述

12. 混合参数(了解)

如果很多个值都是不定长参数,那么这种情况下,可以将缺省参数放到 *args的后面, 但如果有**kwargs的话,**kwargs必须是最后的

def func(a,b,c,d,e, *args,f=1,g=2,**kwargs):
	函数体代码
'''
混合参数的写法
'''


def func(a, b, c, d, e, *args, f=1, g=2, **kwargs):
    print(a, b, c, d, e)
    print(args)
    print(f, g)
    print(kwargs)


func(1, 2, 3, 4, 5)
func(1, 2, 3, 4, 5, 5, 6, 7, 8, 9)
func(1, 2, 3, 4, 5, 5, 6, 7, 8, 9, f=11, g=22)
func(1, 2, 3, 4, 5, 5, 6, 7, 8, 9, f=11, g=22, h=333, i=444)

在这里插入图片描述

13. 可变参数二次传递(重点理解)

'''
可变参数的的二次传递
'''


def show(a, *args, **kwargs):
    print(a)
    print(args)
    print(*args)
    display(*args)  # *arsg 手动解包


def display(a, b, c, d):
    print(a, b, c, d)


show(1, 2, 3, 4, 5)

在这里插入图片描述
在这里插入图片描述

14. 引用概念

引用就是数据在内存中分配的存储空间的地址
id()可以得到数据在内存中的地址
通过引用,可以方便的在函数之间进行数据传递,实现函数间的数据通信
在这里插入图片描述

'''
引用的概念
'''

# 引用就是数据在内存中存储时的内存编号

# 通过  id() 函数可以得到数据在内存中的地址

print(id(1))
print(id(1))
print(id(1))

a = 1
print(id(1))
print(id(a))

b = a
print(id(1))
print(id(a))
print(id(b))
print('*' * 20)

a = 2
print(id(1))
print(id(2))
print(id(a))
print(id(b))

15. 数字类型和字符串类型数据的缓存区(了解)

为了在程序中使用数据时,效率更高,ptyhon解释会在程序加载后,产生一个缓存区,缓存区中存放是常用的数据
数字: -5 ~ 255
字符串: 长度为小于20的字符串

16. 可变类型和不可变类型

不可变类型:
	数字 int
	字符串 str
	浮点数 float
	布尔类型 bool
	元组  tuple

	特点: 这些数据都是不可以直接修改的,如果在修改或赋值时,都会开辟一个新空间

可变类型:
	列表 list
	字典 dict
	集合 set

	特点: 这个些数据类型,是可以直接在原对象上进行修改数据,修改完成后,并不影响原对象地址
'''
可变对象的修改
'''

c_l = []

print(id(c_l))

c_l.append(1)
print(id(c_l))

在这里插入图片描述

17. 函数版学生管理系统

这个程序要理解记住的是逻辑,而不是代码
'''
学生管理系统


程序 分析:
    1. 学生怎么表示
    2. 学生可能使用 学号 id  ,姓名  name, 年龄 age ,可以使用一个字典来表示每一个学生
    3. 应该有一个容器去保存所有的学生字典 ,可以使用列表实现
    4. 应该有一个主控函数
    5. 菜单函数
    5-1. 选择功能的函数
    6. 添加学生函数
    7. 修改学生函数
    8. 查找学生函数
    9. 删除学生函数
    10.显示所有学生的函数
    11. 因为创建 学生和修改学生,都需要从键 盘输入 数据,那么输入 数据这个功能 就可以提取出一个函数,返回输入的数据
    12. 添加 一个功能 函数,用来显示每个学生的信息

'''

# 定义一个学生的列表,用来保存来管理学生

students = []


# 主控制函数
def main():
    # 通过 死循环控制程序可以重复运行
    while True:
        # 显示菜单
        show_menu()
        # 键盘输入选择一个功能
        select_id = input('请输入一个功能 ID:')
        # 根据输入调用相应的功能 函数
        operator(select_id)


# 菜单函数实现
def show_menu():
    print("---------------------------")
    print("      学生管理系统 V1.0")
    print(" 1:添加学生")
    print(" 2:删除学生")
    print(" 3:修改学生")
    print(" 4:查询学生")
    print(" 5:显示所有学生")
    print(" 6:退出系统")
    print("---------------------------")


# 功能 选择函数,
# 参数是传递的用来选择的功能 id
def operator(select_id):
    if select_id == '1':
        add_stu()
    elif select_id == '2':
        del_id = input('请输入一个要删除的学生ID:')
        del_stu(del_id)
    elif select_id == '3':
        modify_id = input('请输入一个要修改的学生ID:')
        modify_stu(modify_id)
    elif select_id == '4':
        query_id = input('请输入一个要查询的学生ID:')
        search_stu_with_id(query_id)
    elif select_id == '5':
        show_all_info()
    elif select_id == '6':
        # break  # 因为选择功能没有在循环中,所以不能break
        # return  # 作用同上,函数返回后,返回到调用处,返回到主控函数中的死循环中,所以程序还是不能结束
        exit(0)  # 程序通过 exit() 方法,可以直接结束程序
    else:
        print('输入的ID错误 ,请重新输入')


# 实现一个输入函数
# 用来从键盘获取学生信息,并返回
def input_stu_info():
    # 保存输入的学生信息
    stu_id = input("请输入学号:")
    stu_name = input('请输入姓名:')
    stu_age = input('请输入年龄:')
    # 同时返回多个数据时,会组包成一个元组
    return stu_id, stu_name, stu_age


# 实现 添加函数
def add_stu():
    # 主体思路 就是向列表 中添加 一个字典
    # 创建一个学生字典 ,空的
    stu = {}
    # 调用 输入函数,获取学生信息
    stu_info = input_stu_info()

    # 利用获取的信息为字典添加数据
    stu['id'] = stu_info[0]
    stu['name'] = stu_info[1]
    stu['age'] = stu_info[2]

    # 将字典加到列表中
    students.append(stu)

    print(students)


# 实现学生查找的功能
# 返回被找到的学生

def search_stu_with_id(stu_id):
    # 遍历每个学生
    for stu in students:
        # 判断学生是否是查找的人
        if stu['id'] == stu_id:
            # 找到返回该 学生
            show_stu_info(stu)
            return stu

    # 返回没找到
    else:
        print(f'学号为{stu_id}的学生不存在')
        return None


# 实现一个用来显示 单个学生信息的函数
def show_stu_info(stu):
    print(f"学号:{stu['id']} 姓名:{stu['name']} 年龄:{stu['age']}")


# 实现删除学生的函数
def del_stu(del_id):
    # 找到要删除的学生
    stu = search_stu_with_id(del_id)
    # 从列表中删除
    if stu != None:
        students.remove(stu)


# 实现 修改学生的函数
def modify_stu(modify_id):
    # 查找学生
    stu = search_stu_with_id(modify_id)
    # 如果找到就修改
    if stu != None:
        # 先去调用 输入 函数获取数据
        stu_info = input_stu_info()

        # 利用获取的信息为字典添加数据
        stu['id'] = stu_info[0]
        stu['name'] = stu_info[1]
        stu['age'] = stu_info[2]


# 显示所有学生信息
def show_all_info():
    # 遍历打印
    for stu in students:
        show_stu_info(stu)


# 执行主控函数,运行程序
main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS Ventura 13.2 (22D49) 正式版发布,ISO、IPSW、PKG 下载

macOS Ventura 13 正式版现已发布! 请访问原文链接:https://sysin.org/blog/macOS-Ventura/,查看最新版。原创作品,转载请保留出处。 2023 年 1 月 23 日(北京时间 24 日凌晨),macOS Ventura 1…

新年快乐—数睿通2.0数据中台全新功能模块发布

文章目录引言数据集成数据库管理文件管理数据接入贴源数据数据开发数据生产sql 作业开发FlinkSql 作业开发调度中心运维中心资源中心配置中心其他模块结语引言 离上次发文已经有接近三个月了,这三个月主要在开发数睿通的数据生产模块,同时优化了一下数据…

网络实验之EIGRP协议

一、EIGRP协议简介 EIGRP:Enhanced Interior Gateway Routing Protocol 即 增强内部网关路由协议。也翻译为 加强型内部网关路由协议。 EIGRP是Cisco公司的私有协议(2013年已经公有化)。 EIGRP结合了链路状态和距离矢量型路由选择协议的Cisco专用协议&am…

【LeetCode】二叉树的序列化与反序列化 [H](二叉树)

297. 二叉树的序列化与反序列化 - 力扣(LeetCode) 一、题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采…

【SpringCloud】Nacos注册中心、配置中心用法与原理(下)

【SpringCloud】Nacos注册中心、配置中心用法与原理(下) 上集回顾 二、Nacos 配置中心 1. 统一配置管理 (1)在 Nacos 中添加配置文件 (2)从微服务拉取配置 2. 配置热更新 方式一:使用 Re…

华为鸿蒙2.0如何安装谷歌服务框架

第一步: 如果安装过Google套件需要先卸载原有Google套件,设置-应用和服务-应用管理,搜索Google、谷歌等,原有谷歌套件全部卸载掉。(注意,要点击右上角打开“显示系统应用”,未安装过可以直接略过) 第二步:下载鸿蒙文件包(自行找资源下载) 1.打开(1.准备)把里面的…

项目2:使用Yolov5和deepsort实现车辆和行人目标跟踪,实时计算目标运动速度和加速度(有检测超速功能)

项目演示视频 项目演示视频可以跳转到哔哩哔哩观看:https://www.bilibili.com/video/BV1RT411Z7kD/?vd_source805c57038e291405fe38f3adefa0f2d2 项目简介 本项目使用Yolov5DeepSort实现车辆、行人跟踪,并实时统计各类别目标数量,以及测量…

人大金仓数据库的库、模式、表空间之间的关系

库、模式、表空间之间的关系 KES数据库结构图 列出集簇现有的数据库清单 \l 默认数据库的作用介绍 数据库定义以及相关操作 创建数据库并设置参数 设置属主、编码、参照模板template0、连接数为0 create database 数据库名 owner 属主用户名 template template0 encoding …

【二叉搜索树】BST相关题目

BST相关题目二叉搜索树中的众树二叉搜索树节点最小距离两数之和 IV - 输入二叉搜索树总结二叉搜索树中的众树 501.二叉搜索树中的众树 解题思路:中序遍历二叉搜索树,使得结果集是有序的,过程中将众数个数保存下来。利用两个变量&#xff0c…

Java---微服务---SpringCloud(2)

SpringCloud021.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置1.2.配置热更新1.2.1.方式一1.2.2.方式二1.3.配置共享1)添加一个环境共享配置2)在user-service中读取共享配置3)运行两个UserApplication&am…

域环境搭建

内网渗透基础——域环境搭建 第一步,配置IP地址 1.打开网络和共享中心 2.更改适配器设置 3.进入网络连接后,设置网卡属性 4.双击进入,修改IP地址 5.使用IP地址如下,IP地址设置为:192.168.1.1;子网掩码设置为:255.255.255.0;DNS属性设置为:192.168.1.1 6.设置好之后确…

Fisco Bcos区块链一(搭建单群组FISCO BCOS联盟链)

文章目录区块链开荒技术文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html推荐准备:1. 搭建单群组FISCO BCOS联盟链安装依赖创建操作目录, 下载安装脚本搭建单群组4节点联盟链启动FISCO BCOS链检查进程检查日志输出区块链开…

我的第一次真实对国外某购物平台web漏洞挖掘

(真实世界)我的第一次真实对国外某购物平台web漏洞挖掘 开放重定向 - 低危XSS - 低危 这两组合起来就完全不一样一点的,个人觉得比原本高一些 危害:窃取用户敏感数据、用户cookie、钓鱼操作 等… 前言 这是我第一次&#xff…

【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据

我的主页: 技术邻:小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩:小铭的ABAQUS学习的个人空间csdn:qgm1702 博客园文章链接: 【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据 -…

VBA 自定义Add-in

1. 通过下面的链接下载工具:OfficeCustomUIEditorFiles VBA Ribbon - Microsoft Download 2.将上面下载的ZIP文件解压缩后,运行其中的 “CustomUIEditor.exe”, 打开事先准备好的.xlsm文件,例如:self.xlsm。 2-1.点…

Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

Ubuntu20.04MAVROSPX4Gazebo安装PX4步骤安装MAVROS安装QGCPX4仿真安装PX4步骤 从github上clone源码 git clone https://github.com/PX4/PX4-Autopilot.git --recursive进入PX4-Autopilot文件夹,继续下载未下载完的组件 cd PX4-Autopilot/ git submodule update -…

什么是数据库连接池?Druid(德鲁伊)连接池的使用详细解读

文章目录1. 数据库连接池2. 概念3. 实现4. Druid 连接池的使用5. 总结Java编程基础教程系列1. 数据库连接池 2. 概念 前面在 JDBC API 的使用详细解读文章中,获取的数据库连接对象 conn,在使用时创建,使用完毕就会将其销毁。这样重复创建和销…

Python if else对缩进的要求

Python 是以缩进来标记代码块的,代码块一定要有缩进,没有缩进的不是代码块。另外,同一个代码块的缩进量要相同,缩进量不同的不属于同一个代码块。不要忘记缩进if、elif 和 else 后面的代码块一定要缩进,而且缩进量要大…

【奇妙的数据结构世界】 用经典例题对数组进行全面分析 | C++

第八章 数组 目录 第八章 数组 ●前言 ●一、数组是什么? 1.简要介绍 2.具体情况 ●二、数组典型例题——一维&二维&三维 1.一维数组(校门外的树) 2.二维数组(彩票摇奖) 3.三维数组&#xff08…

自己动手写一个操作系统——MBR(1)

文章目录前言MBR1) 512 字节镜像2) 0x55 和 0xAAqemu 运行参考前言 上篇《自己动手写一个操作系统——我们能做什么,我们需要做什么》我们介绍到 BIOS 会遍历每个磁盘的第一个扇区查找 MBR,找到后便将 MBR 加载到内存并跳转过去。如果没找到&#xff0c…