函数的概述和定义
**函数:**组织好的、可重复使用的、用户实现单一或者关联功能的代码段。函数能够提高应用的模块性和代码的重复利用率。Python提供了很多内置的函数,比如len等等,另外也可以根据自己的业务需求进行用户自定义函数的创建。
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
函数定义和函数调用
def PName():
print(“222222”)
print(“3333333”)
PName()函数调用
函数参数
def PName(userName):
print("222222"+userName)
PName("222222233333333333")
函数参数的分类 必备参数
函数定义中允许拥有多个形参,因此函数在调用的时候,也可能包含多个实参。向函数传递参数的方式有很多,通过实参和形参的顺序对应,这就是位置实参。只有位置一致,才能被正确匹配。位置实参是最简单也最常用的关联方式。
def PName(userName,address):
print("222222"+userName+address)
PName("222222233333333333","香港")
输出:222222222222233333333333香港
函数参数的分类默认值
有默认值的形参,可以不用。
函数参数–不定长参数
不定长参数:第三个参数默认为元组,可以接受多个参数
def PName(userName,address,*abcd):
print(userName+address)
print(abcd)
PName("222222233333333333","香港",'a','f','c')
输出结果:
222222233333333333香港
(‘a’, ‘f’, ‘c’)
def PName(userName,address,*abcd,**addd):
print(userName+address)
print(abcd)
print(addd)#返回的字典
PName("222222233333333333","香港",'a','f','c',age=18)
222222233333333333香港
(‘a’, ‘f’, ‘c’)
{‘age’: 18}
可变对象与不可变对象值传递
def PN(str1):
str1='Hello'
print(str1)
str2='abn'
PN(str2)
print(str2)
不可变类型:如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变对象
可变类型:如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
def PN(str1):
str1[0]='Hello'
print(str1)
list01=['111','222','333']
PN(list01)
print(list01)
输出结果:
[‘Hello’, ‘222’, ‘333’]
[‘Hello’, ‘222’, ‘333’]
函数的返回值
函数并非总是将结果直接输出,相反,函数的调用者需要函数提供一些通过函数处理过后的一个或者一组数据,只有调用者拥有了这个数据,才能够做一些其他的操作。那么这个时候,就需要函数返回给调用者数据,这个就被称之为返回值,想要在函数中把结果返回给调用者,需要在函数中使用return。
return语句用于退出函数,选择性的向调用者返回一个表达式。直接return的语句返回None。
代码:
def max(x,y):
if x>y:
return x
else:
return y
num=max(1,2)
print(num)
输出结果:2
yield生成器,生成一个迭代器
迭代器:
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。。
迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组,集合对象都可用于创建迭代器:
生成器
使用了 yield 的函数被称为生成器。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次从当前位置继续运行。
注意:可以通过for循环或者手动调用 Xun(5) 的 next() 方法
代码:
def getNum(n):
i=0
while i<=n:
yield i
i+=1
a = getNum(5)
print(next(a))
print(next(a))
print(next(a))
输出结果:
0
1
2
send操作
def gen():
i=0
while i<5:
temp=yield i #不是赋值操作,
print(temp)
i+=1
a=gen()
print(next(a))
print(a.send('ddd'))
print(next(a))
print(a.send('ddd'))
输出:
0
ddd
1
None
2
ddd
3
变量的作用域
全局变量是声明在函数外部的变量,定义在函数外的拥有全局作用域
global关键字
要想在函数内部修改全局变量需要使用grobal关键字声明。
递归函数
递归函数:递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。(一句话,自己调用自己)
实验代码:
def main(n):
print('进入第%d层梦境'%n)
if n== 3:
print('到达潜意识区域,原来我最爱的人是你!开始醒来')
else:
main(n+1)
print("从第%d层梦中醒来"%n)
main(1)
输出:
进入第1层梦境
进入第2层梦境
进入第3层梦境
到达潜意识区域,原来我最爱的人是你!开始醒来
从第3层梦中醒来
从第2层梦中醒来
从第1层梦中醒来
匿名函数
匿名函数:定义函数的过程中,没有给定名称的函数就叫做匿名函数;Python中使用lambda表达式来创建匿名函数。
lambda 来创建匿名函数规则。
●lambda只是一个表达式,函数体比def简单很多。
●lambda的主体是一个表达式,而不是一个代码块,所以不能写太多的逻辑进去。
●lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
●lambda定义的函数的返回值就是表达式的返回值,不需要return语句块
●lambda表达式的主要应用场景就是赋值给变量、作为参数传入其它函数
带参数的lambda函数
s=lambda x:x*2
print(s(3))
s=lambda x,y:x*y
print(s(3,4))
三元运算符
s=lambda x,y:x if x>2 else y
print(s(3,4))
s=lambda x,y:x if x>2 else y
print(s(3,4))
输出3
高阶函数
list02 = [1,3,5,7,9]
list03 = [2,4,6,8,10]
new_list = map(lambda x,y:x*y,list02,list03)
print(list(new_list))
输出结果:
[{‘name’: ‘susan’, ‘age’: 19}, {‘name’: ‘jeo’, ‘age’: 18}, {‘name’: ‘tom’, ‘age’: 17}]
[2, 12, 30, 56, 90]
常用高阶函数reduce
from functools import reduce
list02 = [2,4,6,8,10]
new_list = reduce(lambda x,y:x+y, list02)
print(new_list)
输出结果:
30
案例一:格式化用户的英文名,要求首字母大小,其它字母小写
map()函数接收一个以及多个集合以及序列,会根据提供的函数对指定的序列做映射,然后返回一个新的map()对象。
title()方法是将首字母转成大写。
new_name = ['joe','susan','black','lili']
name=map(lambda x:x.title(),new_name)
print(list(name))
输出结果:
[‘Joe’, ‘Susan’, ‘Black’, ‘Lili’]
案例二:将用户英文名、年龄、性别三个集合的数据结合到一起,形成一个集合
users= map(lambda x,y,z:(x,y,z),name,age,sex)
new_users=list(users)
print(new_users)
[(‘joe’, 18, ‘m’), (‘susan’, 19, ‘w’), (‘black’, 20, ‘w’), (‘lili’, 21, ‘m’)]
案例三:过滤性别为男的用户
new_users=filter(lambda x:x[2]=='m',new_users)
print(list(new_users))
[(‘joe’, 18, ‘m’), (‘lili’, 21, ‘m’)]
案例四:求性别为男的用户的平均年龄
from functools import reduce
total_age=reduce(lambda x,y:x+y[1],new_users,0) #这个0是x的初始值。
print(total_age)
输出结果:78