一、函数概念
函数是实现模块化编制必不可少的,函数可以把相对独立的某个功能抽象出来,使之成为一个独立的实体。
二、函数定义
语法:
def function_name(arg1, arg2):
function_body
return value
函数名(function_name):和Python中其它的标识符命名规则相同,有效的函数名由字母、数字和下划线组成,并且不能以数字开头,函数名应该能够反映函数所执行的任务;- 函数名大小写敏感,自动字母相同但是大小写不同的函数视为两个不同的函数;
函数参数(arg1, arg2):调用一个函数时可以传递的参数,参数可以是一个或多个,也可以没有;函数内容(function_body):任何有效的代码都可以出现在函数内部,函数内容相对于定义函数的def行需要缩进四个空格;函数返回值(return value):函数执行完成后返回的值,也可以不返回任何内容,不返回内容可视为返回“None”;
三、函数参数
在创建函数时,可以设置参数,也可以不设置参数。对于设置参数的函数,当调用函数时需要向函数传递参数,被传入的参数称为实参,而函数定义时的参数为形参。
3.1、必须参数
必须参数:函数定义的参数在调用时必须传入,例如:
# 函数定义
def add(a,b):
print("a+b= ",a+b)
# 函数调用
add(1,2)
- 少传入必须参数和多传入必须参数,解释器都会报错;
- 在调用的时候
数量和顺序必须和定义函数时的参数保持一致;
3.2、关键字参数
- 关键字参数可以不按函数定义时的参数顺序来调用函数;
- 但是不能传入没有定义的参数;
# 函数定义
def hello(name, age):
print("姓名:", name)
print("年龄:", age)
# 按顺序传递参数
hello(name="王大力", age=18)
# 不按顺序传递参数
hello(age=18, name="王大力")
# 错误,传入未定义参数 sex
hello(name="小明", sex="Male")
3.3、默认参数
在定义函数时可以给参数添加默认值,如果调用函数时没有传入参数,函数就会使用默认值,并且不会像必须参数那样报错,例如:
# 定义函数
def default_value(name, age=18):
print("我的名字是:", name)
print("我今年:", age, "岁")
# 错误 默认参数必须放最后,且其后不能再跟必须参数
def default_value(age=18, name)
def default_value(name, age=18, sex)
# 调用函数
default_value("王大力")
# 输入
# 我的名字是:王大力
# 我今年:18岁
注意:默认参数必须定义在最后,而且在默认参数后又定义必须参数会报错
3.4、可变参数
在某些情况下,我们不能在定义函数的时候就确定参数的数量和内容,这时候就可以使用可变参数。
语法:
def function_name(*args, **kwargs):
# *args 和 **kwargs 为可变参数
# *args 参数获取到的是一个元组
# **kwargs 参数获取到的是一个字典
function_body
代码示例:
# 函数定义
def calculate_sum(*args, **kwargs):
s = 0
for i in args:
s += i
print("输入的数字之和是:", s)
for k,v in kwargs.items():
print(k, v)
# 函数调用方式1
calculate(1,2,3,4,5,姓名="小明")
# 函数调用方式2
l = [1,2,3,4]
d = {
name:"小明",
sex:"Male"
}
calculate(*l, **d)
四、变量作用域
4.1、全局变量
在函数外赋值的变量就是全局变量,全局变量可以在整个程序范围内被访问,例如:
x = "Hello"
def foo():
print(x)
foo()
如果存在同名的全局变量和局部变量,修改局部变量的值不会影响全局变量的值。如果想对函树数体外的变量进行修改,可以使用关键字global,例如:
x = "函数体外"
def foo():
global x
x = "函数体内"
print(x)
foo()
print(x)
# 输出
# 函数体内
# 函数体内
4.2、局部变量
在函数内赋值的变量,不做特殊声明就是局部变量,局部变量只在当前函数内可以访问,在函数外无法访问,例如:
# 函数定义
def foo():
x="hello"
print(x)
foo()
print(x)
# 输出
# hello
# NameError: name 'x' is not defined
五、函数返回值
如果想要获取函数中的局部变量,可使用关键字return返回,例如:
def foo():
x = "局部变量"
return x
result = foo()
print(result)
- 如果不写return,或虽然写了return但是不返回值,两者都会获得“None”;
- Python可以返回不止一个值,返回多个值时返回的是一个元组;
def foo():
r1="第一个返回值"
r2="第二个返回值"
r3="第三个返回值"
return r1,r2,r3
x = foo()
print(x)
x1,x2,x3=foo()
print(x1)
print(x2)
print(x3)
# 输出
# ("第一个返回值", "第二个返回值", "第三个返回值")
# "第一个返回值"
# "第二个返回值"
# "第三个返回值"
六、Lambda表达式
Lambda表达式也称作匿名函数,通常在需要一个函数、但又不想费神去命名它的时候,就可以使用匿名函数。
语法:
# 正常函数
def add(x, y):
return x+y
# 匿名函数
lambda x,y : x+y
# 调用匿名函数
f = lambda x,y : x+y
z=f(1,2)
print(z)
- 以
lambda开头,表明这是个lambda表达式; :(冒号)将表达式一分为二,左边是参数,右边是返回值;
什么时候适合使用lambda表达式?
(1)、程序只执行一次,不需要定义函数名,使用lambda表达式方便定义,并且节省了内存中变量的定义;
(2)、在某些函数中必须以函数作为参数(回调函数),但是函数本身十分简单而且只在一处使用;
l1 = [1,2,3,4,5,6,7,8]
l2 = [item for item in filter(lambda x : x>5, l1)]
print(l2)
# 输出
# [6,7,8]
filter为Python的内置函数,用于过滤序列,即过滤掉不符合条件的元素。filter函数的第一个参数需要传入另一个函数,传入的函数用来作为筛选条件,满足条件的返回true,否则返回false。
七、文档字符串
在使用关键字def定义一个函数时,其后必须跟有函数名和包括形式参数的圆括号。从函数体的下一行开始,必须要缩进。
函数的第一行可以是字符串,这个字符串就是文档字符串,例如:
def add(x, y):
"""
Functions
----------------
返回函数x和y的两数之和
Parameters
----------------
第一个参数 x: int
第二个参数 y: int
Returns
----------------
返回int: x+y
"""
return x+y
print(add(1,2))
print(add.__doc__)

文档字符串可以使用__doc__(注意双下划线)获取,也可以使用help(),它所做的只是抓取函数的__doc__属性,然后整洁地展示给你。
八、函数注释
函数注释是一个可选功能,它允许在函数参数和返回值中添加任意的元数据。
语法:
def function_name(a: expression, b: expression)->expression:
function_body
return value
程序示例:
def compile(source: "something compilable",
filename: "where the compilable thing comes from",
mode: "is this a signal statement or a suite?")->bool:
return ture
print(compile.__annotations__)

这个例子中添加了参数source、filename、mode的注释来说明这些参数的作用,并且定义了返回值是个bool类型。想要获取函数注释可以使用__annotations__方法。
1211

被折叠的 条评论
为什么被折叠?



