Python的函数(补充浅拷贝和深拷贝)

news2024/12/26 23:16:36

一、定义

函数的定义:实现【特定功能】的代码块。

形参:函数定义时的参数,没有实际意义

实参:函数调用/使用时的参数,有实际意义

函数的作用:

    1. 简化代码
    2. 提高代码重用性
    3. 便于维护和修改
    4. 提高代码的可扩展性

函数的三要素:

    1. 功能 len() max() sum()
    2. 参数 s.clear() s.append('abc')
    3. 返回值 s.sort() s1 = sorted(s)

函数定义的语法格式:

函数的分类:

    1. 从定义角度—— 内置函数【别人写好的,你直接用】 自定义函数
    2. 从参数角度——无参函数 有参函数
    3. 从返回值角度——无返函数 None 有返函数

函数的调用/使用:

    1. 无返函数 函数名()
    2. 有返函数 方法1:print(函数名())
    3. 方法2:变量名 = 函数名()
def my_fun():
    print("这是我的函数")

print(my_fun)
# 输出结果是   <function my_fun at 0x000002AA6DF7A3E0>
# 说明函数名是一个内存地址

# 无返函数直接调用
my_fun()

def you_fun():
    return 100

# 有返函数,输出调用
print(you_fun())

# 有返函数,使用变量接收调用
ret = you_fun()
print(ret)

二、函数的参数传递

函数在进行参数传递的时候,分为:位置参数、关键字参数、默认参数、位置不定长参数、关键字不定长参数。

位置参数:

传递参数时应该 和 定义时的参数 保持位置和数量一 一对应。

def fun(a, b, c):
    print(a, b, c)

# fun()
# TypeError: fun() missing 3 required positional arguments: 'a', 'b', and 'c'

fun(1, 2, 3)
#运行结果 1 2 3
fun('张三', 18, '男')
#运行结果 张三 18 男
fun([1,2,3], (4,5,6), {7,8,9})
# 运行结果 [1, 2, 3] (4, 5, 6) {8, 9, 7}

 关键字参数

调用函数传递参数时,按照 参数名=值 的方式,传参的顺序可以和定义参数的顺序不一致。

def fun(name, age, sex):
    print(name, age, sex)

# 关键字参数
fun(name='张三', age=18, sex='男')
fun(age=18, sex='男', name='张三')

默认参数:

在函数定义时给参数设置默认值,那么在函数调用时,若不传参就是用默认值,若传参就是用传参的值。

def fun(name='张三', age=18, sex='男'):
    print(name, age, sex)

# 默认参数
fun()
fun('李四')
fun(age=66)
fun('小明', 30)
fun('小华', 23, '女')

位置不定长参数:

在定义函数时参数名前加 * ,也就是def fun( *args ),那么在传参的时候就可以传若干个位置参数。

将参数打包成——元组。

def fun(*num):
    print(num)
fun(1)
fun(1,2)
fun(1,2,3,4,5,6)

# 问:在一个函数中,位置不定长参数,可以有两个吗?
# 不允许
# 再问:一旦定义了位置不定参参数,是不是就不可以定义其他参数了呢?
# 答:可以定义,但是传参时必须是关键字参数

关键字不定长参数:

在定义函数参数名前加 ** ,也就是 def fun( **kwargs ),那么传参的时候就可以传若干个 关键字参数。

将参数打包成——字典。

def fun(**kwargs):
    print(kwargs)

fun(a=12, b=13, c=15)
fun(姓名='张三', 年龄=18, 性别='男')

 三、函数的返回值

  1. 如果函数的运行结果想在函数外使用,就需要设置返回值。
  2. 使用关键字 return 进行返回。
  3. return 可以在函数中出现多次,但是只执行 1 次,遇见return返回值并结束函数。
  4. 与C语言不同,python中的return可以返回一个值或多个值,这个时候将返回的多个值到打包成一个元组。
def fun(*num):
    my_sum = 0
    for i in num:
        my_sum += i
    return my_sum

ret = fun(3,7,2,9,8)
print(ret, type(ret))

 四、递归函数

递归函数有三要素:

  1. 边界条件/基线条件 跳出/结束递归的条件
  2. 递归返回段 满足结束条件时,返回
  3. 递归前进段 不满足结束条件时,前进/继续递归
def rec(n):
    """
    求一个数n的阶乘
    :param n: 接收到一个整型值
    :return: 计算的阶乘结果
    """
    if n==1:
        return 1
    else:
        return n * rec(n-1)

n = 5
print(rec(n))

五、函数中变量的作用域

变量的作用域:是指变量能起作用的范围,根据作用范围大小不同分为全局变量和局部变量。

  1. 全局变量:定义在函数外,作用范围是整个程序,程序结束时全局变量声明周期结束。
  2. 局部变量:定义在函数代码块里或者函数的参数里,作用范围是整个函数,函数执行结束时局部变量生命周期结束。

六、函数嵌套

函数嵌套:在一个函数的内部 还嵌套定义了 另外一个函数。

外部的我们称之为 外函数,内部的我们称之为 内函数。

x = 100
def out_fun():
    # global x
    x = 200
    def in_fun():
        # global x
        x = 300
        print(f"内函数中输出{x}")
    in_fun()
    print(f"外函数中输出{x}")

out_fun()
print(f"函数外输出{x}")

七、闭包函数

什么是闭包函数?——如果内函数中使用了外函数的局部变量,并且外函数把内函数返回的过程就叫闭包。

形成闭包的条件:

  1. 函数嵌套
  2. 将内函数作为返回值返回
  3. 内函数必须使用外函数的局部变量
def out():
    x=200
    def in1():
        return x+100
    return in1
print(out()())

八、拷贝

 使用深拷贝时,需要引入copy

使用浅拷贝时,可直接使用copy()

l1 = [1, 2, 3, ['a', 'b', 'c']]
# 浅拷贝
l2 = l1.copy()
# 深拷贝
import copy
l3 = copy.deepcopy(l1)
print("修改前")
print(l1)
print(l2)
print(l3)
# 修改值
l1[0] = 66
l2[1] = 88
l3[2] = 99
print("修改值后")
print(l1)
print(l2)
print(l3)
# 修改可变对象
l1[3][0] = 'hqyj'
l2[3][1] = 'hello'
l3[3][2] = 'xxxx'
print("修改可变对象后")
print(l1)
print(l2)
print(l3)

浅拷贝

浅拷贝:将原列表的值复制一份,同时引用而不复制原列表的【可变对象】,原列表修改值,新列表值不变;

原列表修改可变对象,新列表可变对象也变

深拷贝

深拷贝:将原列表直接复制一份,生成一个新对象[列表],和原列表的内存地址不一样,原列表修改,新列表不变

实际过程中,浅拷贝使用多,因为深拷贝完全复制一个新对象会存在资源浪费。

九、Python函数练习

Python函数练习-CSDN博客

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

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

相关文章

el-input 正则表达式校验输入框不能输入汉字

<el-form :model"data1" :rules"rules" ref"ruleForm" label-width"210px" class"demo-ruleForm"><el-form-item label"锯路&#xff1a;" prop"sawKref"><el-input class"inptWid…

嵌入式linux系统中I2C控制实现AP3216C传感器方法

大家好,今天主要给大家分享一下,如何使用linux系统里面的I2C进行控制实现。 第一:Linux系统中I2C简介 Linux 内核开发者为了让驱动开发工程师在内核中方便的添加自己的 I2C 设备驱动程序,更容易的在 linux 下驱动自己的 I2C 接口硬件,进而引入了 I2C 总线框架。与 Linux 下…

OceanBase 应用实践:如何处理数据空洞,降低存储空间

问题描述 某保险行业客户的核心系统&#xff0c;从Oracle 迁移到OceanBase之后&#xff0c;发现数据存储空间出现膨胀问题&#xff0c;数据空间 datasize9857715.48M&#xff0c;实际存储占用空间17790702.00M。根据 required_mb - data_mb 值判断&#xff0c;数据空洞较为严重…

【flask开启进程,前端内容图片化并转pdf-会议签到补充】

flask开启进程,前端内容图片化并转pdf-会议签到补充 flask及flask-socketio开启threading页面内容转图片转pdf流程前端主js代码内容转图片-browser端browser端的同步编程flask的主要功能route,def 总结 用到了pdf,来回数据转发和合成,担心flask卡顿,响应差,于是刚好看到threadi…

QT栅格布局的妙用

当groupBox中只有一个控件时&#xff0c;我们想要它满格显示可以对groupBox使用栅格布局

MyBatis快速入门(上)

MyBatis快速入门&#xff08;上&#xff09; 一、MyBatis 简介1、概述2、JDBC、Hibernate、MyBatis 对比 二、MyBatis 框架搭建1、开发环境2、创建maven工程3、创建MyBatis的核心配置文件4、创建mapper接口5、创建MyBatis的映射文件6、通过junit测试功能7、加入log4j2日志功能 …

在Pybullet中加载Cinema4D创建的物体

首先明确我们的目标&#xff0c;是希望在cinema4D中创建自己想要的模型&#xff0c;并生成.obj文件&#xff0c;然后在pybullet中加载.obj文件作为静态物体&#xff0c;可以用于抓取物体&#xff0c;避障物体。&#xff08;本文提到的方法只能实现静态物体的建模&#xff0c;如…

第十三届交通运输研究(上海)论坛┆智能网联汽车技术现状与研究实践

0.简介 交通运输研究&#xff08;上海&#xff09;论坛&#xff08;简称为TRF&#xff09;是按照国际会议的组织原则&#xff0c;为综合交通运输领域学者们构建的良好合作交流平台。交通运输研究&#xff08;上海&#xff09;论坛已经成功举办了十二届&#xff0c;凝聚了全国百…

Pr:视频过渡快速参考(合集 · 2025版)

Adobe Premiere Pro 自带七组约四十多个视频过渡 Video Transitions效果&#xff0c;包含不同风格和用途&#xff0c;可在两个剪辑之间创造平滑、自然的转场&#xff0c;用来丰富时间、地点或情绪的变化。恰当地应用过渡可让观众更好地理解故事或人物。 提示&#xff1a; 点击下…

stm32 踩坑笔记

串口问题&#xff1a; 问题&#xff1a;会改变接收缓冲的下一个字节 串口的初始化如下&#xff0c;位长度选择了9位。因为要奇偶校验&#xff0c;要选择9位。但是接收有用数据只用到1个字节。 问题原因&#xff1a; 所以串口接收时会把下一个数据更改

昇思大模型平台打卡体验活动:项目4基于MindSpore实现Roberta模型Prompt Tuning

基于MindNLP的Roberta模型Prompt Tuning 本文档介绍了如何基于MindNLP进行Roberta模型的Prompt Tuning&#xff0c;主要用于GLUE基准数据集的微调。本文提供了完整的代码示例以及详细的步骤说明&#xff0c;便于理解和复现实验。 环境配置 在运行此代码前&#xff0c;请确保…

后悔没早点知道,Coze 插件 + Cursor 原来可以这样赚钱

最近智能体定制化赛道异常火爆。 打开闲鱼搜索"Coze 定制",密密麻麻的服务报价直接刷屏,即使表明看起来几十块的商家,一细聊,都是几百到上千不等的报价。 有趣的是,这些智能体定制化服务背后,最核心的不只是工作流设计,还有一个被很多人忽视的重要角色 —— …

基于STM32的节能型路灯控制系统设计

引言 本项目基于STM32微控制器设计了一个智能节能型路灯控制系统&#xff0c;通过集成多个传感器模块和控制设备&#xff0c;实现对路灯的自动调节。该系统能够根据周围环境光照强度、车辆和行人活动等情况&#xff0c;自动控制路灯的开关及亮度调节&#xff0c;从而有效减少能…

Qml 模型-视图-代理(贰)之 动态视图学习

目录 动态视图 动态视图用法 ⽅向&#xff08;Orientation&#xff09; 键盘导航和⾼亮 页眉与页脚 网格视图 动态视图 动态视图用法 Repeater 元素适合有限的静态数据&#xff0c; QtQuick 提供了 ListView 和 GridView, 这两个都是基于 Flickable(可滑动) 区域的元素…

新标准大学英语综合教程1课后习题答案PDF第三版

《新标准大学英语&#xff08;第三版&#xff09;综合教程1 》是“新标准大学英语&#xff08;第三版&#xff09;”系列教材之一。本书共包含6个单元&#xff0c;从难度和话题上贴近大一上学生的认知和语言水平&#xff0c;包括与学生个人生活领域和社会文化等相关内容&#x…

Python闭包|你应该知道的常见用例(下)

引言 在 Python 编程语言中&#xff0c;闭包通常指的是一个嵌套函数&#xff0c;即在一个函数内部定义的另一个函数。这个嵌套的函数能够访问并保留其外部函数作用域中的变量。这种结构就构成了一个闭包。 闭包在函数式编程语言中非常普遍。在 Python 中&#xff0c;闭包特别有…

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本 Shell脚本源码地址&#xff1a; Gitee&#xff1a;https://gitee.com/raymond9/shell Github&#xff1a;https://github.com/raymond999999/shell脚本可以去上面的Gitee或Github代码仓库拉取。 支持的功能和系统&am…

AUTOSAR OS模块详解(一) 概述

AUTOSAR OS模块详解(一) 概述 本文主要介绍AUTOSAR架构下的OS概述。 文章目录 AUTOSAR OS模块详解(一) 概述1 前言1.1 操作系统1.2 嵌入式操作系统1.3 AUTOSAR操作系统 2 AUTOSAR OS2.1 AUTOSAR OS组成2.2 AUTOSAR OS类别2.3 任务管理2.4 调度表2.5 资源管理2.6 多核特性2.7 …

5位机械工程师如何共享一台工作站的算力?

在现代化的工程领域中&#xff0c;算力已成为推动创新与技术进步的关键因素之一。对于机械工程师而言&#xff0c;强大的计算资源意味着能够更快地进行复杂设计、模拟分析以及优化工作&#xff0c;从而明显提升工作效率与项目质量。然而&#xff0c;资源总是有限的&#xff0c;…

Scala 中 set 的实战应用 :图书管理系统

1. 创建书籍集合 首先&#xff0c;我们创建一个可变的书籍集合&#xff0c;用于存储图书馆中的书籍信息。在Scala中&#xff0c;mutable.Set可以用来创建一个可变的集合。 val books mutable.Set("朝花惜拾", "活着") 2. 添加书籍 我们可以使用操作符…