python基础学习系列之函数(保姆式教程)

举报
yk 坤帝 发表于 2022/01/12 23:40:33 2022/01/12
【摘要】 个人公众号:yk 坤帝 后台回复 基础学习系列 获取完整源代码 1. 定义函数 2. 函数调用 3. 参数传递 4. 参数分类 5. 匿名函数 6. return语句 7. 变量作...

个人公众号:yk 坤帝
后台回复 基础学习系列 获取完整源代码

1. 定义函数

2. 函数调用

3. 参数传递

4. 参数分类

5. 匿名函数

6. return语句

7. 变量作用域

1. 定义函数

函数是预先设计好的,可重复使用的,能够实现单一或多种功能的综合代码段。使用了函数的Python代码,模块性较强,代码的重复利用率较高。目前为止我们可能或多或少的也使用过Python自带的函数,比如print()等等。

当然,除了使用Python提供的函数以外,用户也可以自己定义,但是首先要知道的是,定义函数有如下的几点规则:

首先,定义函数的标志关键字就是def,在它之后应该紧接着用户想要设计的函数名称。

其次,用户想要传入的参数用圆括号括起放在函数名后,并且在圆括号结束的位置之后加上冒号作为函数内容的开始。

同时,当开始定义函数内容时,要时刻保持缩进的使用是正确的。

最后,使用return语句表示函数结束时返回给调用者的值,不带return则相当于返回None。

示例的结构如下:

					def 函数名(参数列表):
						函数执行语句段……
						return [表达式]

  
 
  • 1
  • 2
  • 3

2. 函数调用

当使用如上的规则定义了一个函数,指定了函数名称、传递的参数以及代码块内容后,需要通过另外的语句调用函数,才能使这个函数在适当的时间与位置执行相应的功能。函数的调用可以嵌套在任何用户设定的位置里,如另外的函数中,命令行中等等。下面举例子说明函数的定义与调用过程。

【例 3-53】

程序3-7  函数的定义与调用实例
def printstr(string):
    print(string)

printstr("函数的定义与调用!")
输出结果
函数的定义与调用!

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3. 参数传递

Python的变量是没有特定类型的,定义的函数参数列表中的变量类型则取决于参数传递时所赋值的类型。同时根据函数传递的参数是否可以修改,将他们分成不可变类型与可变类型。

不可变类型参数传递本质上就是传值,常用的有数字、字符串等等,当使用传值时,即使在函数内部对这些参数进行修改,它们的变化也不会影响到函数外的值。因为当它们被传入函数后,相当于生成了另外一个复制的对象,使得函数内部语句在复制对象上操作。

可变类型参数传递本质上是传引用。传引用传入的是变量的地址,而当函数内部得到变量的地址后,再进行的操作相当于对原变量进行的修改,修改后函数外部的变量也会受到影响。

【例 3-54】

程序3-8  传不可变对象的应用实例
def ChangeInt(a):
    a = 10

b = 3
ChangeInt(b)
print(b)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
def ChangeInt(a):
    a = 10

b = 3
ChangeInt(b)
print(b)
输出结果
3

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
【例 3-55】

  
 
  • 1

程序3-9 传可变对象的应用实例

def ChangeList(mylist):
   "修改传入的列表"
   mylist.append([1,2,3,4])
   print("函数内取值: ", mylist)

mylist = [10,20,30]
print("更改前取值: ", mylist)
ChangeList(mylist)
print("更改后取值: ", mylist)
输出结果
更改前取值:  [10, 20, 30]
函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
更改后取值:  [10, 20, 30, [1, 2, 3, 4]]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4. 参数分类

除了从参数的可变与不可变进行分类外,还可以将参数分为必备参数、关键字参数、默认参数等。下面会对这三类参数进行详细的说明。
所谓必备参数指的是在函数最初定义时就设置好的参数,在函数调用阶段必须按照正确的顺序传入,数量也应该与声明时保持一致,不然会导致语法错误。

【例 3-56】

程序3-10 必备参数传递的应用实例

def printme(str1,str2):
   "打印任何传入的字符串"
   print("string1:",str1)
   print("string2:",str2)
 
#调用printme函数
string1 = "Hello "
string2 = "World!"
printme(string1,string2)
printme(string2,string1)
printme()
输出结果
string1: Hello 
string2: World!
string1: World!
string2: Hello

TypeError: printme() missing 2 required positional arguments: 'str1' and 'str2'

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

关键字参数指的是在传递参数时使用关键字标明对应的参数,使用关键字参数声明后,

允许函数调用时顺序与声明不一致,因为通过参数名也能够很好的进行参数值匹配。

【例 3-57】

程序3-11  关键字参数传递的应用实例
def printme(str1,str2):
   "打印任何传入的字符串"
   print("string1:",str1)
   print("string2:",str2)
 
string1 = "Hello "
string2 = "World!"
printme(string2,string1)
printme(str2 = string2,str1 = string1)
输出结果
string1: World!
string2: Hello 
string1: Hello 
string2: World!

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

默认参数在定义的时候也是必须声明的,它通过在定义阶段设置某个值,以便在调用时不被传入,方便使用默认值。同时,默认参数也可以在调用时传入,这时就用新传入的参数值替换默认值。

【例 3-58】

程序3-12  默认参数传递的应用实例
def printme(str1 = "oh ", str2 = "hello ", str3 ="world"):
   "打印任何传入的字符串"
   print("string1:",str1)
   print("string2:",str2)
   print("string3:",str3)
 
string2 = "Hello "
string3 = "World"
printme(str2 = string2, str3 = string3)
输出结果
string1: oh 
string2: Hello 
string3: World

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

5. 匿名函数

匿名函数是Python中比较有特色的定义函数方式,它通常只包含一个语句,主体是一个表达式,与前面所讲的定义函数方式比要简单很多。
匿名函数通过lambda 来定义,他有专属于自己的参数空间,它的参数与全局参数和其他参数是不共享的。具体的定义方式如下:
lambda [arg1 [,arg2,…argn]]:expression
【例 3-59】

程序3-13  匿名函数的应用实例

sum = lambda arg1, arg2: arg1 + arg2;

print("相加后的值为 : ", sum( 10, 20 ))
print("相加后的值为 : ", sum( 20, 20 ))
sum = lambda arg1, arg2: arg1 + arg2;

print("相加后的值为 : ", sum( 10, 20 ))
print("相加后的值为 : ", sum( 20, 20 ))
输出结果
相加后的值为 :  30
相加后的值为 :  40

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

6. return语句

利用return语句表示函数结束时的退出,return后通常设计一个表达式,表达式的结果表示向调用方返回的内容,不带return语句的结束表示返回为None。

【例 3-60】

  
 
  • 1
程序3-14  return语句的应用实例
def sum(arg1, arg2):

   total = arg1 + arg2
   print("相加后的值 : ", total)
   return total;

total = sum(10, 20)
print("返回的值 :",total)
输出结果
相加后的值 :  30
返回的值 : 30

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

7. 变量作用域

变量定义后,有一定的有效范围,并不是任意一个位置都可以访问,我们把控制函数内变量的访问范围的机制成为变量作用域,它规定了在何时可以访问哪一个特定的变量。

变量作用域分为全局作用域和局部作用域:在某一局部位置定义的变量拥有局部作用域,比如函数内容定义的变量,这些变量又被称为局部变量,他们只能在被声明的函数内部程序使用;在全局位置定义的变量拥有全局作用域,比如在函数外代码开始处定义的变量,这些变量被称为全局变量,可以在整个程序范围内被访问和使用。

另外,需要注意的是,global关键字可以将局部变量变成一个全局变量,而nonlocal关键字可以修改外层变量,并且nonlocal关键字只能作用域局部变量,且始终找离当前最近的上层局部作用域中的变量。
下面通过例子来说明局部变量以及全局变量的使用情况:

【例 3-61】

  
 
  • 1
程序3-15 变量作用域的应用实例

#说明局部变量与全局变量
total = 0
def sum(arg1,arg2):
   total = arg1 + arg2
   print("函数内是局部变量 : ", total)
   return total

sum(10,20)
print ("函数外是全局变量 : ", total)
total = sum(10,20)
print ("函数外是全局变量 : ", total)


#说明global的使用
a = 10
b = 5
def func():
    global a     #变成了全局变量
    a = 20       #修改全局变量的值
    b = 50       #没法修改全局b,只能定义一个新的局部变量b
func()
print(a)
print(b)


#说明nonlocal关键字的使用

a = 1
def outer(): 
    a = 2
    def inner():
        nonlocal a
        a = 3
        def inner2():
            print(a)
        inner2()
        print(a)
    inner()
    print(a)
outer()
print(a)
 
输出结果
##运行结果1
函数内是局部变量 :  30
函数外是全局变量 :  0
函数内是局部变量 :  30
函数外是全局变量 :  30

##运行结果2
20
5

##运行结果3
3
3
3
1

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

个人公众号:yk 坤帝
后台回复 基础学习系列 获取完整源代码

文章来源: blog.csdn.net,作者:yk 坤帝,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_45803923/article/details/122441242

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。