场景:
- 代码重复执行
- 代码量特别多超过一屏,可以选择通过函数进行代码的分割
函数的基本结构
#函数的定义 def 函数名(): # 函数内容 pass #函数的执行 函数名()
def get_list_first_data(aaa): #aaa形式参数,形参 pass get_list_first_data() #函数被调用内部代码才会执行 get_list_first_data(1): #实际参数,实参
函数4种情况:
- 情况1
def f1(): pass fi()
- 情况2
def f2(a1): pass f2(123)
- 情况3
def f3(): return v1 = f3()
- 情况4
def f4(a1,a2): return a1 + a2 v2 = f4(1,7)
def func(name,age,email):
# 函数体(保持缩进一致)
a = 123
print(a)
return 1111
b = 456
print(b)
result = func(1,2,3)
# 函数默认返回值:None
2.参数
- 基本传参
- 任意个数
- 任意类型
def func(a1,a2,a3): print(a1,a2,a3) func(1,"asdf",True)
- 位置传参(调用函数并传入参数)【执行】
def func(a1,a2): print(a1,a2) func(1,3)
- 关键字传参【执行】
def func(a1, a2): print(a1, a2) func(a2=99,a1=2) # 关键字传参数和位置传参可以混合使用(位置传入的参数 > 关键字参数在后 = 总参数个数) def func1(a1, a2, a3): print(a1, a2, a3) # func(1, 2, a3=9) # func(1, a2=2, a3=9) # func(a1=1, a2=2, a3=9) # func(a1=1, 2,3) # 错误
- 默认参数【定义】
def func(a1,a2,a3=9,a4=10): print(a1,a2,a3,a4) func(11,22) func(11,22,10) func(11,22,10,100) func(11,22,10,a4=100) func(11,22,a3=10,a4=100) func(11,a2=22,a3=10,a4=100) func(a1=11,a2=22,a3=10,a4=100) 函数的默认值慎用可变类型,如:列表[] # 如果要想给value设置默认是空列表 # 不推荐(坑) def func(data,value=[]): pass # 推荐 def func(data,value=None): if not value: value = []
- 万能参数
- *args
- 可以接受任意个数的位置参数,并将参数转换成元组。
- 调用函数无 *
def func(*args): print(args) func(1,2,3,4)
- 调用函数有*
def func(*args): print(args) func(*(1,2,3,4)) func(*[1,2,3,4])
- 调用函数无 *
- 只能用位置传参
def func(*args): print(args) # func(1) # func(1,2) func(1,2) # args=(1, 2) func((11,22,33,44,55)) # args=((11,22,33,44,55),) func(*(11,22,33,44,55)) # args=(11,22,33,44,55)
- 可以接受任意个数的位置参数,并将参数转换成元组。
- **kwargs
- 可以接受任意个数的关键字参数,并将参数转换成字典。
- 调用函数无 **
def func(**kwargs): print(kwargs) func(k1=1,k2="alex")
- 调用函数有**
def func(**kwargs): print(kwargs) func(**{'k1':'v2','k2':'v2'}) # kwargs={'k1':'v2','k2':'v2'}
- 调用函数无 **
- 只能用关键字传参
- 综合应用:无敌 + 无敌 => 真无敌
def func(*args,**kwargs): print(args,kwargs) # func(1,2,3,4,5,k1=2,k5=9,k19=999) func(*[1,2,3],k1=2,k5=9,k19=999) func(*[1,2,3],**{'k1':1,'k2':3}) func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})
- 可以接受任意个数的关键字参数,并将参数转换成字典。
- *args
- 严格按照顺序传参数:位置传参。
- 实际参数可以是任意类型,任意个数
- 关键字传参
- 关键字传参数和位置传参可以混合使用(位置传入的参数 > 关键字参数在后 = 总参
func(1,2) #位置传参
func(1,[11,22,3]) #任意类型,任意个数
func({'k1':'k'},[11,22,3])
func(a1=11,a2=22) #关键字传参
#万能参数
*args
接受任意个数的位置参数,并将参数转换成元组
*kwargs
可以接受任意个数的关键字参数,并将参数转换成字典
3.返回值
- 函数没有返回值,默认返回:None
- 函数内部执行过程中遇到return,就终止。
def func1():
return "完成" # 函数每次执行到此,就返回;所以下面代码永远不执行。
for i in range(10):
print(i)
func1()
def func2():
for i in range(10):
print(i)
return "完成"
print(666)
func2()
return 可以返回任意类型
def func():
return (1,2,3)
v = func()
print(v)
# 特殊:返回元组
def func():
return 5,8,"alex"
v = func()
print(v)
4.作用域
- 一个函数就是一个作用域
- 作用域中查找数据规则:优先在自己的作用域找数据,自己没有就去“父级” --> “父级”-->全局。
- 子作用域中只能找父级中的值,无法重新为父级的变量进行赋值。
对全局变量赋值 先 global 找到变量在进行赋值操作 global [变量名] name = "bing" 对上一级变量赋值 nonlocal [变量名] name = "bing"
补充:函数小高级
- 全局变量 用大写
- 函数可以被循环
def func(): print(123) func_list = [func,func,func] func_list[0]() func_list[1]() func_list[2]() for item in func_list: v = item() print(v) #123 None
- 函数可以当参数进行传递
def func(arg): print(arg) def show(): return 999 func(show)
- 函数可以用作字典的value
f1:func1 f2:func2 choice = input('please input:') function_name = info.get(choice) if function_name: function_name() else: print("输入错误")
补充:lambda表达式
- 三元运算,为了解决简单的if else的情况,如:
a = 123 if 1 == 1 else 456 - lambda表达式,为了解决简单函数的情况,如:
def func(a1,a2): if a1 > a2: print(a1) else: print(a2) func = lambda a1,a2: a1 if a1 >a2 else a2 v = func(1111,22) print(v)
总结:
列表所有的方法基本上都是返回None;字符串的所有方法基本上都返回新值