函数
1、什么是函数?
在程序中,函数就是具备某一功能的工具。
事先将工具准备好即函数的定义。
遇到应用场景拿来就用即函数的调用。
2、为什么要用函数?
不用函数的问题是:
1、程序代码冗长
2、程序的可扩展性差
3、程序的可读性差
3、如何用函数?
函数的定义语法:
没有事先定义函数,而直接引用函数名,就相当于在引用一个不存在的变量名。
函数定义阶段不执行函数体代码,但是会检测函数体的语法。
定义函数的三种形式:
无参函数:在函数定义阶段括号内没有参数。
有参函数:在函数定义时括号内有参数的称之为有参函数。
形参和实参:
形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参。本质就是变量名,等待外部给它传值。
实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参。本质就是变量的值,函数调用时生效。
位置形参:在函数定义阶段,按照从左往右的顺序依次定义的形参,称之为位置形参。
特点:但凡是按照位置定义的形参,都必须被传值,多一个不行,少一个也不行。
位置实参:在函数调用阶段,按照从左往右的顺序依定义的实参,称之为位置实参。
特点:按照位置为对应的形参依次传值。
关键字实参:在调用函数时,按照key=value的形式为指定的参数传值,称之为关键字实参。
特点:可以打破位置的限制,但仍然能为指定的形参赋值。
注意:
- 可以混用位置实参和关键字实参,但位置实参必须放在关键字实参的前面。
- 可以混用,但不能对一个形参重复赋值。
默认形参:在函数定义阶段,就已经为形参赋值。一般情况下这个值在大部分情况下都是一样的,可以把这个值定义为默认形参。
特点:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值。
参数总结:
默认形参必须放到位置形参的后面。
默认形参的值只在定义阶段赋值一次,即默认参数的值在函数定义阶段就已经固定死了。
默认参数的值通常应该定义不可变类型(整型,浮点型,字符串,元组)。
实参的应用取决于习惯。
形参的使用,在大多数情况下的调用值都一样,就应该将这个值定义为默认形参。
空函数:函数体代码只写一个pass占位符。
# 空函数 def func2(): pass
函数的调用:
函数调用阶段,执行函数体代码。
函数调用的三种形式:
- 函数名(),有参传参数集即可。
- 表达式形式。
- 把函数的调用当做一个参数传给另一个函数。
# 调用函数:函数名(),会执行函数体代码,直到碰到return结束或者一直运行完毕所有的代码。 def max2(x,y): if x > y: return x else: return y # 函数名() max2(100,180) #表达式形式。 res1 = max2(100,180) * 8 #把函数的调用当做一个参数传给另一个函数。 # res2 = max2(100,180) # max2(res2,300) max2(max2(100,180),300)
可变长参数:指的是在调用函数时,传入的参数个数可以不固定。
4、函数的返回值
什么是返回值?
为什么要有返回值?
def max2(x,y): #x = 2000 y = 2700 if x > y: return x #return 2000 else: return y #return 2700 # 赋值给一个变量 res = max2(2000,2700) # 如果需要在程序中拿到函数的处理结果做进一步处理,则需要函数必须要有返回值。 annual_salary = res * 12 print(annual_salary)
如何用函数的返回值?
# return 任意类型的数据类型。 # 1、返回值是函数的处理结果,值可以是任意的数据类型。 # 2、return是函数终止的标志。函数内可以有多个return,但只要执行一次,整个函数都会结束执行。 # 3、return的返回值无个数限制,返回1个(返回的值即值本身),返回0个(返回的值是None,不写return默认返回None),返回多个要用逗号分隔开(返回的值是元组类型)。 def check_name(): while True: name = input("请输入要注册的账户名:").strip() if name.isalpha(): return name else: print("用户名必须由字母组成!请重新输入!") # u_name = check_name() # print(u_name) # 请输入要注册的账户名:zrg # zrg # 比较大小 # def max2(x,y): # if x > y: # print(x) # else: # print(y) def max2(x,y): #x = 2000 y = 2700 if x > y: return x #return 2000 else: return y #return 2700 # 赋值给一个变量 res = max2(2000,2700) # 如果需要在程序中拿到函数的处理结果做进一步处理,则需要函数必须要有返回值。 annual_salary = res * 12 print(annual_salary)
函数的高级知识
一、函数对象
函数是第一类对象,其含义是函数可以被当做数据处理。
定义一个函数发生的事
- 开辟一个内存空间
- 把函数体代码放进去
- 然后把内存地址赋值给函数名
# 定义一个函数发生的事: def func(): # <function func at 0x102567f40> print('from func') # print(func) # <function func at 0x102567f40>
a. 被引用
b. 当做参数传给一个函数
c. 当做函数的返回值
d. 可以当做容器类型的元素
# a.引用 # f = func # f() # from func # b.当做参数传给一个函数 # def foo(x): # print(x) # x() # foo(func) # <function func at 0x100d13f40> # from func # c.当做函数的返回值 def foo(x): return x # res = foo(func) # print(res) # res() # <function func at 0x103027f40> # from func # d.可以当做容器类型的元素 l = [func] print(l) l[0]() # [<function func at 0x1024abf40>] # from func
二、函数嵌套
1、函数的嵌套定义
2、函数的嵌套调用
三、名称空间与作用域
1、名称空间 namespaces
存放名字与值的绑定关系的地方。
内置名称空间:
作用:存放Python解释器自带的名字。
生命周期:在解释器启动时生效,在解释器关闭时失效。
全局名称空间:
作用:除了内置和局部的名字外,其余的都是全局的名字。
生命周期:在文件执行时生效,在文件执行完毕后失效。
局部名称空间:函数内定义的名字。函数调用时才临时生效一次,函数调用完了之后就释放掉了。
作用:用于存放函数调用期间函数体产生的名字。
生命周期:在文件执行过程,如果调用了某个函数才会临时生效,在函数执行完毕后失效。
作用域
域指的是区域、范围,作用域即作用范围。
张仁国