定义函数:
def 函数名(参数列表):
函数体
函数返回值:如果函数体中有return,则函数有返回值。可以不return。
有函数名的函数
无参函数
含参列表为空。
打印’’’
def print_hello():
print("Hello World!")
print_hello()
---------------------
运行结果
Hello World!
带参函数
不可变参数列表
- 无默认值
在调用函数的时候必须传入对应的值,否则报错。
def add(a,b):
print(a+b)
add(1,2)
---------------------
运行结果
3
- 有默认值
在调用函数的过程中可以只传入不含默认值的列表参数。
1> def f1(a,b,c=1),那么当调用函数f1(3,2),表示a=3,b=2,c=1
2> def f1(a,b,c=1),那么当调用函数f1(3,2,5),表示a=3,b=2,c=5
注:一般把带默认值的参数放在最后面。
def add(a,b,c=6):
print(sum([a,b,c]))
add(1,2,10)
---------------------
运行结果
13
不定长位置参数
可以接收任意数量的参数
def func(*list):
return sum(list)
print(func(5, 6, 8))
---------------------
运行结果
19
不定长关键字参数
当不知道传递给函数什么信息的时候,需要将函数编写成能够接受任意数量的键值对。
def print_score(**stu_score):
print(stu_score)
print_score(chinese=90, math=80, english=100)
运行结果
{'chinese': 90, 'math': 80, 'english': 100}
形参类型声明
在Python3.5以后可以显式的声明参数的类型,例如:
def statistic_info(name: str, age: int = 18, *books, **scores) -> None:
print("姓名", name)
print("年龄", age)
print("图书", books)
print("成绩", scores)
statistic_info("韩梅梅", 19, "水浒传", "西游记", "红楼梦", chinese=90, math=80, english=100)
#标记age为int类型,但是不强制要求。当age为字符串"19"也可以执行
---------------------
运行结果
姓名 韩梅梅
年龄 19
图书 ('水浒传', '西游记', '红楼梦')
成绩 {'chinese': 90, 'math': 80, 'english': 100}
匿名函数lambda
在编程的过程中,需要重复使用的函数一般会使用def 命名函数,但有时候我们不必要使用函数的名字,也就是说这个函数是一次性的,此时我们可以用lambda来创建匿名函数。
优点:使用lambda创建匿名函数不需要函数名,并且没有return语句,使得匿名函数更加简洁,更加高效。(可以预定义函数一起使用)
- 语法:
lambda 参数列表:简单函数体(仅一个表达式,不含条件判断和循环)
- 示例
- lambda基本使用方式
#一般函数
def my_func(x):
return x * x
print(my_func(3))
#Lambda函数
lam = lambda x,y: x*y
print(lam(3,7))
---------------------
运行结果
9
21
- lambda与预定义函数结合
- lambda+map
map():将给定的列表的值依次在所定义的函数关系中迭代并返回一个新列表 - lambda+filter
filter():根据一定的条件对给定的列表进行过滤 - lambda+reduce
reduce():对参数序列中元素进行累积
from functools import reduce
mylist=[1,3,5,10,10,11,24,55,55]
#剔除偶数
fil=filter(lambda x:x%2==1,mylist)
print(list(fil))
#累积和
red=reduce(lambda x,y:x+y,mylist)
print(red)
#翻倍
ma=map(lambda x:2*x,mylist)
print(list(ma))
---------------------
运行结果
[1, 3, 5, 11, 55, 55]
174
[2, 6, 10, 20, 20, 22, 48, 110, 110]
高阶函数
在上一个章节中已经可以感受到高阶函数的用法
- filter():返回迭代器
function中只允许一个值。
filter(function(),list)
- map():返回迭代器
map(function(),list)
- reduce():返回一个数
reduce(function(),list)
函数返回值
- 无返回值
def Hello():
print("Hello")
Hello()
---------------------
运行结果
Hello
- 单个返回值
def Hello():
return "Hello"
str = Hello()
print(str)
---------------------
运行结果
Hello
- 多个返回值
def Hello():
name="Bob"
str="Hello"
return name,str
name,str=Hello()
print(name+":"+str)
---------------------
运行结果
Bob:Hello
变量
- 全局变量的获取
函数都可以直接获取全局变量
a=3
def f1():
print("f1():"+str(a))
def f2():
print("f2():"+str(a))
f1()
f2()
---------------------
运行结果
f1():3
f2():3
- 全局变量的修改
- (失败)直接在f1()中修改是不行的,这时候相当于创建了一个局部变量a并且赋值为300,此时f1()调用的a都是局部变量。
a=3
def f1():
a=300
print("f1():"+str(a))
def f2():
print("f2():"+str(a))
f1()
f2()
---------------------
运行结果
f1():300
f2():3
- (成功)global 先声明a是使用的全局变量的a,此时修改a的值,其他函数获取的a则为修改后的a
a=3
def f1():
global a
a=300
print("f1():"+str(a))
def f2():
print("f2():"+str(a))
f1()
f2()
---------------------
运行结果
f1():300
f2():300