函数
-
将实现特定功能的代码封装,起个名字,通过该名字可以调用该函数的功能
-
语法:
# 声明函数 def 函数名([参数1,......]): 语句1 ...... [return 值1,......] # 调用函数 函数名([参数1,......])
例1:声明一个函数,接收一个整数n,计算出1-n的和
# 声明函数
def get_sum(n):
s = 0
for i in range(1, n+1):
s += i
print(s)
# 调用函数
get_sum(100)
get_sum(1000)
get_sum(10000)
例2:声明一个函数,实现md5加密
import hashlib
def get_md5(s):
md = hashlib.md5(s.encode('utf8')) # md5加密,返回一个md5对象
return md.hexdigest() # 返回密文
f = get_md5('123456') # 将函数返回值赋值给变量f
print(f)
例3:
import hashlib
accounts = {'1001':['张三','e10adc3949ba59abbe56e057f20f883e',1000]}
def get_md5(s:str):
md = hashlib.md5(s.encode('utf8')) # md5加密,返回一个md5对象
return md.hexdigest() # 返回密文
def login():
# 输入账号
account = input('账号:')
# 检查账号是否存在
if account in accounts:
passwd = input('密码:')
# 检查密码是否正确
if get_md5(passwd) == accounts[account][1]:
name = accounts[account][0] # 姓名
balance = accounts[account][-1] # 余额
print(f'尊敬的 {name.replace(name[1], "*", 1)} 先生/女士,您的账户余额为 {balance:.2f} 元')
else:
print('密码错误,请重新输入')
else:
print('账号不存在,请重新输入')
login()
参数
- 形参:声明函数时定义的参数
- 位置参数(必须参数):定义参数时只需要顶一个参数名即可,调用函数时必须给位置参数传值
- 默认参数:通过
key=value
方式定义默认参数,如果存在位置参数必须放在位置参数的后面,调用函数时可以不给默认参数传值(此时函数内部使用参数默认值)
def func(a,b,c=10):
print(f'a={a}\tb={b}\tc={c}')
func(1,2) # 不给c传值,使用默认值10
func(1,2,3) # 给c传值3,使用实际传入的值
def f1(a,b=10,*args,**kwargs):
print(a,b)
print(args)
print(kwargs)
f1(10) # 10->a,args为空元组,kwargs为空字典
f1(10,20) # 10->a,20->b,args为空元组,kwargs为空字典
f1(10,20,30,40,50) # 10->a,20->b,args=(30,40,50),kwargs为空字典
f1(10,20,30,40,50,aa=100,bb=200) # 10->a,20->b,args=(30,40,50),kwargs={'aa':100,'bb':200}
f1(10,aa=100,bb=200) # 10->a,args为空元组,kwargs={'aa':100,'bb':200}
变量作用域
- 全局变量:在函数外部声明的变量,可以在函数内部以及函数外部使用
- 可变数据类型:在函数内部可以直接调用相关的方法修改变量值
- 不可变数据类型:在函数内部只能引用变量的值,不能直接修改变量
- 局部变量:在函数内部声明的变量,只能在函数内部使用
- global:在函数内部修改全局变量(不可变数据类型),需要先通过global声明
a,b = 10,20 # 全局变量
li = [1,2,3]
def func():
global a # 声明,表示函数内操作的变量a是全局变量
a = 100 # 修改全局变量
li.append(100) # 修改全局变量
s = a+b # 局部变量
print(s)
func()
print(a,b)
匿名函数
- 语法:
lambda [参数1,......]:返回值
,参数可选的,返回值必须有,并且只能有1个
例:列表,指定排序内容
li = [['张三',99],['李四',89],['杨雨',93]]
li.sort(key=lambda x:x[1])
print(li)
递归函数
- 在函数内部通过return语句返回函数本身的调用
- 注意:递归需要向已知条件方向进行;递归的层数不超过1000层
已知f(x)=f(x-1)+3,f(0)=5,求f(3)的值
f(3)=f(2)+3=f(1)+3+3=f(0)+3+3+3=14
def f(x):
if x == 0:
return 5
return f(x-1)+3
print(f(3))
例1:声明一个函数,接收若干个值(可以是字符串,数字),将这些内容拼接成一个字符串并返回将其加密后的密文(md5)
import hashlib
def get_md5(*args):
if not args:
print('未传入参数')
return False
tmp = [str(i) for i in args] # 将元组中的每个元素转换为字符串
s = ''.join(tmp) # 将列表中的每个元素拼接成一个字符串
return hashlib.md5(s.encode('utf8')).hexdigest() # 返回密文
r = get_md5('asd',123,123,'asdasd')
print(r)
r = get_md5()
print(r) # False
可变参数
- *args,接收若干以value传入的参数,将其封包到元组args中
- **kwargs,接收若干key=value传入的参数,将其封包到字典kwargs中
实参:调用函数时传入值
- 以value传入,主要是为位置参数、默认参数、*args可变参数传值
- 以key=value传入,主要是为位置参数、默认参数、**kwargs可变参数传值
函数名:必须符合标识符的命名规范
参数:可选的,可以有多个
return:用于返回函数处理结果,可选的,可以返回多个值。如果没有return语句,则默认返回None