函数、参数、局部函数and函数内变量修改、嵌套函数

一、函数

函数的定义:将一组语句的集合通过一个函数名封装起来 ,想要执行这个函数,只需要调用函数名即可。

函数的三种类型: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 2448163922360

  1.在函数内部可以调用全局变量

  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 2691644231896

4.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
>>>33
age = 11
def func1():
    age =22
    print(age)
    def func2():

        print(age)
    func2()
func1()

>>>22
>>>22
age = 11
def func1():

    print(age)
    def func2():

        print(age)
    func2()
func1()

>>>11>>>11
age = 11
def func1():
    def func2():
        print(age)
    age = 22
    func2()
func1()

>>>22
age = 11
def func1():
    global age
    def func2():
        print(age)
    func2()
    age = 22  # 此处修改了全局函数!!!
func1()
print(age)

>>>11
>>>22  
age = 11
def func1():
    global age
    def func2():
        print(age)
    age = 22  # 修改了全局变量
    func2()
func1()
print(age)

>>>22
>>>22

 

posted @ 2021-01-16 17:02  HolmesWu  阅读(149)  评论(0编辑  收藏  举报