Datawhale学习计划:python基础第六期-任务4

1. 函数关键字

1)关键字
关键字是python内置的,具有特殊意义的标识符,自定义标识符命名时不可与之重复。可通过以下代码查看python内置的关键字内容。
2)函数
函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用。
3)方法
方法和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的,表示针对这个对象要做的操作,使用时采用点方法。

参考:https://www.cnblogs.com/hyesc/p/7766015.html

2. 函数的定义

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数的简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

例如:定义一个求绝对值的函数:
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
若定义一个空函数,可用pass语句,用来作为占位符。

若返回多个函数值,例如:
返回一元二次方程:ax2 + bx + c = 0 的两个解。
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
参考:http://www.runoob.com/python/python-functions.html
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000

3. 函数参数

1)位置参数
例如计算x的n次方:
Datawhale学习计划:python基础第六期-任务4
其中,power(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。

运行结果如下:
Datawhale学习计划:python基础第六期-任务4

2) 默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值。
例如,由于我们经常计算x的平方,所以可以把power(x, n)函数中的参数默认值设定为2:
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
默认参数可以简化函数的调用。设置默认参数时,有两点要注意:

  • 必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面)
  • 如何设置默认参数。当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

3)可变参数
可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。例如,给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……:
Datawhale学习计划:python基础第六期-任务4
定义可变参数仅仅在参数前面加了一个*号。调用该函数时,可以传入任意个参数,包括0个参数。

3)关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
例如,做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选填内容:Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
4)命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查。

如果要限制关键字参数的名字,就可以用命名关键字参数,例如,person()函数只接收city和job作为关键字参数。这种方式定义的函数如下:
Datawhale学习计划:python基础第六期-任务4
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
Datawhale学习计划:python基础第六期-任务4
参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000

5)作用域
在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。
a) L(local)局部作用域
局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

b) E(enclosing)嵌套作用域
E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。

c) G(global)全局作用域
即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
注意:全局作用域的作用范围仅限于单个模块文件内

d) B(built-in)内置作用域
系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。

其中两种最基本的变量作用域:全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
例如:
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
参考:https://www.cnblogs.com/fireporsche/p/7813961.html
http://www.runoob.com/python/python-functions.html

5.函数返回值

函数需要先定义后调用,函数体中 return 语句的结果就是返回值。如果一个函数没有 reutrn 语句,其实它有一个隐含的 return 语句,返回值是 None,类型也是 ‘NoneType’。
return 语句的作用:结束函数调用、返回值
隐含 return None 举例:
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
如果函数执行了 return 语句,函数会立刻返回,结束调用,return 之后的其它语句都不会被执行了。例如:
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
无论定义的是返回什么类型,return 只能返回单值,但值可以存在多个元素。return [1,3,5] 是指返回一个列表,是一个列表对象,1,3,5 分别是这个列表的元素。return 1,3,5 看似返回多个值,隐式地被Python封装成了一个元祖返回。
例如:
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
例如:
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4
函数有可见范围(内外可见关系),内部函数不能被外部直接调用,会抛异常 NameError。
Datawhale学习计划:python基础第六期-任务4
运行结果如下:
Datawhale学习计划:python基础第六期-任务4