Python学习笔记:函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习笔记:函数相关的知识,希望对你有一定的参考价值。

Python函数

先来看下面代码:

def welcome_info():
    "显示欢迎信息“
    print("Hello World!")
    return 0

如上代码,就定义了一个函数。

调用后的结果为:

welcome_info()     #调用函数

Hello World!       #调用结果

 

这里,我们引用一下Python官方文档对Python函数的定义:

The keyword def introduces a function definition. It must be followed by the function name and the parenthesized list of formal parameters. The statements that form the body of the function start at the next line, and must be indented.

关键字def引入一个函数定义。它必须后接一个作用名(即函数名)以及一对由圆括号包起来的形式参数列(可以为空)。形成函数主体的陈述语句开始于下一行,并且强制缩进。

这里,补充两点:

冒号后的第一行最好是由双引号包起来的说明用的字符串以供程序员本人及他人日后查找及调用时能快速知其功能和意义。养成一个良好的编写习惯最好从头开始。

函数主体的最后一行通常由return语句结束。

上面讲了如何定义一个函数,那么函数具体有什么用呢,看完下面的代码或许你就能明白一些了:

def result():
    print("打下来一只鸟")

def hunt1():
    "打鸟1"
    print("我射了一箭")
    result()

def hunt2():
    print("我开了一枪")
    result()

def hunt3():
    print("我打了一炮")
    result()

hunt1()
hunt2()
hunt3()

运行结果:

我射了一箭
打下来一只鸟
我开了一枪
打下来一只鸟
我打了一炮
打下来一只鸟

当程序中多次需要调用同一个功能时,函数的作用就体现出来了,即函数可以避免重复代码

再看下面的代码:

import time
def result():
    time_format = "%Y-%m-%d %X"
    time_current = time.strftime(time_format)
    print("打下来一只鸟%s" % time_current)

def hunt1():
    "打鸟1"
    print("我射了一箭")
    result()

def hunt2():
    print("我开了一枪")
    result()

def hunt3():
    print("我打了一炮")
    result()

hunt1()
hunt2()
*/hunt3()

结果为:

我射了一箭
打下来一只鸟2017-11-29 17:14:06
我开了一枪
打下来一只鸟2017-11-29 17:14:06
我打了一炮
打下来一只鸟2017-11-29 17:14:06

这里我们看到,只修改第一个函数,其他调用该函数的函数结果都会有所变动,这就是函数的另外两个特性:

一致性

可扩展性

 


 

return语句

先看下面代码:

def welcome_info():
    print("Hello World!")
    return 0
    print("Hello Python!")
    
x = welcome_info()
print(x)

运行结果:

Hello World!
0

当函数执行时,return强制结束并返回0。0是什么意思呢?看下面的代码:

def hunt1():
    "打鸟1"
    print("我射了一箭")

def hunt2():
    print("我开了一枪")
    return 0

def hunt3():
    print("我打了一炮")
    return 2, 69, "Hello Python!", ["bigbang", "bigcock"], {"size":"15 centimeters"}

a = hunt1()
b = hunt2()
c = hunt3()
print(a)
print(b)
print(c)

运行结果:

我射了一箭
我开了一枪
我打了一炮
None
0
(2, 69, Hello Python!, [bigbang, bigcock], {size: 15 centimeters})

由此段代码看出,

没有return语句时,即没有返回值,结果为None;

当返回值为0时,返回object;

当返回值为数字、字符串、列表、字典时,返回一个包含前面所有对象的一个元组tuple。

返回值可以是任意类型任意长度。

 


 

形式参数&实际参数&默认参数&参数组

看下面代码:

def name(a,b):
    print(a)
    print(b)

name("bigbang", "bigcock")

运行结果:

bigbang
bigcock

上面代码中,关键字def后name是此函数的函数名,圆括号内为形式参数a和b。

为什么a和b被称为形式参数呢?

因为在没有给他们赋值之前,他们只是a和b,没有任何实际意义,只是一个正在等待赋值的标识。

当调用函数时,圆括号内给了两个实际参数,bigbang和bigcock,他们的位置与函数名后括号内的形式参数a和b一一对应。

此时实际参数也被称为位置参数

现在有如下代码:

def name(a,b):
    print(a)
    print(b)

name(b = "bigbang", a = "bigcock")

运行结果:

bigcock
bigbang

调用函数name时,括号内指定形式参数的赋值,此时的实际参数被称为关键参数。它们与形式参数的位置无关,但数量必须相对应。

看下面代码:

def name(a, b = "bigbang"):
    print(a)
    print(b)

name("bigcock")

运行结果:

bigcock
bigbang

这个示例中当我们调用函数时并没有给name传递两个值,但输出结果依旧为两个值。

这是因为我们提前在定义函数时已经给形式参数b赋值,这里b = “bigbang”即被称为默认参数

调用时只需给a传递一个实际参数即可。

看如下代码:

def name(a, b = "bigbang"):
    print(a)
    print(b)

name("bigcock", "lovefuck")

结果如下:

bigcock
lovefuck

上面示例中,当调用函数name时,传递了两个实际参数。运行结果中b的赋值由形式参数中定义的“bigbang”变为“lovefuck”。

由此可见,默认参数的一个特点就是:

当调用函数时,默认参数非必须传递。通过默认参数的使用,可以设定在程序中设定一些默认值来提高程序的运行效率。

当有多个实际参数时,可以如下定义:

def numbers(*args):
    print(args)

numbers(23, 62, 79, 1, 28, 99)

结果:

(23, 62, 79, 1, 28, 99)

args为arguments的缩写,*是一个引用方法,计算机语言里表示全部,比如我们想搜索电脑中所有的图片,可以在搜索栏里输入“*.jpg"。这时电脑会自动搜索电脑中所有的JPG格式的图片文件。

在这里当我们调用函数并传递多个参数给args时,args会将所有实际参数封装为一个tuple。

上面实例还可以这样写:

def numbers(a, b, *args):
    print(a)
    print(b)
    print(args)

numbers(23, 62, 79, 1, 28, 99)

结果:

23
62
(79, 1, 28, 99)

定义函数时传递两个形参以及一个参数组,调用时会根据位置将实际参数赋值给形式参数,未分配到形式参数的实际参数则会全部分配给参数组。

继续,看下面示例:

def user_info(**kwargs):
    print(kwargs)

user_info(name = "bigbang", sex = "m", age = "22", hobby = "girl")

运行结果:

{name: bigbang, sex: m, age: 22, hobby: girl}

示例中,kwargs是key word arguments的缩写,意为关键字参数组。

同时可以发现,当我们调用函数时,kwargs会将调用时所传递的关键参数封装为一个字典。

当传递多个类型参数时,需注意以下几点:

默认参数必须写在参数组前面;

调用函数时,位置参数必须在关键参数前面。

经过前面的学习,我们可以写出一个大家比较常见的函数,如果你是游戏玩家的话,可以通过这个函数更容易理解函数中各种参数的定义:

def login(name, pw, difficulty = "normal", *args, **kwargs):
    print(name)
    print(pw)
    print(difficulty)
    print(args)
    print(kwargs)

login("bigbang", "123456", "beginner", "start game", "quit", "previous page", map = "lost temple")

运行结果:

bigbang
123456
beginner
(start game, quit, previous page)
{map: lost temple}

示例中,调用参数时传递的前两个实际参数与形式参数的前两位相对应,第三个位置参数改变了定义中的默认参数的赋值变成了”beginner“,如果没有传递这个位置参数,那么此处的难度就变成了”start game“,这显然不是我们想要的结果,接着后面的三个位置参数全部传给了args,形成了一个tuple,最后的关键参数被传给kwargs。

 

以上是关于Python学习笔记:函数的主要内容,如果未能解决你的问题,请参考以下文章

python学习笔记- 函数

Python 3学习笔记

Python 学习笔记(十三)Python函数

python学习笔记:第七天(函数)

Python学习笔记:函数

Python学习笔记