【Python教程】函数基础

本文详细介绍了Python中函数的定义,包括使用def关键字、参数、文档字符串、return语句。还讨论了如何调用函数,提供了示例。函数返回值可以是任何Python对象,包括无返回值的情况。参数传递时,Python传递的是对象的引用,对于不可变和可变类型有不同的行为。文章通过例子展示了数字和列表类型的参数传递差异。
摘要由CSDN通过智能技术生成

在Python中,采用下面的语法定义函数:

def 函数名(参数):    # 内部代码    return 表达式

例如:

def summer(lis):    """    这里是函数的说明文档,doc的位置    :param lis: 参数列表的说明    :return: 返回值的说明    """    total = 0    for i in lis:        total += i    return total

在定义函数的过程中,需要注意以下几点:

  • 函数代码块以def关键词开头,一个空格之后接函数标识符名称和圆括号(),再接个冒号。

  • 任何传入的参数必须放在圆括号中间。

  • 函数的第一行语句后可以选择性地使用文档字符串—用于存放函数说明。

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

  • 使用return结束函数。默认返回None。

  • return语句依然在函数体内部,不能回退缩进。直到函数的所有代码写完,才回退缩进,表示函数体结束。

如何调用函数?

函数编写出来就是给人调用的。要调用一个函数,必须使用函数名后跟圆括号的方式才能调用函数。调用的同时要根据函数的定义体,提供相应个数和类型的参数,每个参数之间用逗号分隔。Python由于动态语言的特点,在做语法和词法分析检查的时候,并不会对参数类型进行检查,但在执行过程中,如果参数类型不符合函数内部运行机制的话,会弹出相应的错误,例如:

>>> all(0, -1, 3)Traceback (most recent call last):  File "<pyshell#0>", line 1, in <module>    all(0, -1, 3)TypeError: all() takes exactly one argument (3 given)>>> all([0, -1, 3])False

Python内置函数all()要求提供一个参数,但我们一开始给了3个。后面,我们将三个参数作为一个整体列表提供就没有问题了。

return语句:

return语句用于表示函数执行到此结束,并且返回return后面的对象。有时候,函数不需要返回任何值,此时可以不需要return语句,它在后台默认给你返回个None,并且不给任何提示。但是更多的时候我们还是需要return一些东西。一旦函数执行过程遇到return语句,那么之后函数体内的所有代码都会被忽略,直接跳出函数体。那怕你现在正在一个循环内。

def func():    pass    return    # 此时,后面的代码其实是永远无法执行的。    # 但从语法和词法层面,这些没有错误。    print(1)    abs(-1)    pass

return可以返回什么?

  • 什么都不返回,仅仅return:return

  • 数字/字符串/任意数据类型:return 'hello'

  • 一个表达式:return 1+2

  • 一个判断语句:return 100 > 99

  • 一个变量:return a

  • 一个函数调用:return func()

  • 甚至是返回自己!:return self

  • 多个返回值,以逗号分隔:return a, 1+2, "hello"

简而言之,函数可以return几乎任意Python对象。

如何接收函数的返回值?

我们在调用函数的时候,可以将函数的返回值保存在变量中。

def func():    pass    return "something"result = func()

而对于同时返回多个值的函数,需要相应个数的变量来接收,变量之间以逗号分隔:

def func():    return 1, [2, 3], "haha"
a, b, c = func()

参数的传递

函数通常都有参数,用于将外部的实际数据传入函数内部进行处理。但是,在处理不同数据类型的参数时,会有不同的情况发生。这一切都是因为以下两点:

  1. Python的函数参数传递的是实际对象的内存地址。

  2. Python的数据类型分可变数据类型和不可变数据类型。

看下面的例子

a = 1def func(a):    print("在函数内部修改之前,变量a的内存地址为:%s" % id(a))    a = 2    print("在函数内部修改之后,变量a的内存地址为:%s" % id(a))    print("函数内部的a为:%s" % a)

print("调用函数之前,变量a的内存地址为:%s" % id(a))func(a)print("函数外部的a为:%s" % a)
打印结果为:
调用函数之前,变量a的内存地址为:1401140288在函数内部修改之前,变量a的内存地址为:1401140288在函数内部修改之后,变量a的内存地址为:1401140320函数内部的a为:2函数外部的a为:1

为什么当a = 2之后,函数内外的a的内存地址就不一样了呢?也就是说此后函数内外的a是两个不同的对象了。

这是因为,当作为参数,a被传入函数时,将数字对象1的地址传递给了函数内部的a。执行第一句内部代码时,此时内部的a和外面的a其实是一个东西,因此打印出了同样的内存地址。而当a=2被执行后,创建了一个新的内部变量a,并赋值2,将数字对象2的内存地址赋给变量a。

我们知道,首先,赋值语句具有创建新变量的功能,其次,函数由于存在作用域的概念(后面会介绍),在其内部的变量不受外部变量的影响,可以独立使用变量,相当于新的命名空间。因此,此时的a和外面的a没有一毛钱关系了,是两个不同的变量。同时,由于数字1和2是不可变的数字类型对象,是两个独立的,不同内存地址的对象,因此再次打印内存地址,当然就不一样了。

上面的解释可能不太好理解。其实,很多时候,我们被这种类似的问题困惑是因为函数参数的命名不恰当造成的。如果我们把上面的参数名改为b,可能就好理解多了(注意其中文字的变化)。执行结果是一样的。

a = 1
def func(b):    print("在函数内部修改之前,变量b的内存地址为:%s" % id(b))    b = 2    print("在函数内部修改之后,变量b的内存地址为:%s" % id(b))    print("函数内部的b为:%s" % b)

print("调用函数之前,变量a的内存地址为:%s" % id(a))func(a)print("函数外部的a为:%s" % a)
刚才说的是不可变类型参数,如果是可变类型的,比如列表呢?​​​​​​​
a = [1, 2, 3]
def func(b):    print("在函数内部修改之前,变量b的内存地址为:%s" % id(b))    b.append(4)    print("在函数内部修改之后,变量b的内存地址为:%s" % id(b))    print("函数内部的b为:%s" % b)

print("调用函数之前,变量a的内存地址为:%s" % id(a))func(a)print("函数外部的a为:%s" % a)
执行结果是:​​​​​​​
调用函数之前,变量a的内存地址为:34875720在函数内部修改之前,变量b的内存地址为:34875720在函数内部修改之后,变量b的内存地址为:34875720函数内部的b为:[1, 2, 3, 4]函数外部的a为:[1, 2, 3, 4]

调用函数时将列表对象a的地址传递给了函数内部的变量b。b.append(4)的时候,根据传进来的内存地址,找到[1,2,3]这个列表对象,在它的后面添加了4。

可以看出,此时的a和b实际指向了同一个对象。为什么会这样?因为最关键的b.append(4)这句代码,它不同于“=”赋值语句,不会创建新的变量,而列表作为可变类型,具有append方法,这个方法只是对列表的一种调用而已。因此,a和b实际还是同一个对象。

那么,如果用数字类型调用append方法,会是什么结果呢?很明显,这是不行的,因为数字类型没有append方法,不是Python官方不给它设计,而是因为数字类型是不可变类型,永远不能有append方法。

 关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

 三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、Python练习题

检查学习结果。

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

​​​​​​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值