Python 函数用法与底层分析

news2024/9/23 22:57:33

      在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了函数调用、传递参数、返回计算结果等内容。

     函数简介函数(function)的基本概念

1:一个程序由一个一个的任务组成;函数就是代表一个任务或者一个功能(function)。

2:函数是代码复用的通用机制

   Python函数的分类

Python函数分为如下几类:

1 内置函数我们前面使用的str()、list()、len()等这些都是内置函数,我们可以拿来直接使用。

2 标准库函数我们可以通过import语句导入库,然后使用其中定义的函数

3 第三方库函数Python社区也提供了很多高质量的库。下载安装这些库后,也是通过import语句导入,然后可以使用这些第三方库的函数

4 用户自定义函数用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。今天我们学习的就是如何自定义函数。

  函数的定义和调用

简单定义一个函数:

def add(a,b,c):
    '''完成三个数的加法,并返回他们的和'''
    sum = a+b+c
    print("{0}、{1}、{2}三个数的和是:{3}".format(a,b,c,sum))
return sum

add(10,20,30)
add(30,40,50)

要点:1:我们使用def来定义函数,然后就是一个空格和函数名称;Python执行def时,会创建一个函数对象,并绑定到函数名变量上。

2:参数列表圆括号内是形式参数列表,有多个参数则使用逗号隔开定义时的形式参数不需要声明类型,也不需要指定函数返回值类型调用时的实际参数必须与形参列表一一对应。

3:return返回值如果函数体中包含return语句,则结束函数执行并返回值;如果函数体中不包含return语句,则返回None值。

4:调用函数之前,必须要先定义函数,即先调用def创建函数对象内置函数对象会自动创建标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句。

形参和实参:

def  printMax(a,b):
   '''实现两个数的比较,并返回较大的值'''
   if a>b:
       print(a,'较大值')
       return a
   else:
       print(b,'较大值')
       return b

printMax(10,20)
printMax(30,5)

上面的printMax函数中,在定义时写的printMax(a,b)。a和b称为“形式参数”,简称“形参”。也就是说,形式参数是在定义函数时使用的。形式参数的命名要符合“标识符”命名规则。在调用函数时,传递的参数称为“实际参数”,简称“实参”。上面代码中,printMax(10,20),10和20就是实际参数。

函数也是对象,内存底层分析

Python中,“一切都是对象”。实际上,执行def定义函数后,系统就创建了相应的函数对象。我们执行如下程序,然后进行解释:

def print_star(n):                
   print("*"*n)

print(print_star)

print(id(print_star))

c = print_star

c(3)

a = 100        #全局变量

def f1():
   global a    #如果要在函数内改变全局变量的值,增加global关键字声明
   print(a)    #打印全局变量a的值
   a = 300      

f1()
f1()
print(a)

参数的传递

   传递可变对象的引用传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。

【操作】参数传递:传递可变对象的引用:

b = [10,20]
def f2(m):
   print("m:",id(m))       #b和m是同一个对象
   m.append(30)            #由于m是可变对象,不创建对象拷贝,直接修改这个对象
f2(b)
print("b:",id(b))
print(b)

为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝和深拷贝”。我们可以使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。

1:浅拷贝:拷贝对象,但不拷贝子对象的内容,只是拷贝子对象的引用。

2:深拷贝:拷贝对象,并且会连子对象的内存也全部(递归)拷贝一份,对子对象的修改不会影响源对象

#测试浅拷贝和深拷贝
import copy
def testCopy():
   '''测试浅拷贝'''
   a = [10, 20, [5, 6]]
   b = copy.copy(a)
   print("a", a)
   print("b", b)
   b.append(30)
   b[2]
.append(7)
   print("浅拷贝......")
   print("a", a)
   print("b", b)
  b.append(30)
   b[2].append(7)
   print("深拷贝......")
   print("a", a)
   print("b", b)
testCopy()
print("*************")
testDeepCopy()

f = lambda a,b,c:a+b+c
print(f)
print(f(2,3,4))
g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](7),g[2](8))

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

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

相关文章

《CUDA编程》1.GPU硬件与CUDA环境搭建

1 GPU 介绍 GPU(graphics processing unit),意为图形处理器,也被称为显卡(graphics card)。GPU的浮点数运算峰值就比同时期的CPU高一个量级;GPU的内存带宽峰值也比同时期的CPU高一个量级。 CP…

【重学 MySQL】三十一、字符串函数

【重学 MySQL】三十一、字符串函数 函数名称用法描述ASCII(S)返回字符串S中的第一个字符的ASCII码值CHAR_LENGTH(s)返回字符串s的字符数,与CHARACTER_LENGTH(s)相同LENGTH(s)返回字符串s的字节数,和字符集有关CONCAT(s1,s2,…,sn)连接s1,s2,…,sn为一个字…

数据加密和数字证书

1 什么是数据加密 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程…

【开源免费】基于SpringBoot+Vue.JS服装商城系统(JAVA毕业设计)

本文项目编号 T 046 ,文末自助获取源码 \color{red}{T046,文末自助获取源码} T046,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

数据结构篇--折半查找【详解】

折半查找也叫做二分查找或者对数查找,是一种在有序数组中查找特定元素的查找算法。 折半查找的算法步骤如下: 将目标关键字key与数组中的中间元素比较,若相等则查找成功。key大于中间元素,就到数组中大于中间元素的部分进行查找&…

c++语法(模板初阶+类和对象部分知识点)

1:泛型编程 2:模板 2.1:函数模板 2.2:类模板 3:const成员函数与非const的区别 4:构造函数之初始化列表 4.1:初始化列表语法及其应用 4.2:explicit关键字 5:static成员变量,static成员函数 1:泛型编程 首先在提出泛型编程前我们先来看一下的代码(关于swap函数)。 void swap…

FPGA随记——VIVADO中ASYNC_REG指令

参考文章:Vivado综合属性系列一、ASYNC_REG_asyncregtrue-CSDN博客 -很棒棒的 跨时钟域设计(CDC)是个老生常谈的问题,其场景很多很杂,其中一个比较为人熟知的就是单bit信号从慢时钟到快时钟所采用的两级寄存器处理的…

抖音矩阵系统源码搭建短视频批量剪辑矩阵分发,可开源或oem

打造多语言短视频平台:技术实施方案揭秘 在短视频矩阵系统技术开发实施方案中,数据库设计是基础环节。首先,需要建立语言包数据库表并填充初始文本数据,如英语和中文的常用语。接着,要设计高效的数据库连接和数据访问接…

erlang学习:Linux命令学习3

shell基本输出 创建一个test.sh文件,并开放他的权限,之后向其中编辑以下内容 touch test.sh chmod 777 test.sh vim test.shecho "hello linux"之后运行相应shell程序得到输出 ./test.sh变量 单引号特点: 单引号里的任何字符都…

【Joint Receiver Design for ISAC】Neyman person | Gaussian | MMSE estimator |

【1】统计信号处理 Neyman-Pearson criterion pp 425 【1】 R c E { g x ( n ) x ( n ) H g H } σ 2 I g g H σ 2 I , \mathbf{R}_c\mathbf{E}\{\mathbf{g}x(n)x(n)^H\mathbf{g}^H\}\sigma^2\mathbf{I}\mathbf{g}\mathbf{g}^H\sigma^2\mathbf{I}, Rc​E{gx(n)x(n)HgH}σ2…

sheng的学习笔记-AI-归纳逻辑程序设计(ILP)

AI目录:sheng的学习笔记-AI目录-CSDN博客 规则学习(rule learning): sheng的学习笔记-AI-规则学习(rule learning)-CSDN博客 一阶规则学习: sheng的学习笔记-AI-FOIL(First-Order Inductive Learner)-CSD…

计算机组成原理(笔记4)

定点加减法运算 补码加法&#xff1a; 补码减法&#xff1a; 求补公式&#xff1a; 溢出的概念 在定点小数机器中,数的表示范围为|&#xff58;|<1。在运算过程中如出现大于1的现象,称为 “溢出”。 上溢&#xff1a;两个正数相加&#xff0c;结果大于机器所能表示的最…

全栈开发(一):springBoot3+mysql初始化

1.开发环境准备 1.开发工具 2.jdk下载 官网下载java17 3.java环境变量配置 用户变量&#xff1a; ①.JAVA_HOME ②.path 4.mysql下载 b站随便搜 5.新建项目 6.maven配置 可以下载zip放到目录里 这里是配置好的 repository文件夹&#xff1a;为maven提供下载的文件存放…

TSRPC+Cocos

TSRPC文档: https://tsrpc.cn/docs/get-started/api.html 创建 先创建一个默认的会话项目&#xff0c;找一个文件夹在控制台运行以下代码&#xff1a; npx create-tsrpc-applatest first-api --presets browser # 或者 yarn create tsrpc-app first-api --presets browser运…

SpringBoot3快速入门(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ SpringBoot是什么 SpringBoot它可以帮我简单&#xff0c;快速地创建一个生产…

Java | Leetcode Java题解之第417题太平洋大西洋水流问题

题目&#xff1a; 题解&#xff1a; class Solution {static int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int[][] heights;int m, n;public List<List<Integer>> pacificAtlantic(int[][] heights) {this.heights heights;this.m heights.length;this.n…

实战19-详情页UI4等分

import { PADDING } from ../../constants/size; import rvp from ../../utils/resposive/rvIndex;Component export default struct SearchFilter {build() {Row() {Row({ space: rvp(6) }) {Text("位置").fontSize(rvp(14)).fontColor(#333333)Image($r(app.media.…

string map练习

to_string 在<string>头文件的std命名空间中 要格式化写浮点型入字符串用 2.map 直接尾插 set,map同方法&#xff0c;map只是把键变为pair键值对 4. string的花括号隐式类型转换不能字母个数字母&#xff0c;会被认为是初始化列表&#xff0c;而不是个数加字母的隐式类…

CSS简明通俗教程

CSS简明通俗教程 1. CSS简介 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种样式表语言。CSS用于描述HTML或XML&#xff08;包括SVG或XHTML等XML方言&#xff09;文档的呈现方式&#xff0c;它有自己的语法规则和逻辑&#xff0c;用于控制网…

【计算机网络】传输层协议TCP

目录 一、重新理解封装和解包二、TCP协议段格式三、确认应答(ACK)机制四、超时重传机制五、连接管理机制六、理解TIME_WAIT状态和CLOSE_WAIT状态七、流量控制八、滑动窗口九、拥塞控制十、延迟应答十一、面向字节流十二、粘包问题 一、重新理解封装和解包 在网络协议栈中&…