一、定义一个最简单的函数
函数定义用def,可以要有函数名和函数体。下图中,函数名是sayhello,函数体是print语句。函数不被内部函数是应该不会先执行的,全局函数时用函数名括号的格式,即sayhello()
二、函数的参数
1、位置参数
位置参数,是可不填的,调用函数时不传会报错。
我们写一个简单的函数,实现方法计算出乘法的功能。下图中的a和b就是位置参数。
a,b叫做形参,也就是形式参数。调用函数calc时,传的7和8叫实参,也就是换算参数。
我们传参数时,7告诉了a,8传了b。也就是说传参顺序不能不能错。那么,当参数很多的时候,会很难准确的记住各参数位置,就非常容易会出现错误,也可以用形参名实参的传参。
例,操作数据库的函数。传参还没有按顺序,需要了port3306这种,很比较适合多参数的函数。
defop_mysql(host,port,username,password,db,sql):print(再连接数据库:%s,host:%s,端口为:%s%(db,host,port))print(%swhereusername%sbothpwd%s%(sql,username,password))op_mysql(sqlselect*fromuser,host192.158.11.1,usernamesdfdsfs,passwordsdf123,dbtest_data,port3306)运行结果为:
2、默认值参数
默认值参数是非必填的,如果不填,会常规默认值。
例:写一个函数,实现程序文件读写的功能。
#操作文件的函数,如果没有传内容参数,则将随机内容写入到文件。没有传内容,就读取文件原先的内容。defop_file(file_name,contentnone):fopen(file_name,a,encodingutf-8)(0)ifcontent:#不为空代表写f.write(content)f.flush()catch:res()returnres()#不传content,读文件stu_infoop_file(username)print(stu_info)#传content,将content写入文件infosxiaohei,123456,beijing,188888888888op_file(future_info,infos)这里可以介绍再看看return,return有两个作用:(1)动态链接库完函数后,将结果回;(2)函数里面碰到return就立玄结束。
至于,如果只写一个return,后面什么也不加,就直接返回none;如果没有不写return,也默认直接返回none。
小练习:写一个判断有无为小数的函数。
总结:(1)可以确定小数点个数;(2)假如是正小数,小数点左边和右边是纯数字;(3)负小数,左边以‘-'开头,其他部分是数字,右边是数字。
defit's_float(s):sstr(s)if(.)1:lefts.split(.)[0]#小数左边lefts.split(.)
参数组的参数处用“*args”意思是。参数组特点:(1)参数是非必填的;(2)也没取消参数的个数;(3)传过来的参数放到args参数里,不限格式
要是定义方法函数时,书写defaaa(a,*args),则a是必传参数,*args是非必填项的
4、关键字参数
关键字参数用“**kwargs”来表示。特点:(1)参数是非必填;(2)还没有没限制参数个数;(3)所传参数必须是字典格式。
同样的,如果defaaa(time,**kwargs),则time参数必传。其中,time20180912是第一个参数time的值,但输出kwargs时,没有time这一项。
三、局部变量和全局变量
1、局部变量
函数里面定义的变量都是局部变量,没有办法在函数里面用,出了函数就没法我用。
或者,第二节的小练习里,确定有无是小数的函数,left和back那就是局部变量。
2、全局变量
全局变量是公共的变量,都这个可以用的变量。像是不帮我推荐用全局变量,而且全局变量有以上2个缺点:(1)不放心,因为所有人都可以改;(2)会始终占着内存。
直接修改全局变量,是需要先声明声明,用global声明。
下图中,name是一个全局变量,修改之前是需要先一般声明:globalname
四、内置函数
内置函数是python里随机软件的一些函数,有很多,例如:
五、递归算法
递归函数那就是反比例函数自己调用自己。
见意少用递归,因为递归算法效率不高,但是不超过递归过程999次。由下面的函数也能很很直观的看出二分查找次数上限。
六、函数的返回值
前面巳经简单点推荐过return,return有两个作用:(1)内部函数完函数后,将结果返回;(2)函数里面遇见return就立玄结束后。
有的函数不只能一个返回值,函数要是前往多个值的话,会把这几个值放到一个元组里。同时,也可以不用多个值来收不到。
例:
七、匿名函数
匿名留言函数的功能很简单的,只用两次。下面就定义,定义了一个匿名函数。
用lambda定义匿名函数,冒号前面是返回值,后面是函数体,也就是函数的处理逻辑。
即入参是x,然后执行x1,把x的值前往。
---------------河南新华
全局变量:指在函数之外定义的变量,好象也没拱进,在程序不能执行的全过程有效
局部变量:指在函数内部建议使用的变量,仅在函数内部比较有效,当函数解盟时变量将不存在地
例1:
n1#全局变量
deffunc(a,b):
ca*b#c是局部变量,a和b充当函数参数也局部变量
returnc
sfunc(#34knock~#34,2)
print(s)
print(c)
![]()
这个例子那说明,当函数执行完退出后,其内部变量将被释放出。
如果函数内部在用了全局变量呢?例如:
n1#n是全局变量
deffunc(a,b):
牛b#这个n是在函数内存中新生成气体的局部变量,并非全局变量
returna*b
sfunc(#34knock~#34,2)
print(s,n)#测量帮一下忙n值有无突然发生转变knock~knock~1
![]()
函数func()内部建议使用了变量n,另外将变量参数b定义变量给变量n,又为何n值还没有变动?
只不过函数func()有自己的内存空间,它将牛b语句明白为生成气体一个局部变量n,并将参数b定义变量给它,此时func()函数没有将n拿出来全局变量。所以才,函数逃离后,局部变量n被能量,全局变量n的值还没有决定。
如果没有如果能让func()函数将n当做全局变量,是需要在变量n使用前显式那就证明该变量未全局变量,修改后:
n1#n是全局变量
deffunc(a,b):
globaln
nb#这个n是在函数内存中新生成气体的局部变量,不是全局变量
returna*b
sfunc(#34knock~#34,2)
print(s,n)#测试3看看n值是否需要再一次发生改变knock~knock~1
![]()