当前位置: 首页 > news >正文

Python中的函数及变量

1.定义

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性和代码的重复利用率,Python提供了很多内置函数,比如prtint(),但是你也可以自己创建函数,这种叫做用户自定义函数。

2.函数的定义

可以根据自己的需求定义一个想要功能的函数,具有以下规则:

(1)函数代码块由def关键词开头,后接函数标识符名称和圆括号()

(2)任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数

(3)函数的第一行语句可以选择性地使用文档字符串---用于存放函数说明
(4)函数内容以冒号开始,并且缩进
(5)return[表达式]结束函数,选择性地返回给一个值调用方,不带表达式的return相当于返回None

语法:

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

在默认情况下,参数值和参数名称是按函数声明中定义的顺序来匹配起来的。举个例子:

def printme(str): "打印传入的字符串到标准显示设备上" print(str) return

上面是一个标准的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上

3.函数的调用

定义了一个函数,只是给了函数一个名称,指定了函数里面包含的参数和代码块结构,这个函数的基本结构完成以后,你可以通过另外一个函数调用执行,也可以直接从Python提示符执行,下面的例子调用了printme()函数:

代码;

def printme(str): "打印传入的字符串到标准显示设备上" print(str) return #调用函数 printme("我要调用用户自定义函数") printme("再次调用同一函数")

结果

以上内容起始很直观的看出来是怎么调用的,当然这只是个简单的例子,如果在实际的使用中,当然会根据具体情况而具备不同的复杂性,但是除了练习,在实际情况中不会有这么简单的函数定义和调用

4.函数中参数的传递

在Python中,类型属于对象,变量是没有类型的:

a=[1,2,3]

a="Runoob"

在上面这两行代码中,[1,2,3]是list类型,“Runoob”是String类型,而变量a是没有类型,它仅仅是一个对象的引用(一个指针),可以是List类型对象,也可以指向String类型对象

5.可更改(mutable)与不可更改(immutable)对象

在Python中,strings,tuples与numbers是不可更改对象,而list,dict等则是可以修改的对象

(1)不可变类型:

变量赋值a=5后,再赋值=10,这里实际是新生成一个int值对象10,再让a指向它,而5被丢弃,不是改变a的值,相当于新生成了a

(2)可变类型:

变量赋值la=[1,2,3,4]后,再赋值la[2]=5,这个操作是将la中的第三个元素值更改为5,la本身没有变,只是其中的某个值被修改了

(3)Python函数的参数传递

①不可变类型:类似C++的值传递,如整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身,比如在fun(a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身

②可变类型:类似C++中的引用传递,如列表,字典。如fun(la),则是将la真正的值传过去,修改后fun外部的la也会受到影响

Python中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象

举例1:Python传不可变对象实例:

这上面这个例子中,有int对象2,指向它的变量是b,在传递给ChangeInt函数时,按传值的方式赋值了变量b,a和b都指向了同一个int对象,在a=10时,则新生成一个int值对象10,并让a指向它

这里逐行解释:

第一行,定义了一个函数,参数是a,是一个局部变量

第二行,在函数内部,将a重新赋值为10,注意,整数是不可变对象,这里的赋值只是让局部变量a指向新的整数对象10,并不会影响外部的变量

第三行,创建一个整数对象2,变量b指向它

第四行,调用函数,将b的值,传递给参数a,此时a和b都指向同一个整数对象2,进入函数后,执行a=10,a改为指向10,但是b仍然指向2

第五行,输出b的值,仍然是2

总结来说就是:Python中的整数是不可变对象,函数内部参数的重新赋值不会改变外部变量的值,如果希望函数修改外部变量,可以使用返回值(return a)并重新赋值给b,或者使用可变对象(如列表、字典)并在内部修改其内容

举例2:传可变对象实例

代码:

def changeme(mylist): "修改传入的列表" mylist.append([1,2,3,4]) print("函数内取值:",mylist) return #调用changeme函数 mylist=[10,20,30] changeme(mylist) print("函数外取值:",mylist)

结果:

上面的例子中,传入函数的和在末尾添加新内容的对象用的是同一个引用,故输出结果是相同的

6.参数

以下是调用函数时可使用的正式参数类型

·必备参数

·关键字参数

·默认参数

·不定长参数

(1)必备参数:

必备参数必须以正确的顺序传入函数,调用时的数量必须和声明时候的一样,调用printm()函数,你必须传入一个参数,不然会出现语法错误,举例说明:

以上内容在运行的时候输出错误是因为在调用pritnme函数的时候没有传入任何的参数,所以运行出现报错“运行参数缺失”故障

(2)关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明不一致,因为Python解释器能够用参数名匹配参数值,以下实例在函数printme()调用时使用参数名

上述代码输出如上结果,再举个例子,能将关键字参数顺序不重要展示的更清楚;

代码:

def printinfo(name,age): "打印任何传入的字符串" print(" Name: ",name) print(" Age: ",age) return #调用printinfo函数 printinfo( age=50,name="miki")

结果:

上述结果说明,关键字的顺序并不重要,但是对应的关键字的数量要和声明时的一致

(3)默认参数

调用函数的时候,默认参数的值如果没有传入,则被认为是默认值,下面举个例子,会打印默认的age,如果age没有被传入:

代码:

def printinfo(name,age=35): "打印任何传入的字符串" print(" Name: ",name) print(" Age: ",age) return #调用printinfo函数 printinfo( age=50,name="miki") printinfo(name="miki")

结果:

但是需要注意的是,默认参数的值不传入并且不报错的前提是,对应的这个默认参数要有对应的值,否则肯定会报错

(4)不定长参数

如果需要一个函数,能够处理比当初声明时更多的参数,这些参数就叫做不定长参数,和上述两种参数不同,声明时不会命名,基本语法如下:

#不定长参数的语法 def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]

加了(*)的变量名会存放所有未命名的变量参数,不定长参数实例如下:

代码:

def printinfo(arg1,*vartuple): "打印任何传入的参数" print("输出:") print(arg1) for var in vartuple: print(var) return #调用printinfo函数 printinfo(10) printinfo(70,60,50)

结果:

其实在实际写代码的时候,如果第一个参数的位置和内容已经确定了,那么在输入其他参数的时候,会直接给出提示是哪一部分对应的参数了,如上图最后一行代码括号中的内容表示

7.匿名函数

Python使用lambda来创建匿名函数

·lambda只是一个表达式,函数体比def简单很多

·lambda的主体只是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去

·lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数

·虽然lambda函数看起来只能写一行,却不等同于C或者C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率

lambda [arg1 [,arg2,.....argn]]:expression

举个例子:

对于上面这个例子,容易产生理解偏差,其中arg1和arg2只是两个参数名,这个冒号后面的内容代表的是这两个参数需要进行的操作,并不是说这个冒号在arg2后面,所以这个相加的操作是arg2的内容,一定要注意,这是新手容易产生的误区,lambda函数的完整语法是:
lambda 参数列表:返回值表达式

8.return语句

return语句[表达式]退出函数,选择性地向调用方返回一个表达式,不带参数值的return语句返回None,之前的例子都没有示范如何返回数值,下面举个例子说明:

9.变量作用域

一个程序的所有变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的,变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称,两种最基本的变量作用于如下:

(1)全局变量

全局变量是在整个程序中可访问的变量

(2)局部变量

仅在其被定义的函数内部可用

举个例子说明:

说明:
全局变量在函数内部也是可以访问的,但是如果函数内部的变量在函数外部访问的话,就会到时NameError

http://www.jsqmd.com/news/635076/

相关文章:

  • 2026 金融科技公司数据 API 解决方案:MCP Agent
  • gte-base-zh快速上手:Xinference框架下的文本嵌入模型部署实战
  • 自我规范手册
  • 还在手动降重到凌晨?你的同学早就用这些神器轻松搞定了
  • OpenFace 2.2.0实战:4大核心功能深度解析与高效应用指南
  • 绿联NAS小白也能搞定:5分钟用Docker部署VoceChat私人聊天室(附常见问题排查)
  • SQUIRE: Leveraging Sequence-to-sequence Transformers for Robust Multi-hop Knowledge Graph Completion
  • AI时代的算法思维:大经典排序学习竞
  • 深度解析:如何构建企业级智能客服监控系统的5大核心技术
  • 如何用c# 做 mcp/ChatGPT app坛
  • 2026年贵州智能停车系统一站式解决方案深度横评|鼎鸿盛官方联系方式与避坑指南 - 精选优质企业推荐榜
  • RexUniNLU场景应用:从客服对话中自动提取用户意图与槽位
  • HDLbits实战解析系列2:Verilog模块化设计进阶与层次化实例精讲
  • 硬盘里那个仙剑的文件夹,你多久没打开过了?DOCKER部署DOS怀旧模拟器,带你秒回童年!
  • 聚焦实用需求,2026几个靠谱的健康一体机厂家推荐 - 品牌2026
  • AI 赋能 JS 逆向MCP+Skill+autoDecoder 全自动化落地加密自动Ai逆向
  • Modbus TCP vs RTU怎么选?从项目实战角度聊聊我的踩坑经验
  • 从降重到排版,这2款神器承包了我的整篇毕业论文
  • 手把手教你用C++11原子操作实现无锁队列(附compare_exchange_weak实战代码)
  • Verilog 进阶学习指南:从入门到精通的必备书单(附资源)
  • 数学周刊第15期(2026年04月07日-04月12日)
  • 2026年贵州智慧停车+安防一体化解决方案深度横评|鼎鸿盛官方联系电话与避坑指南 - 精选优质企业推荐榜
  • 别再复制粘贴了!手把手教你为STM32F103标准库工程添加printf串口打印(Keil MDK环境)
  • uni-app中H5页面通过web-view跳转小程序的完整解决方案
  • Niushop开源商城漏洞实战:从文件上传到CSRF攻击全解析
  • 别再手动调参了!用Accelerate+DeepSpeed配置文件,5分钟搞定多机多卡训练环境
  • 、SEATA分布式事务——XA模式磺
  • 一篇文章看懂MySQL数据库(中)
  • RTF文件中的多语言编码实战:从ANSI到Unicode的完整解析
  • 微软开源最前沿语音 AI!三合一家族:60分钟语音转文字 / 90分钟多角色合成 / 实时流式说话