函数的定义:
定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
def 是固定的,不能变,必须是连续的def三个字母,不能分开
空格 为了将def关键字和函数名分开
函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能
括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用:就是 函数名() 要记得加上括号
函数的返回值:
函数的返回值可以是任意类型,如果有返回值,必须要有变量接收才会有效,当有多个返回值时,用多个变量接收,但是变量的数量要和等式右边元组元素数量相同
Python的函数返回多个值其实就是返回一个tuple
当用一个变量接收多个返回值的时候,实际上是先创建了一个元组,然后再返回的。变量就指向一个元组,如果用两个变量就相当于序列拆包
函数的返回值可以是一个变量,这个变量指向一个对象
函数体内部的语句在执行的时候,一旦遇到了return,函数就会执行完毕,并将结果返回。
函数体内可以不写返回值,如果函数定义时候没有写return,函数执行完毕也会返回结果,只是结果为None
return None 可以简写为 return def outer() def inner(): return 'haha'
inner()
outer() # 这里的outer()是没由返回值的,
# 要想在调用outer()获取inner返回值。
def outer():
def inner():
return 'haha'
return inner
注意:return和返回值之间要有空格,可以返回任意数据类型的值
实参与形参
参数还有分别:我们调用函数时传递的这个“hello world”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。定义函数时的s1,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。
传递多个:参数可以传递多个,多个参数之间用逗号分割。
位置参数:
1.按照位置传参
2.按照关键字传参
3.位置,关键字混合传参
默认参数:
1.将变化比较小的值设置成默认参数
2.默认参数是一个可变数据类型
命名空间和作用域:
命名空间的本质:存放名字与值的绑定关系
命名空间有三种:
1.全局命名空间
2.局部命名空间
3.内置命名空间
内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
命名空间加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
作用域:
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效
global 和nonlocal(python2中没有nonlocal,目的是为了替代global)
golbal:如果要在局部变量中修改全局变量,就需要在局部命名空间中对该全局变量进行声明。如果只是调用全局变量的话就不用声明,因为python中,局部命名空间内可以使用全 局变量空间和内置命名空间的变量。
a = 1
b = '不修改,只调用的话可以不用global声明'
def func():
global a
a = 10
print(a)
print(b)
func()
nonlocal
使用条件:
只能作用于内层函数的上一层函数,外部函数必须有nonlocal声明的变量,如果内部函数
内部函数声明nonlocal之前,不能再出现同名变量
nonlocal修改的是最近一层的作用空间中的变量,如果在上一层没有该变量,就会去上上一层去寻找,以此类推,如果都没有找到,就会不满足条件1,最终报错
作用:可以在内层函数中去更改上一层函数的变量(与global不同,global声明的是全部命名空间的变量)
闭包函数:
闭:内部的函数
包:外部的变量
闭包一个函数,但是这个函数必须是一个内部函数(函数内部定义的函数),而且包含了对外部作用域中变量(这个变量不包括全局变量)的引用
函数的嵌套:
嵌套调用
嵌套定义:定义在内部的函数无法直接在全局被调用
函数名的本质:
就是一个变量,保存了函数所在的内存地址
装饰器:
装饰器的形成:
import time
def func1():
print('in func1')
def timer(func):
def inner():
start = time.time()
func()
print(time.time() - start)
return inner
func1 = timer(func1)
func1()
装饰器语法糖:
import time
def timer(func):
def inner():
start = time.time()
func()
print(time.time() - start)
return inner
@timer#这就是所谓的语法糖
#==> func1 = timer(func1)
def func1():
print('in func1')
func1()
装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
带参数的装饰器:
def timer(func):
def inner(a):
start = time.time()
func(a)
print(time.time() - start)
return inner
@timer
def func1(a):
print(a)
func1(1)