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)