【Python 自定义函数】

函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但我们可以根据需求创建函数,即用户自定义函数。

一、定义函数的规则

  1. 以def a关键词开头,后接函数标识符名称和圆括号()
  2. 任何传入参数和自变量必须放在圆括号内,圆括号内可以用于定义参数。
  3. 函数第一行可以选择性使用字符串用于放函数功能说明。 函数内用以冒号:起始,且缩进。
  4. return[表达式]技术函数,选择性地返回一个值给调用方。不带return返回None

1 基本语法

(1)函数调用

def functionname( parameters ):"函数_文档字符串"function_suitereturn [expression]

示例:

#定义函数
def red(name):"打印传入的字符串到标准显示设备上"print("hello,",name)return(name)
#调用函数
red("大山很山")

运行结果:

hello, 大山很山

(2)函数返回 return语句

return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。

def sum(arg1, arg2):# 返回2个参数的和."total = arg1 * arg2return total# 调用sum函数
total = sum(2, 30)
print("函数 : ", total)

结果如下:

函数 :  60

二、参数说明

Python函数可以有任意数量的参数,也可以没有参数。它们还可以返回值。
示例如下:

# 定义一个函数,计算两个数的和
def add_numbers(a, b):return a * b# 调用函数并存储返回值
result = add_numbers(3, 5)
# 打印结果
print(result)  # 输出:15

1、重要概念:可变对象和不可变对象

在Python中,对象根据其是否可以改变其内容被分为不可变对象(immutable objects)和可变对象(mutable objects)。这两种类型的对象在处理上有一些重要的区别,特别是在赋值、函数参数传递以及作为字典的键等方面。

类型属于对象,变量是没有类型的。

#举例说明
a = [1,2,3]
a = "hello"其中[1,2,3]list类型,"hello"是String类型。变量a 是没有类型的,它仅是一个对象的引用(一个指针),可以指向list类型,也可指向string类型

(1)不可变对象

不可变对象在创建后其内容就不能被改变。常见的不可变对象类型包括:

  • 整型(int)
  • 浮点型(float)
  • 复数(complex)
  • 字符串(string)
  • 元组(tuple)
  • frozenset(冻结集合)

例如,字符串是一个典型的不可变对象。一旦你创建了一个字符串,你不能改变它内部的字符。如果你尝试改变它,Python实际上会创建一个新的字符串对象。

#示例1
s = "hello"  
s[0] = 'H'  # 这会引发TypeError,因为字符串是不可变的
#示例2:
def ChangeInt(a):a = 5print("函数内的值:",a)  # 结果是 5b = 3
#调用自定义的函数
ChangeInt(b)
print("函数内的值:",b)   # 结果是 3

运行结果:

函数内的值: 5
函数内的值: 3

(2)可变对象
可变对象在创建后其内容可以被改变。常见的可变对象类型包括:

  • 列表(list)
  • 字典(dict)
  • 集合(set)

列表是一个典型的可变对象。你可以添加、删除或修改列表中的元素。

#示例1:
lst = [1, 2, 3]
lst[0] = 0  # 可以修改列表中的元素
lst.append(4)  # 可以添加新的元素
print(lst)  #输出[0, 2, 3, 4]
#示例2:
def changeme(mylist):"修改传入的列表"mylist.append([1, 2, 3, 4])print("函数内的值: ", mylist)return# 调用changeme函数
mylist = [1, 1, 1]
changeme(mylist)
print("函数外的值: ", mylist)

运行结果如下:

函数内的值:  [1, 1, 1, [1, 2, 3, 4]]
函数外的值:  [1, 1, 1, [1, 2, 3, 4]]

(2)注意事项
作为字典的键:不可变对象可以用作字典的键,因为它们的内容不会改变,可以确保键的唯一性。而可变对象不能用作字典的键,因为它们的内容可能会变,这会导致字典的行为变得不确定。

函数参数传递:当不可变对象作为函数参数传递时,实际上传递的是对象的引用。但由于对象是不可变的,所以在函数内部对参数的任何修改都不会影响原始对象。相反,对于可变对象,函数内部对参数的修改会影响到原始对象。

赋值操作:对不可变对象进行赋值操作实际上是创建了一个新的对象,并更新了变量引用。对可变对象进行赋值操作则只是改变了引用的对象,而不是对象本身的内容。

理解不可变对象和可变对象之间的区别对于编写高效且可靠的Python代码非常重要。它们影响了Python的内存管理、参数传递和对象比较等多个方面。

2、参数类型

  • 必备参数
  • 关键字参数
  • 默认参数
  • 不定长参数

(1)必备参数:【顺序和个数都很重要】
必须以正确的顺序传入函数,调用的数量不需和声明时的一样。

#示例:
def ChangeInt(a):a = 5print("函数内的值:",a)  # 结果是 5
b = 3
ChangeInt() #TypeError: ChangeInt() missing 1 required positional argument: 'a'
ChangeInt(b)#正确

(2)关键字参数【顺序不重要,个数重要】
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

以下实例在函数 functionprint() 调用时使用参数名:

def functionprint( st):"打印任何传入的字符串"print(st)return
#调用functionprint函数
functionprint(st = "hello,python")

运行结果:

hello,python

关键字参数顺序不重要:

def functionprint_two(name, age):"打印任何传入的字符串"print("Name: ", name)print("Age ", age)return# 调用functionprint_two函数
functionprint_two(age=18, name="大山很山")

运行结果:

Name:  大山很山
Age  18

(3)默认参数 【顺序不重要,个数也不重要】
调用函数时,默认参数的值如果没有传入,则被认为是默认值。

def functionprint_two(name="lucy", age=32):"打印任何传入的字符串"print("Name: ", name)print("Age ", age)return# 调用functionprint_two函数
functionprint_two(age=18, name="大山很山")
functionprint_two(name="lily")
functionprint_two()

运行结果如下:

Name:  大山很山
Age  18
Name:  lily
Age  32
Name:  lucy
Age  32

(4)不定长参数
有时需要定义一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:

def functionname([formal_args,] *var_args_tuple ):"函数_文档字符串"function_suitereturn [expression]

加了星号(*)的变量名会存放所有未命名的变量参数。

def functionprint_x(arg1, *vartuple):"打印任何传入的参数"print("输出:",arg1)for var in vartuple:print(var)return# 调用printinfo 函数
functionprint_x(1)
functionprint_x(2, "大山很山","hello")

运行结果如下:

输出: 1
输出: 2
大山很山
hello

三、匿名函数

使用 lambda 来创建匿名函数
lambda的主体是一个表达式,而不是一个代码块,比def简单很多。但仅能在lambda表达式中封装有限的逻辑进去。它拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

语法如下:

lambda [arg1 [,arg2,.....argn]]:expression
# 使用lambda自定义函数
multiplication = lambda arg1, arg2: arg1 * arg2# 调用sum函数
print("相乘后的值为 : ", multiplication(15, 15))

运行结果:

相乘后的值为 :  225

四、变量作用域

一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。

total = 10  # 这是一个全局变量
# 可写函数说明
def sum(arg1, arg2):# 返回2个参数的和."total = arg1 + arg2  # total在这里是局部变量.print("函数内是局部变量total : ", total)return total# 调用sum函数
sum(15, 15)
total1=sum(15, 15)
print("函数外是全局变量total : ", total)
print("函数外是全局变量total1 : ", total1)

运行结果如下:

函数内是局部变量total :  30
函数内是局部变量total :  30
函数外是全局变量total :  10
函数外是全局变量total1 :  30

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

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

相关文章

Linux——du, df命令查看磁盘空间使用情况

一、实现原理: df 命令的全称是Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used ,统计磁盘有已经使用的空间。它是直接统计各文件各目…

HarmonyOS4.0—自定义渐变导航栏开发教程

前言 今天要分享的是一个自定义渐变导航栏,本项目基于鸿蒙4.0。 先看效果: 这种导航栏在开发中也比较常见,特点是导航栏背景色从透明到不透明的渐变,以及导航栏标题和按钮颜色的变化。 系统的导航栏无法满足要求,我们…

Vuex 笔记

Vuex的设计初衷就是为了解决Vue中单项数据流的问题,什么是单项数据流,简单来说就是 父组件可以传值给子组件,你可以用props,还相对简单. 子组件可以传值给父组件,你可以用$emit,这个算相对难一丢丢. 1.Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候&#x…

8868体育助力西甲赫罗纳 争冠黑马惨遭掀翻

西甲的赫罗纳足球俱乐部是8868体育助力的球队之一,西甲排名第12的赫塔费队迎来了西甲第29轮的较量,赫塔费队此役坐镇自己的主场PK赛前排名第2的争冠超级黑马赫罗纳队。 赛前赫塔费队已经连续4轮联赛不胜(2平2负状态低迷)&#xff…

力扣 字符串解码

维护一个放数字的栈&#xff0c;一个放字母的栈 遇到[把数字和字母入栈&#xff0c;遇到]把当前字母循环加上数字栈头遍的字母栈头 class Solution { public:string decodeString(string s) {string ans"";stack<int>sz;stack<string>zm;里面是string …

一文讲清!进销存管理系统如何实现锁库及库存冻结?计算月加权平均成本?

进销存管理系统中的锁库及库存冻结如何实现&#xff1f;进销存管理系统如何计算月加权平均成本&#xff1f;进销存管理系统又该如何统计和预测采购需求&#xff1f;这些进销存管理难题困扰着许多企业管理者。本文将结合数年从业经验&#xff0c;深入探讨这些进销存管理难题&…

面试算法-83-不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…

saas架构使用实现

saas架构使用实现 saas是什么 多租户架构——是指在同一个系统中&#xff0c;为不同的客户提供不同的部署环境&#xff0c;各个客户之间的数据和操作是相互独立的。这种架构可以大幅降低系统的开发和运维成本&#xff0c;同时也能提高系统的可扩展性和灵活性。每个用户有自己特…

Keepalived 踩坑

场景&#xff1a;操作系统环境为centos7.9 这里举例了定时检测一个http接口&#xff0c;若超过4次返回不为200则切换master到backup 同时若当前节点被切换为备份节点需要执行一个自己的脚本 两台虚拟机 准备一个vip 1.安装keepalived yum install keepalived 2.配置文件路径…

苹果电脑不能删除移动硬盘文件 苹果电脑移动硬盘只读模式如何更改 移动硬盘文件或目录损坏且无法读取怎么办

当我们将移动硬盘插入苹果电脑后&#xff0c;发现无法对移动硬盘中的文件进行编辑该怎么办&#xff1f;相信有不少网友遇到过这类情况。苹果电脑不能删除移动硬盘文件&#xff0c;或无法拷贝硬盘里的文件。今天我为大家解决苹果电脑移动硬盘只读模式如何更改的问题&#xff0c;…

superset 二开增加 flink 数据源连接通过flink sql 查询数据

前言 superset 目前还不支持 flink 的数据源连接&#xff0c;目前我们公司在探索使用数据湖那一套东西&#xff1a; 使用 flink 作为计算引擎使用 paimon oss对象存储对接 flink 作为底层存储使用 superset 通过 flink gateway 查询 paimon 数据形成报表 增加flink数据源 …

Linux中关于库的概念

一、概念 库是一个二进制文件&#xff0c;包含的代码可被程序调用。例如标准C库、数学库、线程库... 库有源码&#xff0c;可下载后编译&#xff1b;也可以直接安装二进制包。 库是事先编译好的&#xff0c;可以复用的代码。 在OS上运行的程序基本上都要使用库&#xff0c;…

git push出错: src refspec dev/xxx does not match any

使用如下命令gitp push出错: git push origin 远端分支名 git push origin dev/xxxx error: src refspec dev/xxxx does not match any error: failed to push some refs to https://git.woa.com/..... 解决方案 1: git push origin 本地分支名:远端分支名 解决方案2&#…

docker进阶篇,docker集群介绍

docker swarm 官网&#xff1a;https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/ 什么是 docker swarm docker swarm 是 docker 官方提供的容器编排和集群管理工具。它允许用户将多个 docker 主机组成一个虚拟的 docker 集群&#xff0c;以便更高效地管理…

互联网环境下工厂生产企业的数字化转型路径研究

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着互联网技术的飞速发展&#xff0c;数字化已经成为企业提升竞争力的重要手段。对于工…

LeetCode-热题100:283.移动零

题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums…

四信雨水情监测系统,助力构建“三道防线”精准防洪

近年来&#xff0c;我国突破历史记录、颠覆传统认知的水旱灾害频繁发生&#xff0c;依靠传统监测预报手段已难以满足当前洪水防御工作的需求。为贯彻“两个坚持、三个转变”的防灾减灾救灾理念&#xff0c;保障人民群众生命财产安全赢得时机&#xff0c;就必须进一步强化应对洪…

C语言经典面试题目(二十二)

1、解释一下C语言中的预处理器指令及其作用。 预处理器指令是在编译之前由预处理器处理的指令&#xff0c;用于对源代码进行预处理。预处理器指令以#符号开头。常见的预处理器指令包括&#xff1a; #include&#xff1a;用于包含头文件&#xff0c;将指定的文件内容插入到当前…

Cadence OrCAD使用小技巧

Cadence是公司名&#xff0c;Allegro&#xff08;俗称阿狸狗&#xff09;是该公司旗下的EDA工具品牌&#xff0c;OrCAD是该公司收购公司的EDA工具品牌。 OrCAD这个产品线是Cadence收购来的&#xff0c;Allegro才是嫡系。 注意&#xff1a;dsn不能放在中文路径下。 开机选captur…

20240316-1-向量化搜索

向量化搜索 在高维空间内快速搜索最近邻&#xff08;Approximate Nearest Neighbor&#xff09;。召回中&#xff0c;Embedding向量的搜索。 FAISS、kd-tree、局部敏感哈希、【Amnoy、HNSW】 FAISS faiss是Facebook的AI团队开源的一套用于做聚类或者相似性搜索的软件库&…