学习python的day9之函数

一、函数基础

函数就是将一段具有独立功能的代码整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求。

函数在开发过程中,可以更高效的实现代码重用。

1.定义函数

语法:

def 函数名(参数):

  代码

def a():
    print('hello')
a()
'''
输出:
hello
'''

注意:

在不同的需求中,参数可有可无。

函数必须先定义后使用。

如果没有调用函数,函数内部的代码不是执行

2.返回值(return)

作用:

负责返回函数值

退出当前函数:导致return下方的所有代码(函数体内部)不执行

def a():
    return 's'
    print('ssa')
print(a())
'''
输出:
s
'''

3.函数说明文档

作用:保存函数解释 说明的信息

help(函数名)

def sum1(a,b):
    '''
    求和函数
    :param a:第一个值
    :param b: 第二个值
    :return: 两数之和
    '''
    return a+b
help(sum1)

'''
输出:
Help on function sum1 in module __main__:

sum1(a, b)
    求和函数
    :param a:第一个值
    :param b: 第二个值
    :return: 两数之和
'''

4.嵌套调用

注意函数A()不能嵌套调用在它后面定义的函数

def A():
    print('hello')

def B():
    print('word')
    A()
B()

'''
输出:
word
hello
'''

函数的参数:函数调用到时候可以传入真实数据,增大函数使用的灵活性

形参:函数定义时书写的参数(非真实数据)

实参:函数调用时书写的参数(真实数据)

二、函数提高

1.变量作用域

变量作用域指定是变量生效的范围,主要分为全局变量和局部变量

1)局部变量:

局部变量是定义在函数体内部的变量,只在函数体内部生效

作用:在函数体内部,临时保存数据,即当函数调用完成之后,销毁局部变量

2)全局变量:

全局变量指在函数内部、外部都生效的变量

2.修改全局变量

语法:global 变量

a = 100
b = 50
def A():
    a = 200
    print(a)
    global b
    b = 300
    print(b)
A()
print(a)
print(b)
'''
输出:
200
300
100
300
'''

3.返回值做参数传递

def A():
    return 100
def B(a):
    print(a)
B(A())
'''
输出:
100
'''

4.函数的多返回值

因为函数遇到return会退出该函数,所有不能像下面那样写

def A():
    return 100
    return 200
result =A()
print(result)
'''
输出:
100
'''

应该这么写

def A():
    return 100,200
result =A()
print(result)
'''
输出:
(100,200)
'''

return返回多个返回值时,默认返回元组

return后面可以直接书写元组、列表、集合、字典,返回多个值

5.函数的参数

1)位置参数

def A(name,age,sex):
    print(f'你的名字时{name},年龄是{age},性别是{sex}')
A('zhang',18,'')
'''
输出:
你的名字时zhang,年龄是18,性别是男
'''

注意:传递和定义参数的位置及个数必须一致。

2)关键字参数

函数调用,通过“键=值”形式加以指定。可以使函数更加清晰、容易使用,同时清除了参数的顺序需求。

def A(name,age,sex):
    print(f'你的名字时{name},年龄是{age},性别是{sex}')
A('zhang',age=18,sex='')
A('zhang',sex='',age=18)
A('zhang',18,sex='')
A(name='zhang',age=18,sex='')
'''
输出:
你的名字时zhang,年龄是18,性别是男
你的名字时zhang,年龄是18,性别是男
你的名字时zhang,年龄是18,性别是男
你的名字时zhang,年龄是18,性别是男
'''

注意:如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序

3)缺省参数(默认参数)

缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传入该默认参数的值

注意:所有位置参数必须出现在默认函数前,包括函数定义和调用

def A(name,age,sex=''):
    print(f'你的名字时{name},年龄是{age},性别是{sex}')
A('zhang',age=18,)
A('zhang',18,sex='')
'''
输出:
你的名字时zhang,年龄是18,性别是男
你的名字时zhang,年龄是18,性别是女
'''

 

注意:在函数调用时,给默认参数传值则修改默认参数值,否则使用这个默认值

4)不定长参数

不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可以

用包裹(packing)位置参数,或包裹关键字参数,来进行参数传递,会显得非常方便。

4.1)包裹位置传递

def A(*args):
    print(args)
A('tom')
A('sam',18)

'''
输出:
('tom',)
('sam', 18)
'''

注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递

4.2)包裹关键字传递

def A(**kwargs):
    print(kwargs)
A(name='tom')
A(name='sam',age=18)

'''
输出:
{'name': 'tom'}
{'name': 'sam', 'age': 18}
'''

包裹关键字传递返回的是一个字典

综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。

5.元组拆包

def A():
    return 100,200
num1,num2 = A()
print(num1)
print(num2)
'''
输出:
100
200
'''

6.字典拆包

在调用带有多值参数的函数时,如果希望:

  ○将一个 元组变量, 直接传递给 args

  ○将一个 字典变量, 直接传递给 kwargs

就可以使用拆包, 简化参数的传递, 拆包 的方式是 :

  ○在 元组变量前, 增加一个 *

  ○在 字典变量前, 增加两个*

不在元组和字典变量前增加*

def demo(*args, **kwargs):
    print(args)
    print(kwargs)
gl_nums = (1, 2, 3)
gl_dict = {"name": "小明", "age": 18}
demo(gl_nums, gl_dict)
'''
输出:
((1, 2, 3), {'name': '小明', 'age': 18})
{}
'''

在元组和字典变量前增加*

def demo(*args, **kwargs):
    print(args)
    print(kwargs)
gl_nums = (1, 2, 3)
gl_dict = {"name": "小明", "age": 18}
demo(*gl_nums, **gl_dict)
'''
输出:
(1, 2, 3)
{'name': '小明', 'age': 18}
'''

由此可以发现,没拆包前,字典会在一个元组中被返回,拆包后,才会返回一个字典

7.交换变量的值

第一种

a, b = 1, 2
c=a
a=b
b=c

第二种

a, b = 1, 2
a, b = b, a

8.引用

在python中,值靠引用来传递的

id()可以求变量指向的地址

a = 12
print(id(a))
'''
输出:
140703664052224
'''

引用可以当作实参传递

不可变类型的数据被改变之后,会为数据再开辟一个地址空间,所以内存地址会变

可变类型数据被改变之后,不会为数据开辟地址空间,所以内存地址不改变

9.可变类型和不可变类型

所谓可变类型与不可变类型是指:数据能够直接修改,如果能直接修改就是可变,否则就是不可变

可变类型:列表、字典、集合

不可变类型:整型、浮点型、字符串、元组

posted @ 2020-10-19 00:23  as_scheduled  阅读(107)  评论(0编辑  收藏  举报