Python--函数

一、函数概念

函数是实现模块化编制必不可少的,函数可以把相对独立的某个功能抽象出来,使之成为一个独立的实体。


二、函数定义

语法

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__)

在这里插入图片描述
这个例子中添加了参数sourcefilenamemode的注释来说明这些参数的作用,并且定义了返回值是个bool类型。想要获取函数注释可以使用__annotations__方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值