函数1

函数目录:

  1.函数的定义和调用

  2.函数的参数种类

  3.认识魔法变量参数

  4.参数的使用顺序

函数

  Python中函数的定义:函数是逻辑结构化和过程化的一种编程方式。

  函数是可以重复使用的程序段。在开发程序时,需要某段代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数

  它们允许你给一块语句一个一个名称,然后你可以在你的程序的任意地方使用这个名称任意多次地运行这个语句块。这被称为函数调用。我们已经使用了许多内置的函数,比如len(),abs(),range()等。

 

函数的定义和调用

函数的定义

  •  空函数

  如果想定义一个什么事也不做的函数,可以用 pass 关键字。

def func_name():
    pass

 pass 语句什么都不做,那有什么用呢?实际上 pass 可以用来作为占位符,比如现在还没想好怎么写函数的代码,以后再实现,就可以先放一个 pass ,让代码能运行起来。

 

  • 非空函数

  函数通过def关键字定义,def关键字后跟一个函数的 标识符 名称,然后跟一对圆括号,圆括号之中可以包括一些变量名,改行以冒号结尾,接下来是一块语句,它们是函数体

 

声明函数的一般形式如下:

def 函数名(参数列表):
    '''函数文档说明'''
    函数语句
    return 返回值

说明如下:

  1、函数代码块以def关键字开头,后接函数标识符名称和小括号()。

  2、任何传入参数和自定义变量必须放在圆括号中间,圆括号之间可以用于定义参数。

  3、函数体的第一行语句可以选择性地使用文档字符串-----》用于存放函数说明。

  4、函数内容以冒号起始,并且缩进。

  5、return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的return相当于返回None。

  其中参数列表和返回值不是必须的,return后也可以不跟返回值,甚至连return也没有。

  对于return后没有返回值和没有return语句的函数都会返回None值

  有些函数可能既不需要传递参数,也没有返回值。

  没有参数时,包含参数的圆括号也必须写上,圆括号后面也必须跟上冒号

  举一个简单的例子:

def info():    # 没有参数,也没有返回值的函数
    '''打印信息'''
    print({'name':'jxh','age':18})

info()    # 调用函数

 函数的调用

函数定义后,我们就具备了实现某种功能的代码。执行这些代码,只需要调用函数。

函数调用形式:

函数名()

比如上面我们已经定义好了info()函数,现在我们调用:

info()

现在整体写出代码:

# 定义函数
def info():    
    '''打印信息'''
    print({'name':'jxh','age':18})

# 调用函数
info()    

运行,结果为:

{'name','jxh','age':18}

练习:定义函数实现函数调用函数能够输出姓名,年龄。

def func1(name, age):
    print('name:{};age:{}'.format(name, age))

def func2(name, age):
    func1(name, age)        #  调用func1函数

func2('张三', 18)    # name:张三,age:18
练习

 

函数文档说明

在上面代码的基础上,使用help()帮助函数

help(info)    # 查看函数的帮助信息

运行后,结果为

Help on function info in module __main__:

info()
    打印信息

可以看到,help()返回info()函数的相关说明。

直接查看文档说明  方法名.__doc__

print(info.__doc__)
# 打印信息

 

函数参数

假如我们需要定义一个函数计算两个数的和,有人设计如下函数:

def my_sum():
    x = 10
    y = 10
    print(x + y)

my_sum()    # 20

这样可以吗?

这个函数只能实现10+10的结果,并不具备通用性。

为了让这个函数更具有通用性,我们可以添加参数:

def my_sum(x , y):
    print(x + y)

my_sum(15,30)    # 调用

○ 参数调用的位置顺序

我们看以下例子:

>>> def test(x , y):
...     print(x)
...     print(y)
...
>>> test(10,20)
10
20
>>> test(x = 10,y = 20)
10
20
>>> test(y = 20,x = 10)
10
20
>>> test(10,y = 20)
10
20
>>> test(x = 10,20)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
View Code

 由此我们可以得出:

  如果一个函数有参数,并且参数没有默认值的情况下;不传递参数,这个程序将会报错:required positional arguments:

  a、传递实际位置参数时,如果不指定名称,需要将实际参数和方法的形式参数位置一一对应。

  b、传递实际关键字参数时,必须要对应形式参数的名称,并且不能出现重复的名称

  c、位置参数必须将放在第一位

 

函数返回值

这里形象的解释一下函数:函数就是把一堆代码,打包放在那里,比如说一个发邮件的功能,然后这个功能被调用,说到这里大家都会想知道,我们调了,但是调的一个结果是啥?有没有成功?如果成功,干A事情,如果不成功做B事情。

返回值的定义:函数外部的代码要想获得函数的执行结果,就可以在函数里面使用return语句把结果返回。

 

函数参数种类

首先,了解两个概念:形参和实参

  ○  1)形参:

    只有在被调用时才分配内存单位,在调用结束时,即刻释放所分配的内存单位,因此,形参只在函数内部有效,函数调用结束返回主调用函数后则不能再使用该形参变量;

  ○  2)实参:

    实参可以是常量,变量,表达式,函数等,无论实参是何种类型的量,在进行函数调用的时,它们都必须有确定的值,以便把这些值传给形参,因此应预先用赋值,输入等办法使参数获得确定值。

>>> def test(x , y):    # x,y ---->形式参数
...     print(x)
...     print(y)
...
>>> test(10,20)    # 10,20  ----->实际参数
10
20

a、形参就是一把椅子,放在这里,占个位置而已,直到有人调用,赋值的时候才会分配内存单位,在调用结束,即刻释放

b、实参,就是实实在在存在,什么类型都接受;

 

1.位置参数

def user_info(name, age, job, hobby):
    print('用户信息'.center(16, '-'))
    print('\tName:\t', name)
    print('\tAge:\t', age)
    print('\tJob:\t', job)
    print('\tHobby:\t', hobby)
    print('end'.center(20, '-'))


user_info('张三', 18,'IT', 'Sing')

# 输出结果
------用户信息------
    Name:     张三
    Age:     18
    Job:     IT
    Hobby:     Sing
--------end---------
位置参数

 位置参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

 

2.默认值参数

假如我们设置hobby值为默认,即hobby = ''Coding''

def user_info(name, age, job, hobby='Coding'):# 将hobby默认值设为Coding
    print('用户信息'.center(16, '-'))
    print('\tName:\t', name)
    print('\tAge:\t', age)
    print('\tJob:\t', job)
    print('\tHobby:\t', hobby)
    print('end'.center(20, '-'))


user_info('张三', 18,'IT')    # 不传入参数,hobby即为默认值
user_info('张三', 18,'IT', 'Sing')    # 传入参数,则改变hobby值

默认值参数
默认值参数

 

通过观察,可知:

  如果定义了默认参数,在调用的时候,不给实参,就会调用默认参数。

  如果函数定修改为:

user_info('张三', 18, hobby='Sing', 'IT')

运行将会报错:

user_info('张三', 18,hobby='Sing', 'IT')
                                        ^
SyntaxError: positional argument follows keyword argument

因此,默认参数必须要放到位置参数的后边;

 

3.关键字参数

正常情况下,给函数传参数要按顺序,不想按照顺序就可以用关键字参数,只需指定参数名即可(指定参数名的参数就叫关键字参数)  

def user_info(name, age, job, hobby='Coding'):
    print('用户信息'.center(16, '-'))
    print('\tName:\t', name)
    print('\tAge:\t', age)
    print('\tJob:\t', job)
    print('\tHobby:\t', hobby)
    print('end'.center(20, '-'))

user_info('张三', age = 18, job = 'IT', hobby = 'Sing')    # 传参时,关键字参数可以位置改变
user_info('张三', 18, 'IT', 'Sing')    # 不传关键字时,必须顺序一一对应

思考以下两种使用方法是否可以?

user_info('张三', age = 18, 'IT', 'Sing')    
user_info('张三', 18, 'IT', age = 19)    

 

user_info('张三', age=18, 'IT', 'Sing')
# 报错如下:关键字参数必须放在位置参数后面
    user_info('张三', age=18, 'IT', 'Sing')
                               ^
SyntaxError: positional argument follows keyword argument

user_info('张三', 18, 'IT', age=19)
# 报错如下:位置参数已经对应有age 18了,不能再出现重复的!
    user_info('张三', 18, 'IT', age=19)
TypeError: user_info() got multiple values for argument 'age'

关键字参数必须放在位置参数(以位置顺序确定对应关系的参数)之后。

 

4.不定参数

Python的不定参数,主要是指 *args**kwargs 这两个魔法变量。那么它们到底是什么?

其实并不是必须写成 *args**kwargs。只有变量前面的 * (星号)才是必须的。也可以写成 * var 和 **vars。而写成 *args 和 **kwargs 只是一个通俗的命名约定。

*args 和 **kwargs 主要用于函数定义。我们可以将不定义数量的参数传递给一个函数。

这里的不定的意思是:预先并不知道,函数使用者会传递多少个参数,所以在这个情况下使用这两个关键字。

*args 的用法

 *args 是用来发送一个非键值对的任意数量的可变数量的参数列表给一个函数。

下面我们举例来帮助大家理解:

def uncertain_para(para, *args):
    print('普通位置参数', para)
    print('不定参数:', args)
    print(type(args))  # 元组类型
    for arg in args:
        print('逐一输出不定参数:', arg)

uncertain_para(1, 2, 3, 45)

运行结果:

普通位置参数 1
不定参数: (2, 3, 45)
<class 'tuple'>
逐一输出不定参数: 2
逐一输出不定参数: 3
逐一输出不定参数: 45

我们可以看出,在这个例子中,para接收了传递的第一个参数,而args则是由所有其他位置参数组成的元组。

 

**kwargs  的用法

**kwargs  允许我们将不定长度的键值对,作为参数传递给一个函数。

当我们想要在一个函数里面处理带名字的参数时,就可以使用 **kwargs 

比如:

def uncertain_para_key(**kwargs):
    print(type(kwargs))    # 字典类型
    print(kwargs)    

uncertain_para_key(name='张三', age=18, sex='male')

运行后输出:

<class 'dict'>
{'name': '张三', 'age': 18, 'sex': 'male'}

 

*args**kwargs  的使用

def test_args_kwargs(para1, para2, para3):
    print('para1', para1)
    print('para2', para2)
    print('para3', para3)


args = ('abc', 6, 9)
print(test_args_kwargs(*args))  # 对于不定参数,可以直接传入list或tuple,只需要在参数前面添加一个*
kwargs = {'para1': 3, 'para2': 10, 'para3':[1,2,3]}
print(test_args_kwargs(**kwargs))  # 对于关键字参数,可以直接传入一个dict,只需要在参数前加上**

 

运行结果:

para1 abc
para2 6
para3 9
None
para1 3
para2 10
para3 [1,2,3]
None

注意这里传递键值参数时,需要满足参数数量一致,否则会报错。

 

标准参数与 *args**kwargs  在使用时的顺序

那么如果你想在函数里面同时使用所有这三种参数,顺序是这样的:

func(fargs,*args,**kwargs)

举例如下:

def test_args_kwargs(para1, *para2, **para3):
    print('para1', para1)
    print('para2', para2)
    print('para3', para3)


print(test_args_kwargs(1, 2, 3, 4, a=5, b=6, c=7))

输出结果为:

para1 1
para2 (2, 3, 4)
para3 {'a': 5, 'b': 6, 'c': 7}
None

Over

posted @ 2019-04-08 11:57  下一站守候丶  阅读(203)  评论(0)    收藏  举报