Python 函数 - 菜鸟教程

文章推薦指數: 80 %
投票人數:10人

函数能提高应用的模块性,和代码的重复利用率。

你已经知道Python提供了许多内建函数,比如print()。

但你也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数你 ... 菜鸟教程--学的不仅是技术,更是梦想! 首页 HTML CSS JavaScript Vue Bootstrap NodeJS Python3 Python2 Java C C++ C# Go SQL Linux jQuery 本地书签 首页 HTML CSS JS 本地书签 Search Python3教程 Python2教程 Vue3教程 vue2教程 Bootstrap3教程 Bootstrap4教程 Bootstrap5教程 Bootstrap2教程 Python基础教程 Python基础教程 Python简介 Python环境搭建 Python中文编码 Python基础语法 Python变量类型 Python运算符 Python条件语句 Python循环语句 PythonWhile循环语句 Pythonfor循环语句 Python循环嵌套 Pythonbreak语句 Pythoncontinue语句 Pythonpass语句 PythonNumber(数字) Python字符串 Python列表(List) Python元组 Python字典(Dictionary) Python日期和时间 Python函数 Python模块 Python文件I/O PythonFile方法 Python异常处理 PythonOS文件/目录方法 Python内置函数 Python高级教程 Python面向对象 Python正则表达式 PythonCGI编程 PythonMySQL Python网络编程 PythonSMTP Python多线程 PythonXML解析 PythonGUI编程(Tkinter) Python2.x与3​​.x版本区别 PythonIDE PythonJSON Python100例 Python测验 Python日期和时间 Python模块 Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。

你已经知道Python提供了许多内建函数,比如print()。

但你也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以def关键词开头,后接函数标识符名称和圆括号()。

任何传入参数和自变量必须放在圆括号中间。

圆括号之间可以用于定义参数。

函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

函数内容以冒号起始,并且缩进。

return[表达式]结束函数,选择性地返回一个值给调用方。

不带表达式的return相当于返回None。

语法 deffunctionname(parameters): "函数_文档字符串" function_suite return[expression] 默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

实例 以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。

实例(Python2.0+) defprintme(str): "打印传入的字符串到标准显示设备上" printstr return 函数调用 定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

如下实例调用了printme()函数: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #定义函数 defprintme(str): "打印任何传入的字符串" printstr return #调用函数 printme("我要调用用户自定义函数!") printme("再次调用同一函数") 以上实例输出结果: 我要调用用户自定义函数! 再次调用同一函数 参数传递 在python中,类型属于对象,变量是没有类型的: a=[1,2,3] a="Runoob" 以上代码中,[1,2,3]是List类型,"Runoob"是String类型,而变量a是没有类型,她仅仅是一个对象的引用(一个指针),可以是List类型对象,也可以指向String类型对象。

可更改(mutable)与不可更改(immutable)对象 在python中,strings,tuples,和numbers是不可更改的对象,而list,dict等则是可以修改的对象。

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

可变类型:变量赋值la=[1,2,3,4]后再赋值la[2]=5则是将listla的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python函数的参数传递: 不可变类型:类似c++的值传递,如整数、字符串、元组。

如fun(a),传递的只是a的值,没有影响a对象本身。

比如在fun(a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身。

可变类型:类似c++的引用传递,如列表,字典。

如fun(la),则是将la真正的传过去,修改后fun外部的la也会受影响 python中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

python传不可变对象实例 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- defChangeInt(a): a=10 b=2 ChangeInt(b) printb#结果是2 实例中有int对象2,指向它的变量是b,在传递给ChangeInt函数时,按传值的方式复制了变量b,a和b都指向了同一个Int对象,在a=10时,则新生成一个int值对象10,并让a指向它。

传可变对象实例 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #可写函数说明 defchangeme(mylist): "修改传入的列表" mylist.append([1,2,3,4]) print"函数内取值:",mylist return #调用changeme函数 mylist=[10,20,30] changeme(mylist) print"函数外取值:",mylist 实例中传入函数的和在末尾添加新内容的对象用的是同一个引用,故输出结果如下: 函数内取值:[10,20,30,[1,2,3,4]] 函数外取值:[10,20,30,[1,2,3,4]] 参数 以下是调用函数时可使用的正式参数类型: 必备参数 关键字参数 默认参数 不定长参数 必备参数 必备参数须以正确的顺序传入函数。

调用时的数量必须和声明时的一样。

调用printme()函数,你必须传入一个参数,不然会出现语法错误: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #可写函数说明 defprintme(str): "打印任何传入的字符串" printstr return #调用printme函数 printme() 以上实例输出结果: Traceback(mostrecentcalllast): File"test.py",line11,in printme() TypeError:printme()takesexactly1argument(0given) 关键字参数 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值。

以下实例在函数printme()调用时使用参数名: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #可写函数说明 defprintme(str): "打印任何传入的字符串" printstr return #调用printme函数 printme(str="Mystring") 以上实例输出结果: Mystring 下例能将关键字参数顺序不重要展示得更清楚: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #可写函数说明 defprintinfo(name,age): "打印任何传入的字符串" print"Name:",name print"Age",age return #调用printinfo函数 printinfo(age=50,name="miki") 以上实例输出结果: Name:miki Age50 默认参数 调用函数时,默认参数的值如果没有传入,则被认为是默认值。

下例会打印默认的age,如果age没有被传入: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #可写函数说明 defprintinfo(name,age=35): "打印任何传入的字符串" print"Name:",name print"Age",age return #调用printinfo函数 printinfo(age=50,name="miki") printinfo(name="miki") 以上实例输出结果: Name:miki Age50 Name:miki Age35 不定长参数 你可能需要一个函数能处理比当初声明时更多的参数。

这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。

基本语法如下: deffunctionname([formal_args,]*var_args_tuple): "函数_文档字符串" function_suite return[expression] 加了星号(*)的变量名会存放所有未命名的变量参数。

不定长参数实例如下: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #可写函数说明 defprintinfo(arg1,*vartuple): "打印任何传入的参数" print"输出:" printarg1 forvarinvartuple: printvar return #调用printinfo函数 printinfo(10) printinfo(70,60,50) 以上实例输出结果: 输出: 10 输出: 70 60 50 匿名函数 python使用lambda来创建匿名函数。

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

lambda的主体是一个表达式,而不是一个代码块。

仅仅能在lambda表达式中封装有限的逻辑进去。

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

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

语法 lambda函数的语法只包含一个语句,如下: lambda[arg1[,arg2,.....argn]]:expression 如下实例: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #可写函数说明 sum=lambdaarg1,arg2:arg1+arg2 #调用sum函数 print"相加后的值为:",sum(10,20) print"相加后的值为:",sum(20,20) 以上实例输出结果: 相加后的值为:30 相加后的值为:40 return语句 return语句[表达式]退出函数,选择性地向调用方返回一个表达式。

不带参数值的return语句返回None。

之前的例子都没有示范如何返回数值,下例便告诉你怎么做: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- #可写函数说明 defsum(arg1,arg2): #返回2个参数的和." total=arg1+arg2 print"函数内:",total returntotal #调用sum函数 total=sum(10,20) 以上实例输出结果: 函数内:30 变量作用域 一个程序的所有的变量并不是在哪个位置都可以访问的。

访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。

两种最基本的变量作用域如下: 全局变量 局部变量 全局变量和局部变量 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

如下实例: 实例(Python2.0+) #!/usr/bin/python #-*-coding:UTF-8-*- total=0#这是一个全局变量 #可写函数说明 defsum(arg1,arg2): #返回2个参数的和." total=arg1+arg2#total在这里是局部变量. print"函数内是局部变量:",total returntotal #调用sum函数 sum(10,20) print"函数外是全局变量:",total 以上实例输出结果: 函数内是局部变量:30 函数外是全局变量:0 Python日期和时间 Python模块 12篇笔记 写笔记 #0   blingcoin  zha***[email protected]全局变量想作用于函数内,需加global #!/usr/bin/python #-*-coding:UTF-8-*- globvar=0 defset_globvar_to_one(): globalglobvar#使用global声明全局变量 globvar=1 defprint_globvar(): print(globvar)#没有使用global set_globvar_to_one() printglobvar#输出1 print_globvar()#输出1,函数内的globvar已经是全局变量 1、global---将变量定义为全局变量。

可以通过定义为全局变量,实现在函数内部改变变量值。

2、一个global语句可以同时定义多个变量,如globalx,y,z。

blingcoin   blingcoin  zha***[email protected]年前(2017-04-26) #0   BMPixel  194***[email protected]列表反转函数: #!/user/bin/python #-*-coding:UTF-8-*- defreverse(li): foriinrange(0,len(li)/2): temp=li[i] li[i]=li[-i-1] li[-i-1]=temp l=[1,2,3,4,5] reverse(l) print(l) BMPixel   BMPixel  194***[email protected]年前(2017-05-06) #0   King  kin***63.com27列表反转函数二: defreverse(ListInput):     RevList=[]     foriinrange(len(ListInput)):         RevList.append(ListInput.pop())     returnRevListKing   King  kin***63.com5年前(2017-07-18) #0   songy  son***[email protected]简化列表反转: defreverse(li): foriinrange(0,len(li)/2): li[i],li[-i-1]=li[-i-1],li[i] l=[1,2,3,4,5] reverse(l) print(l) songy   songy  son***[email protected]年前(2017-08-29) #0   shiyeweimian  860***[email protected]  参考地址29关于returnfun和returnfun()的区别: >>>deffunx(x): deffuny(y): returnx*y returnfuny#returnfuny返回的是一个对象,可理解为funx是funy的一个对象 >>>funx(7)(8) 56 >>>deffunx(x): deffuny(y): returnx*y returnfuny()#returnfuny()返回的是funy的函数返回值,所以此处报错 >>>funx(7)(8) Traceback(mostrecentcalllast): File"",line1,in funx(7)(8) File"",line4,infunx returnfuny() TypeError:funy()takesexactly1argument(0given) >>>deffunx(x): deffuny(y): returnx*y returnfuny(8) >>>funx(7) 56shiyeweimian   shiyeweimian  860***[email protected]  参考地址5年前(2017-09-20) #0   santiago  408***[email protected]在python中,类型属于对象,变量是没有类型的。

a=[1,2,3] a="Runoob" 以上代码中,[1,2,3]是List类型,"Runoob"是String类型,而变量a是没有类型,她仅仅是一个对象的引用(一个指针),可以是List类型对象,也可以指向String类型对象。

santiago   santiago  408***[email protected]年前(2018-07-03) #0   Sonnet  gra***[email protected]  参考地址16DocStrings文档字符串是一个重要工具,用于解释文档程序,帮助你的程序文档更加简单易懂。

#!/usr/bin/python #-*-coding:UTF-8-*- deffunction(): '''saysomethinghere! ''' pass print(function.__doc__)#调用doc DocStrings文档字符串使用惯例:它的首行简述函数功能,第二行空行,第三行为函数的具体描述。

更多内容可参考:Python文档字符串(DocStrings)Sonnet   Sonnet  gra***[email protected]  参考地址4年前(2018-07-12) #0   天天学python  495***[email protected] #!/usr/bin/python #-*-coding:UTF-8-*- defprintme(str,int): printstr,int return #int,str顺序和定义时的顺序不一样,最终输出按照print的顺序 printme(int=10,str="Mystring") 输出结果为:Mystring10 以上是一个具体实例,可以帮助更好的理解:使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值。

天天学python   天天学python  495***[email protected]年前(2018-07-24) #0   销售  axi***[email protected]#!/usr/bin/python3 defarras(x,y,z=4,*param,**params):     print(x,y,z)     foriinrange(len(param)):         print(param[i])     forjinparams:         print(j+':'+params[j])          arras(1,2,3,4,5,'Python风格规范(Google)本项目并非Google官方项目,.。

',foo='foo1=100',h00='hoo1=200',koo='koo1=4000') 输出结果: 123 4 5 Python风格规范(Google)本项目并非Google官方项目,.。

foo:foo1=100 h00:hoo1=200 koo:koo1=4000 得出:不定长参数*输出一般都是元组的结构形式,**双星输出的都是字典形式的结构,在传值的中也要确保值得准确匹配才行,不然会报错。

销售   销售  axi***[email protected]年前(2018-11-14) #0   sunird  118***[email protected]函数的方法名也可以作为另一个函数的参数。

#!/usr/bin/python #-*-coding:UTF-8-*- defadd(x,y): returnx+y defadd_twice(func,x,y): returnfunc(func(x,y),func(x,y))##计算过程(5+10)+(5+10) a=5 b=10 print(add_twice(add,a,b)) 其中add方法在add_twice方法中作为一个参数被调用。

sunird   sunird  118***[email protected]年前(2018-11-16) #0   yefeidd  zjs***[email protected]可以通过重新创建一个列表引用对象,来避免修改函数内部列表的同时影响到外部的对象。

#!/usr/bin/python #-*-coding:UTF-8-*- defchangeme(mylists): "修改传入的列表" mylists.append([1,2,3,4]) print"函数内取值:",mylists return #调用changeme函数 mylist=[10,20,30] myCopy=mylist[:]#重新创建一个索引,这样子函数内部的修改不会影响到外部的列表。

changeme(myCopy) print"函数外取值:",mylistyefeidd   yefeidd  zjs***[email protected]年前(2019-08-13) #0   hamilton  123***c.com  参考地址26关于本节可变/不可变对象传参的一点补充: Python在heap中分配的对象分成两类:可变对象和不可变对象。

所谓可变对象是指,对象的内容是可变的,例如list。

而不可变的对象则相反,表示其内容不可变。

不可变对象:int,string,float,tuple--可理解为C中,该参数为值传递 可变对象:list,dictionary--可理解为C中,该参数为指针传递 一、不可变对象 由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的。

运用这样的机制,有时候会让人产生糊涂,似乎可变对象变化了。

如下面的代码: i=73 i+=2 从上面得知,不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用。

看看下面的代码,更能体现这点的。

#因为258是int对象,是不可变对象的。

所以下面3个id的值都是一样的,最后一句的结果也是为True #有点奇怪的是为什么在IDLE,和在脚本执行的结果不太一样。

所以下面的代码请在脚本中执行。

print(id(258)) a=258 print(id(a)) b=258 print(id(b)) print(aisb) 二、对于可变对象 其对象的内容是可以变化的。

当对象的内容发生变化时,变量的对象引用是不会变化的。

如下面的例子。

m=[5,9] m+=[6] hamilton   hamilton  123***c.com  参考地址3年前(2019-09-12) 点我分享笔记 取消 分享笔记 昵称昵称(必填) 邮箱邮箱(必填) 引用地址引用地址 分类导航 HTML/CSSHTML教程HTML5教程CSS教程CSS3教程Bootstrap3教程Bootstrap4教程Bootstrap5教程FontAwesome教程Foundation教程JavaScriptJavaScript教程HTMLDOM教程jQuery教程AngularJS教程AngularJS2教程Vue.js教程Vue3教程React教程TypeScript教程jQueryUI教程jQueryEasyUI教程Node.js教程AJAX教程JSON教程Echarts教程Highcharts教程Google地图教程服务端Python教程Python2.x教程Linux教程Docker教程Ruby教程Java教程C教程C++教程Perl教程Servlet教程JSP教程Lua教程Rust教程Scala教程Go教程PHP教程Django教程Zookeeper教程设计模式正则表达式Maven教程Verilog教程ASP教程AppML教程VBScript教程数据库SQL教程MySQL教程PostgreSQL教程SQLite教程MongoDB教程Redis教程Memcached教程数据分析Python教程NumPy教程Pandas教程Matplotlib教程Scipy教程R教程Julia教程移动端Android教程Swift教程jQueryMobile教程ionic教程Kotlin教程XML教程XML教程DTD教程XMLDOM教程XSLT教程XPath教程XQuery教程XLink教程XPointer教程XMLSchema教程XSL-FO教程SVG教程ASP.NETASP.NET教程C#教程WebPages教程Razor教程MVC教程WebForms教程WebServiceWebService教程WSDL教程SOAP教程RSS教程RDF教程开发工具Eclipse教程Git教程Svn教程Markdown教程网站建设HTTP教程网站建设指南浏览器信息网站主机教程TCP/IP教程W3C教程网站品质 Advertisement 反馈/建议 在线实例 ·HTML实例 ·CSS实例 ·JavaScript实例 ·Ajax实例 ·jQuery实例 ·XML实例 ·Java实例 字符集&工具 ·HTML字符集设置 ·HTMLASCII字符集 ·JS混淆/加密 ·PNG/JPEG图片压缩 ·HTML拾色器 ·JSON格式化工具 ·随机数生成器 最新更新 · HTMLDOMstyle... · HTMLDOMscroll... · HTMLDOMscroll... · HTMLDOMscroll... · Dockerstats命令 · JavaScripttrun... · JavaScripttanh... 站点信息 · 意见反馈 · 免责声明 · 关于我们 · 文章归档 关注微信 Copyright©2013-2022菜鸟教程  runoob.comAllRightsReserved.备案号:闽ICP备15012807号-1 微信关注



請為這篇文章評分?