首页 > 代码库 > Python基础之函数
Python基础之函数
Python基础之函数
一、函数基础
1、函数概念:
函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
2、函数的作用
(1)减少重复代码
(2)使程序变的可扩展
(3)使程序变得易维护
3、语法定义
def sayhi(x): #函数名 ’’’函数说明’’’ print("Hello, I‘mnobody!") return x #函数返回值 sayhi() #调用函数
关键字说明:
def:创建函数
sayhi():函数名
print("Hello, I‘m nobody!"):函数体
return():返回值
sayhi() #调用函数
4、函数的执行过程
定义函数,在程序执行过程中,函数体不执行,只有当程序调用函数时,函数才会执行。
函数执行过程:
def f1(): print(123) return "111" #在函数中,一旦执行return,函数执行过程立即终止 print(456) r = f1() #只有调用函数时,函数才会执行 print(r) #打印函数返回值
5、函数的返回值
(1)返回值数量为0时,返回None
(2)返回值数量等于1时,返回object
(3)返回值数量大于1时,返回tuple
deftest(): print("first") #没有返回值 deftest2(): print("second") return 2 #返回值数量为1时 deftest3(): print("three") return3,"dayi123",{"age":18,‘name‘:"yiliu"} #返回值数量多个时 one =test() two =test2() three= test3() print(one) print(two) print(three)
二、函数的参数
1 函数的基本参数
(1)、普通参数
1)形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
2)实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的值,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
def send(xxoo,content): #xxoo、content为实参 print(xxoo,content) print("发送邮件成功:",xxoo,content) return True send(dayi, is) #dayi、is为形参
(2)、默认参数
def send(xxoo,content,xx="ok"): #默认参数必须放在参数列表最后,可以有多个默认参数 print(xxoo,content,xx) print("发送邮件成功:",xxoo,content,xx) return True send(‘dayi‘,‘is‘) #如果没有传参、则传递默认参数 send(‘dayi‘,‘is‘,‘niuB‘) #如果传递参数,则返回结果为传递参数
(3)、制定参数
默认传递的参数是根据顺序,制定参数,可以打乱参数的顺序:
def send(xxoo,content): print(xxoo,content) print("发送邮件成功:",xxoo,content) return True send(content=‘dayi‘,xxoo=‘is‘) #将’dayi’传递给conttent,将‘is’换递给xxoo
2、函数的动态参数
(1)、动态参数:传参时可以传一个或任意多个参数
1)、传参时加一个”*”
作用:会将传的参数放入元组中、
应用场景:传的参数有顺序
def fl(*args): # 行参中带*则表示动态参数 print(args,type(args)) fl(11) li = [22,"dayi","liu"] fl(li) # 把 "li"当做一个整体传到元组里面 fl(*li) #加"*"把li中元素传到元组里面 fl(li,12) li2 = "dayi123" fl(li2) #不带*,将li2整体传进元组,带"*",将li2中每个字符串分别传进元组 fl(*li2)
2)、传参时加两个”*”
作用:会将传的参数放入字典中
应用场景:传的参数没有顺序
def f1(**args): print(args,type(args)) f1(n1="dayi123",n2=24) #传参时必须传两个,一个“KEY”一个“value” dic = {‘name‘:"dayi",‘age‘:18} f1(kk=dic) #传参是把字典当做一个整体传进字典中 f1(**dic) #传参时将字典中的每一个值分别传进字典中
3)、传参时既有两个”*”,又有一个”*”
作用:万能参数,既可以传一个”*”的参数,又可以传”**”的参数
ef f1(*args,**kwargs): print(args,type(args)) print(kwargs) f1(1,2,3,name="dayi",age=24) tup = (22,33,44,55) dic = {‘name‘:"dayi123",‘age‘:23} f1(*tup,**dic) f1(yz=tup,cd=dic)
(2)、利用动态参数实现format功能
s1 = "i am {0},age{1}".format("dayi123",18) print(s1) s2 = "i am {0},age {1}".format(*["dayi123",24]) #传递列表中的参数,前面必须加“*” print(s2) s3 = "i am {name},age {age}".format(name="dayi123",age=24) print(s3) dic = {‘name‘:‘dayi123‘,"age":24} s4 = "i am {name},age {age}".format(**dic) #将字典中参数传递给s4,必须加“**” print(s4)
(3)、函数传参传递的是引用
def f1(a1): a1.append(999) # 函数传参传递的是引用 li = [11,22,33,44] f1(li) print(li)
3、全局变量与局部变量
全局变量针对所有作用域均可读,局部变量只针对部分作用域可读,全局变量声明要用大写,全局变量可以是列表、字典。全局变量可以通过global修改,如果全局变量是字典、列表,则可以修改,但不能重新赋值。
NAME = "alex" #全局变量,所有作用域都可读,全局变量的声明要大写 #NAME = [123,456,789] #如果全局变量是列表字典,则可以修改,但不可重新赋值 def fl(): age = 18 global NAME #修改全局变量,对全局变量重新赋值,需要先global NAME = "123" #局部变量,只对当前作用于生效 print(age,NAME) def f2(): age = 19 print(age,NAME) fl() f2()
定义的字符串、数字格式的全局变量不能再局部变量中直接修改,但定义的列表,字典等全局变量可在局部变量中直接修改:
names= ["dayi",18,"boy"] defchange_name(): names[0] = "liu" print("inside func",names) print(names) change_name() print(names)
例:用函数实现登录功能
def login(username,password): f = open("db",‘r‘) #打开db.txt文件,’r’代表读取 for line in f: line_list = line.split("|") #一行一行读取,使用“|”分隔 if line_list[0] == username and line_list[1] == password: return True def register(username,password): f = open("db",‘a‘) #打开db.txt文件,’a’代表追加 temp = "\n" + username + "|" + password f.write(temp) #向db.txt中写入 f.close() #关闭并生效 def main(): t = input("1:登录;2:注册") if t == "1": user = input("请输入用户名:") pwd = input("请输入密码:") r = login(user,pwd) if r: print("登录成功") else: print("登录失败") elif t == "2": user = input("请输入用户名:") pwd = input("请输入密码:") register(user,pwd) main()
同时,新建db.txt文件,输入:dayi123|dayi123
三、三元(三目)运算及lambda表达式
1、三元运算
if 1 ==1: name= "liu" else: name= "sb" #等同于: name = "liu" if 1 == 1 else "sb"
2、lambda表达式(匿名函数)
def f1(a1,a2): return a1 + a2 + 100 ret = f1(10,12) print(ret) #等同于 f2 = lambda a1,a2: a1 +a2 + 100 ret2 = f2(10,12) print(ret2)
3、中括号中的条件判断以及循环举例:
a = range(10) print([i for i in a if i<5])
输出结果为: [0, 1, 2, 3, 4]
四、递归
1、递归:
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
2、递归算法特点:
(1)递归就是在过程或函数里调用自身。
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
3、递归举例——阶乘
def func(num): if num == 1: return 1 return num * func(num-1) x = func(7) print(x)
五.高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
#!/usr/bin/env python # Author:dayi123 def fuc(a,b,f): return f(a)+f(b) #将a、b的值交给函数f处理后求和再返回 add = fuc(7,-10,abs) #将内置函数abs传递给f print(add)
本文出自 “dayi123” 博客,请务必保留此出处http://dayi123.blog.51cto.com/12064061/1917700
Python基础之函数