函数
函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一功能或者功能片段的代码块,简单来说就是由一系列的程序语句组成的程序段落。
函数存在的意义:
- 提高代码的复用性
- 将复杂的逻辑简单化,分功能化
函数名字最好能直接表示该函数的功能,多个单词之间用_链接。
<def> <函数名>([参数列表])<:>
# 待执行语句
# 如果需要显式返回 <return 标识符> 或 <return>
简单实例
def func():
print("Hello world!")
print("程序正常执行")
函数只有被调用了才会执行。
# 调用函数 函数名 + ()
func()
# output
func()
Hello world!
# 函数先调用后定义
# 抛出异常 SyntaxError: invalid syntax
# func()
程序运行的时候先把函数内的代码加载到内存中,有调用的地方直接执行,先调用的时候程序还没有读取函数到内存中,所以抛出异常。
print(func)
<function func at 0x000000000AA4C510>
# 直接打印函数对应的内存地址
函数的返回值
函数可以返回任何类型的数据,函数内执行到return后结束,后面代码不再执行。
# 定义函数
def func():
res = 1 + 1
print('我执行了!')
return res
print('我不会执行!')
print('程序正常执行')
func()
# output
程序正常执行
我执行了!
Out[5]: 2
想要拿到函数return的值需要重新找个变量接收。
res = func()
我执行了!
print(res)
2
不写return默认返回None。
def func():
res = 1 + 1
print('我执行了!')
res = func()
print(res)
# output
我执行了!
None
多个返回值,需要多个变量接收。
def func():
return 1,2,3
a,b,c = func()
print(a,b,c)
# output
1 2 3
一个变量也可以接收一个元组。
def func():
return 1,2,3
res = func()
print(res)
# output
(1, 2, 3)
函数的参数
计算两个数字之和。
def sum_of_two():
res = 3 + 4
return res
print(sum_of_two())
# output
7
默认按位置传递参数,一一对应。
def sum_of_two(num1, num2):
res = num1 + num2
return res
print(sum_of_two(5, 6))
# output
11
关键字传参,参数名对应。
def sum_of_two(num1, num2):
print(num1, num2)
res = num1 + num2
return res
print(sum_of_two(num2 = 5, num1 = 6))
# output
6 5
11
混合使用,先位置参数再关键字参数。
def sum_of_two(num1, num2, num3):
print(num1, num2, num3)
res = num1 + num2 + num3
return res
print(sum_of_two(3, num3 = 1, num2 = 2))
# output
3 2 1
6
默认值,不传递参数就用默认值,传递了就用传递的值。
def sum_of_two(num1 = 1, num2 = 2):
print(num1, num2)
res = num1 + num2
return res
print(sum_of_two())
print(sum_of_two(5, 10))
# output
1 2
3
5 10
15
混合使用时,先按位置传递参数,后按关键字传递参数,最后是默认值。
###### 错误写法 ######
def sum_of_two(num1 = 1, num2, num3): # 默认值只能放最后
print(num1, num2, num3)
res = num1 + num2 + num3
return res
# output
SyntaxError: non-default argument follows default argument
# 编译语法错误
###### 错误写法 ######
def sum_of_two(num1, num2, num3 = 3):
print(num1, num2, num3)
res = num1 + num2 + num3
return res
print(sum_of_two(num2 = 2, 3)) # 先位置,后关键字
# output
SyntaxError: positional argument follows keyword argument
print(sum_of_two(1, num1 = 2)) # 不允许给同一个参数传递2个值
# output
TypeError: sum_of_two() got multiple values for argument 'num1'
可变参数(多个不确定的参数)
- *列表
- **字典
通常都是: *args、**kwargs
# 传递列表
def sum_of_two(*args):
res = 0
for i in args:
res += i
return res
# 任意个 0个也可以
print(sum_of_two())
# output
0
print(sum_of_two(1,2,3,4,5))
# output
15
# 已有列表
list_001 = [1,2,3,4,5]
print(sum_of_two(*list_001))
# output
15
# 列表会自动解释为多个参数
# 传递字典
def func(**kwargs):
return kwargs
print(func()) # {}
print(func(name = 'Hider', age = 30)) # {'name': 'Hider', 'age': 30}
print(func(**{'name': 'Hider', 'age': 30})) # {'name': 'Hider', 'age': 30}
总体结合来看。
def func(x,y,z,*args,**kwargs):
print(x)
print(y)
print(z)
print(args)
print(kwargs)
func(1,2,3,4,5,6,a=11,b=22)
# output
1
2
3
(4, 5, 6)
{'a': 11, 'b': 22}
- 可变类型参数的传递,列表中第1个值被函数修改。
可以实现实参传递给形参,形参发生改变,实参跟着发生改变。
def func(li):
li[0] = 666
li = [1,2,3,4,5]
func(li)
print(li)
# output
[666, 2, 3, 4, 5]
- 不可改变类型的传递
def func(str1):
str1 = 'aaa'
print('函数内:', str1)
str1 = 'hello'
func(str1)
print(str1)
# output
函数内: aaa
hello
- 全局变量和局部变量
局部可以使用全局变量,局部变量是在函数内部声明并使用的数据变量,随函数的启动而出生,随函数的退出而消亡,作用域只在函数内。
# 局部可以使用全局变量
temp = 'hello'
def func():
print(temp)
func() # hello
# 全局不能使用局部变量
def func():
temp = 'hello'
print(temp)
func() # hello
print(temp) # NameError: name 'temp' is not defined
# 结合应用
temp = '你好'
def func():
temp = 'hello'
print(temp)
print(temp)
# output
你好
temp = '你好'
def func():
temp = 'hello'
print(temp)
func()
print(temp)
# output
hello
你好
num = 1
def set_num(in_num):
num = in_num
print(num)
pass
set_num(11)
print(num)
# output
11
1
声明使用全局变量(global)
num = 1
def set_num(in_num):
global num
num = in_num
pass
set_num = 11
print(num)
# output
1
全局变量,局部变量重名,仍需要用全局变量。
num = 11
def func():
num = 22
print(num)
print(globals()['num'])
# output
func()
22
11
参考链接:Python中的基本函数及其常用用法简析