一、函数
函数的定义:将一组语句的集合通过一个函数名封装起来 ,想要执行这个函数,只需要调用函数名即可。
函数的三种类型:1.无参函数,2.有参函数.(函数体需要外部传递进来信息的)3.空函数
函数的特性:1.减少重复的代码 2.使程序变得可扩展 3.使程序变得易维护
def sayhi(a,b):
res = a + b
print(res)
sayhi(5,10)二、参数
2.1 形参(在函数定义时定义的参数,相当于变量名)和实参(在调用函数时传入的值,相当于变量值)
def sayhi(a,b): # (a,b)形参(占位)
res = a + b
print(res)
sayhi(5,10) # (5,10) 实参(实际存在的值)2.2 默认参数(在函数定义阶段,就已经为形参赋值【本质上是内存地址】的参数),默认参数不要定义成可变类型!!!
默认参数可填可不填;但要按顺序传;但必须放在末尾!!!
def stu_infor(name,age,country='CN'):
print(name,age,country)
stu_infor('jake',22,)
stu_infor('BOB',24,'JP')
stu_infor('ASD',12,'KM')可变长参数
如果形参中出现*变量名,传递的参数就可以不再是固定个数,传过来的参数都会打包成元组
方式一:
def stu_info(name,*args,):
print(name,args)
stu_info('jake',45,23,32,11)
>>>>jake (45, 23, 32, 11) # 后面的数字都会传递给args方式二:
def stu_info(name,*args,):
print(name,args)
stu_info('jake',*[45,23,32,11])2.3关键参数(在定义函数时,*后定义的参数)
可以不按顺序传,这时就会用到关键参数,只需要指定参数名就可以,但是必须放在位置参数之后!
def stu_infor(name,age,country='CN'):
print(name,age,country)
stu_infor(name='jake',age=23,country='JP')2.4 非固定参数
def stu_info(name,*args,**kwargs):
print(name,args,kwargs)
stu_info('jake',22,'100w',addr='北京', num=1231214124212)
>>>>>>jake (22, '100w') {'addr': '北京', 'num': 1231214124212}def stu_info(name,*args,**kwargs):
print(name,args,kwargs)
d = {'addr':'北京','num':'12312312424'}
stu_info('jake',22,'100w',**d)
# >>>>>>jake (22, '100w') {'addr': '北京', 'num': '12312312424'}三、函数的返回值
定义: 函数外部的代码,想要获取函数的执行结果,使用return语句返回结果
return会结束函数,后面的代码不会运行;如果未指定return就返回None.
def stu_info(name,age,**kwargs):
print(name,age,kwargs)
if age > 22:
return False
else:
return True
stu = stu_info('JAKE',24,cuontry='JP')
print(stu)
>>>>>>>>JAKE 24 {'cuontry': 'JP'}
>>>>>>>>False函数只能返回一个值;如果需要返回多个值,使用逗号分隔开,返回时回事一个元祖的类型,这个元祖代表的是一个值!
四、函数的局部变量
定义:在函数内部的变量,可以在函数内部修改(在局部创建)变量。
name = "jake" # 函数外部,全局变量
def change_name():
name = 'Bob' # 函数内部,局部变量
print(name,id(name))
change_name()
print(name,id(name))
>>>>>>Bob 2448164753624
>>>>>>jake 24481639223601.在函数内部可以调用全局变量
2.如果同一个变量在全局和局部都有,那么调用的顺序应当是由内而外的
4.1 函数内部修改全局变量
name = "jake" # 函数外部
def change_name():
global name # 不建议使用
name = 'Bob' # 函数内部
print(name,id(name))
change_name()
print(name,id(name))
>>>>>>Bob 2691644231896
>>>>>>Bob 26916442318964.2 在函数内部修改数据
列表,字典,集合,元祖 是可以被修改的,而字符串这种是不可以被修改的。
name_list = ["jake",'Bob','rain']
def change_name():
del name_list[2]
name_list[1] = 'Amy'
print(name_list,id(name_list))
change_name()
print(name_list,id(name_list))
>>>>['jake', 'Amy'] 1908083114504
>>>>['jake', 'Amy'] 1908083114504
# 整体的列表内存地址并没有被修改,修改的是列表内部元素的的内存地址!!!五、嵌套函数
5.1.函数内部可以再次被定义,2.要想执行函数就需要被调用
def func1():
print('JAKE')
def func2():
print('Bob')
func2()
func1()为函数传参的两种方式:
方式一:直接把函数需要的参数定义成形参
方式二:利用闭包函数传参
def func():
x = 4
def func2():
print(x)
return func2
res = func()
print(res)
res()5.2函数之间调用的逻辑关系
(一层一层往外面找,函数内部没有的话,就会找全局变量!!!)
age = 11
def func1():
age =22
print(age)
def func2():
age = 33
print(age)
func2()
func1()
>>>22
>>>33age = 11
def func1():
age =22
print(age)
def func2():
print(age)
func2()
func1()
>>>22
>>>22age = 11
def func1():
print(age)
def func2():
print(age)
func2()
func1()
>>>11>>>11age = 11
def func1():
def func2():
print(age)
age = 22
func2()
func1()
>>>22age = 11
def func1():
global age
def func2():
print(age)
func2()
age = 22 # 此处修改了全局函数!!!
func1()
print(age)
>>>11
>>>22age = 11
def func1():
global age
def func2():
print(age)
age = 22 # 修改了全局变量
func2()
func1()
print(age)
>>>22
>>>22
















