函数
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() # 函数不调用不会被执行 def write_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就立即结束。
举个例子:
def read_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必须写子函数里面),函数立马结束 def t(): for i in range(5): print('ccx') return t()
函数练习
# 1、传参 # 2、把入参转成字符串 # 3、判断参数小数点的个数是否是为1 # 4、判断小数点前面的是否为整数 # 5、判断小数后面是否为整数 def is_float(s): s = str(s) if s.count('.') == 1: left, right = s.split('.') # 1.1[1,1] if right.isdigit() and left.isdigit(): if int(right) != 0 or int(left) != 0: # 0.0判断是否不是0.0 return True if left.startswith('-') and left.count('-') == 1: num = left[1:] if num.isdigit() and right.isdigit(): if int(right) != 0 or int(left) != 0: return True return False print(is_float('-0.1'))
运行结果:
True
函数的四种形参类型:
1、位置参数:
- 位置参数,字面意思也就是按照参数的位置来进行传参,比如说上面的calc函数,x和y就是位置参数(必传的),有几个位置参数在调用时就传几个,否则报错。
- 那如果有多个位置参数的话,记不住哪个位置传哪个了怎么办,可以使用位置参数的名字来指定调用。
举个例子:
# 位置参数 def b(name, age): # 必填参数,位置参数,一一对应 pass b('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: if content: 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)
举个例子:
def test(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')