函数
1、函数是什么?
函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫 做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
2、使用函数的好处:
(1)简化代码
(2)提高代码的复用性
(3)代码可扩展
3、python中函数的定义:
定义函数使用def关键字,后面是函数名,函数名不能重复
1
2
def fun():#定义一个函数,后面是函数名
print("Hello World")#函数体
4、函数的参数
函数在调用的时候,可以传入参数,有形参和实参
形参:
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。
实参:
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
函数调用结束返回主调用函数后则不能再使用该形参变量。
简单点说,形参就是函数接收的参数,而实参就是你实际传入的参数。
1
2
3
def calc(x,y):#定义一个函数,参数有x和y,x和y就是形参
print(x*y)#输出x乘以y的值
calc(5,2)#调用上面定义的函数,5和2就是实参
举个例子:
def hello(): #定义函数
#pass占位
print('hello') #函数体#调用函数
hello()#函数不调用不会被执行
defwrite_file(file_name, content):
with open(file_name,'w', encoding='utf-8') as f:
f.write(content)#调用函数
write_file('函数', '今天学习函数')
write_file('函数2', '今天学习函数2') #可调用多次
函数的返回值
每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None。
函数也可以有多个返回值,如果有多个返回值的话,会把返回值都放到一个元组中,返回的是一个元组。
为什么要有返回值呢,是因为在这个函数操作完之后,它的结果在后面的程序里面需要用到。
函数中的返回值使用return,函数在遇到return就立即结束。
举个例子:
defread_file(file_name):
with open(file_name, encoding='utf-8') as f:
content=f.read()#print(content)
return content #函数的返回值
#函数没有写返回值的时候,默认返回的是None
result= read_file('函数')print(result)#return俩作用:
#1、返回数据
#2、函数里只要遇到return(return必须写子函数里面),函数立马结束
deft():for i in range(5):print('ccx')returnt()
函数练习
#1、传参#2、把入参转成字符串#3、判断参数小数点的个数是否是为1#4、判断小数点前面的是否为整数#5、判断小数后面是否为整数
defis_float(s):
s=str(s)if s.count('.') == 1:
left, right= s.split('.') #1.1[1,1]
if right.isdigit() andleft.isdigit():if int(right) != 0 or int(left) != 0: #0.0判断是否不是0.0
returnTrueif left.startswith('-') and left.count('-') == 1:
num= left[1:]if num.isdigit() andright.isdigit():if int(right) != 0 or int(left) !=0:returnTruereturnFalseprint(is_float('-0.1'))
运行结果:
True
函数的四种形参类型:
1、位置参数:
位置参数,字面意思也就是按照参数的位置来进行传参,比如说上面的calc函数,x和y就是位置参数(必传的),有几个位置参数在调用时就传几个,否则报错。
那如果有多个位置参数的话,记不住哪个位置传哪个了怎么办,可以使用位置参数的名字来指定调用。
举个例子:
#位置参数
def b(name, age): #必填参数,位置参数,一一对应
passb('ccx', 18)
比如,上面的那个calc函数也可以使用calc(y=1,x=2)这样来调用,这种调用方式叫做关键字传参。
2、默认参数:
默认参数就是在定义形参的时候,给函数默认赋一个值。
比如说数据库的端口,默认给它一个值,这样就算你在调用的时候没传入这个参数,它也是有值的。
so,默认参数不是必填的,如果给默认参数传值的话,它就会使用你传入的值。如果使用默认值参数的话,必须放在位置参数后面定义。
举个例子:
#默认值参数
def op_file(file, content=None):print(file)print(content)
op_file('user.txt', 'user1')
运行结果:
user.txt
user1
默认值参数练习
#默认值参数练习
def op_file(file, content=None): #默认值参数
with open(file, 'a+', encoding='utf-8') as f:ifcontent:
f.write(str(content))else:
f.seek(0)
result=f.read()return result
3、可变参数:
可变参数用*来接收,后面想传多少个参数就传多少个,如果位置参数、默认值参数、可变参数一起使用的的话,可变参数必须在位置参数和默认值参数后面。
可变参数也是非必传的。
#可变参数
def send_sms(*args): #‘*’个数不受限制,放到一个list里面
print(args)
send_sms(2, 4, 5, 68)#注:#这个是不是必须传的--非必传#是否限制参数个数--不限#args是个什么--元组
运行结果:
(2, 4, 5, 68)
4、关键字参数:
关键字参数使用**来接收,后面的参数也是不固定的,想写多少个写多少个,当然也可以和上面的几种一起来使用,如果要一起使用的话,关键字参数必须在最后面。
使用关键字参数的话,调用的时候必须使用关键字传参。关键字参数也是非必传的。
#关键字参数
def t(**kwargs): #传入时必须得指定关键字
print(kwargs)
t(age=18, name='bj')
运行结果:
{'age': 18, 'name': 'bj'}
四种参数混合用(一般很少有人这样用)
必填参数、默认值、可变参数、关键字参数 必须得按照这个顺序来
必填参数必须写到默认值参数前面
默认参数必须在可变参数前面
可变参数必须在关键字参数前面
#四种参数连用
def test(name, content=None, *args, **kwargs):print(name)print(content)print(args)print(kwargs)
举个例子:
deftest(name, phone, qq, addr, sex):print(name)print(phone)print(qq)print(addr)print(sex)
test('183', 'mingzi', '1111', 'beijing', '女') #须一一对应
test(age=36, addr='beijing', qq='1111', sex='xxx', name='xx') #指定关键字参数阔以
test('xiaoming', '1823423', qq='xxx', sex='xxx', addr='xxxx') #这个阔以
test('xiaoming', '1823423', qq='xxx', sex='xxx', 111) #错误的,不能这么写
open('file', 'w', encoding='utf-8')